独学でプログラミングを学んでみた

python初心者がテックブログを書いてみた

python初学者が競馬予測をしてみたpart6(特徴量追加)

こんにちはKHnodeです。
なんやかんやでpart6になってしまいましたが今回も調べていたらいい感じの特徴量を見つけてきたのでそれを作成しようと思います。

今回はスピード指数の作成ということでこちらを参考にしました。

西田式スピード指数
西田式スピード指数 Official Website


では早速コードを書いていこうと思います。

df01['conditionindex'] = 0

df01['conditionindex'].mask((df01['condition'] == '良') & (df01['turf'] == '芝'), -25, inplace=True)
df01['conditionindex'].mask((df01['condition'] == '稍') & (df01['turf'] == '芝'), -15, inplace=True)
df01['conditionindex'].mask((df01['condition'] == '重') & (df01['turf'] == '芝'), -5, inplace=True)
df01['conditionindex'].mask((df01['condition'] == '良') & (df01['turf'] == 'ダ'), -20, inplace=True)
df01['conditionindex'].mask((df01['condition'] == '稍') & (df01['turf'] == 'ダ'), -10, inplace=True)

df['basetime'].fillna(df['basetime'].median())
df['weight'].fillna(df['weight'].median())

time = (df01['basetime'] * 10) - (df01['time'] * 10)
disindex = 1 / (df01['basetime'] * 10) * 1000
weight = (df01['weight'] - 55) * 2

df01['speedindex'] = time * disindex + df01['conditionindex'] + weight + 80

df01 = df01.drop(['basetime', 'weight', 'conditionindex'], axis=1)

数式の解説は先ほど紹介したい西田式スピード指数に書いてあるのでこちらを参考にしていただけると幸いです。
今回は新たにCSVデータに斤量と基準タイムを追加しました。

馬場状態の指数に関してですが私独自で作成しています。
また基準タイム(Tragetに記載されている基準)と斤量は最頻値で欠損値を埋めています。
あとは合わせるだけという感じです。

最初の上6行はもっといい感じでかけるような気もしますが、
現状は変にforループを使うよりかは早く処理が終わりそうな気がしたので地道に書いています。

これを前走の成績としてくっつけます。

df['days'] = pd.to_datetime(df['days'])
name_days_df = df[["horsename", "days", "pop",
                   "odds", "rank3", "rank4", "3ftime", "result", 'speedindex']].sort_values(['horsename', 'days'])

name_list = name_days_df['horsename'].unique()

df_list = []
df = df.drop('speedindex', axis=1)

for name in name_list:
    name_df = name_days_df[name_days_df['horsename'] == name]
    shift_name_df = name_df[["pop", "odds", "rank3", "rank4", "3ftime", "result", 'speedindex']].shift(1)
    shift_name_df['horsename'] = name
    df_list.append(shift_name_df)

df_before = pd.concat(df_list)
df_before['days'] = name_days_df['days']

df_before = df_before.rename(columns={'pop': 'pre_pop', 'odds': 'pre_odds', 'rank3': 'pre_rank3',
                                      'rank4': 'pre_rank4', '3ftime': 'pre_3ftime', 'result': 'pre_result'})

df = pd.merge(df, df_before, on=['horsename', 'days'], how='inner')

くっつける方法はユニークな馬の名前を1頭ずつforループで回して集め終わったらshiftで1こずらしてリストに格納する感じです。

1頭ずづ処理をしているので処理はかなり時間がかかってしまうので何とかはやくしたいなぁと思っているのですが中々妙案が浮かばないです。
いい案などあればコメントなどで教えていただけると幸いです。

これを追加したデータで予想してみました。
予想記事はこちらから
keibatech.hatenablog.jp

結果は◎→〇→無印で決着でした。

ダノンザキットを当てれなかったのはくやしい(ToT)

もっとデータを愛さないといけない(戒め)