馬名からのhorseID検索、raceID検索、レース名検索を全てMySQLで実行しました。
結果出力までたった1秒の高速処理でかなり快適です。
CSVファイルは開けたときの見栄えが今ひとつなのでHTML化も考えています。
import mysql.connector,glob,csv,re,datetime,sys
config = {
'user': 'root',
'password': 'root',
'host': 'localhost',
'port': 3306,
'raise_on_warnings': True
}
print('検索したい馬名を入力してください')
name = input()
conn = mysql.connector.connect(**config)
cur = conn.cursor()
horseID_l = list()
for y in range(1986,2019 +1):
table = f'horse{y}'
try:
cur.execute(f'SELECT horseID FROM horse_list.{table} WHERE 検索馬名 = "{name}"')
finally:
result = cur.fetchall()
if result != []:
horseID_l.append(result)
print(horseID_l)
if len(horseID_l) >= 2:
print('該当する馬が複数います。番号を入力してください。')
for i,data in enumerate(horseID_l):
print(f'{i+1} {data}')
num = input()
id = str(horseID_l[int(num)-1][0]).replace('(','').replace(')','').replace(',','')
elif len(horseID_l) == 0:
print('該当する馬はいません')
sys.exit()
else:
id = str(horseID_l[0][0]).replace('(','').replace(')','').replace(',','')
print(f'検索馬のID {id} 誕生年 {id[0:4]}')
start_year = int(id[0:4]) + 2
print(f'最短デビュー年 {start_year}')
data_l_pre = list()
for y in range(start_year,2021 +1):
table = f'race_r_{y}'
try:
cur.execute(f'SELECT 着順,枠番,馬番,斤量,騎手,タイム,通過,上り,単勝,人気,馬体重,賞金,raceID FROM horse_race_result.{table} WHERE horseID = {id}')
finally:
result = cur.fetchall()
# print(result)
if result != []:
data_l_pre.append(result)
# ネストを平滑化する
data_l = [e for l in data_l_pre for e in l]
print(f'出走数 {len(data_l)}')
print(data_l)
raceID_l = [l[-1] for l in data_l]
print(raceID_l)
data2_l_pre = list()
for id in raceID_l:
table = f'race_n_{id[1:7]}'
try:
cur.execute(f'SELECT 日付,開催,レース,レース名,コース,天候,馬場状態 FROM horse_race_name.{table} WHERE raceID = "{id}"')
finally:
result = cur.fetchall()
if result != []:
data2_l_pre.append(result)
# 接続終了
cur.close()
conn.close()
# ネストを平滑化する
data2_l = [e for l in data2_l_pre for e in l]
print(f'data2_lデータ数 {len(data2_l)}')
print(data2_l)
# ソート用日付データの作成
date_l = list()
for d in data2_l:
date = d[0]
date_dt = datetime.datetime.strptime(date,'%Y年%m月%d日')
date_d = datetime.date(date_dt.year, date_dt.month, date_dt.day)
date_l.append(str(date_d))
print(f'date_lデータ数 {len(date_l)}')
print(date_l)
# レースデータ、結果データ、日付データを結合する
data3_l = list()
for a,b,c in zip(data2_l,data_l,date_l):
d = list(a) + list(b) + [c]
data3_l.append(d)
print(f'data3_lデータ数 {len(data3_l)}')
print(data3_l)
# 日付でソートする
data4_l = sorted(data3_l, key=lambda x: x[-1])
print(f'data4_lデータ数 {len(data4_l)}')
print(data4_l)
# 列タイトルを追加する
column_title = [['日付','開催','レース','レース名','コース','天候','馬場状態','着順','枠番','馬番','斤量','騎手','タイム','通過','上り','単勝','人気','馬体重','賞金','raceID','ソート用日付']]
data5_l = column_title + data4_l
print(f'data5_lデータ数 {len(data5_l)}')
print(data5_l)
# 結果ファイルの作成
datetime_now = datetime.datetime.now()
datetime_now_str = datetime_now.strftime('%y%m%d%H%M')
filename = f"/Desktop/{datetime_now_str}_mysql.csv"
with open(filename, 'w', newline='',encoding = 'shift_jis') as f:
writer = csv.writer(f)
writer.writerows(data5_l)