ローテーション

ローテーション#

%run 0.2_Function.ipynb
df = result_df("2015", "2024", ["東"])
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
Cell In[2], line 1
----> 1 df = result_df("2015", "2024", ["東"])

File /tmp/ipykernel_2774/2063706412.py:16, in result_df(__type, __start, __end, __location)
     14     columns = payout_columns
     15 else:
---> 16     raise Exception
     19 # CSVファイルごとに処理
     20 for file in csv_files:

Exception: 
df = df[
    ["レース日", "馬名", "場所", "確定着順", "単勝オッズ", "距離", "芝・ダ", "騎手名",'通過順4', '父馬名']
]
# 距離ローテ
df = df.sort_values(["馬名", "レース日"])

df["前走距離"] = (
    df
    # ← PARTITION BY 馬名
    .groupby("馬名")["距離"]
    # ← LAG(distance, 1)
    .shift(1)
)
df["距離延長"] = (df["距離"] >= df["前走距離"] + 200).fillna(False)
df["距離短縮"] = (df["距離"] <= df["前走距離"] - 200).fillna(False)
# 芝・ダートのローテ
df["前走芝・ダ"] = (
    df
    # PARTITION BY 馬名
    .groupby("馬名")["芝・ダ"]
    # LAG(芝・ダ, 1)
    .shift(1)
)

df["芝→ダ"] = np.where(
    df["前走芝・ダ"].notna()
    & (df["芝・ダ"] != df["前走芝・ダ"])
    & (df["前走芝・ダ"] == "芝"),
    True,  # 前走と違う ⇒ 変更あり
    False,  # 前走と同じ or 前走なし
)
df["ダ→芝"] = np.where(
    df["前走芝・ダ"].notna()
    & (df["芝・ダ"] != df["前走芝・ダ"])
    & (df["前走芝・ダ"] == "ダ"),
    True,  # 前走と違う ⇒ 変更あり
    False,  # 前走と同じ or 前走なし
)
# 騎手のローテ
df["前走騎手名"] = df.groupby("馬名")["騎手名"].shift(1)

df["乗り替わり"] = np.where(
    df["前走騎手名"].notna() & (df["騎手名"] != df["前走騎手名"]), True, False
)

# 判定したい騎手名をリストで用意
top_jockeys = ["ルメール", "レーン", "モレイラ","C.デム"]

# True / False のブール Series を作成
is_top_jockey = df["前走騎手名"].isin(top_jockeys)
is_not_top_jockey = ~df["騎手名"].isin(top_jockeys)


df["鞍上弱化"] = np.where(
    df["前走騎手名"].notna() & (df["騎手名"] != df["前走騎手名"]) & is_top_jockey & is_not_top_jockey, True, False
)
# 前走通過順
df["前走通過順4"] = (
    df
    # PARTITION BY 馬名
    .groupby("馬名")["通過順4"]
    # LAG(芝・ダ, 1)
    .shift(1)
)
df.head(20)
レース日 馬名 場所 確定着順 単勝オッズ 距離 芝・ダ 騎手名 通過順4 父馬名 前走距離 距離延長 距離短縮 前走芝・ダ 芝→ダ ダ→芝 前走騎手名 乗り替わり 鞍上弱化 前走通過順4
75081 2023-10-22 アアル 東京 14 14.7 1400 菅原明良 12 Malibu Moon NaN False False NaN False False NaN False False NaN
6170 2015-06-13 アイアイエンデバー 東京 10 65.7 2100 西田雄一 8 ゴールドヘイロー NaN False False NaN False False NaN False False NaN
27589 2015-10-18 アイアイエンデバー 東京 12 76.3 2100 田中勝春 16 ゴールドヘイロー 2100.0 False False False False 西田雄一 True False 8.0
28235 2015-11-01 アイアイエンデバー 東京 15 221.9 1400 江田照男 15 ゴールドヘイロー 2100.0 False True False False 田中勝春 True False 16.0
23524 2016-04-30 アイアイエンデバー 東京 12 474.7 1600 嘉藤貴行 9 ゴールドヘイロー 1400.0 True False False True 江田照男 True False 15.0
24791 2016-05-22 アイアイエンデバー 東京 9 261.0 1800 嘉藤貴行 9 ゴールドヘイロー 1600.0 True False False False 嘉藤貴行 False False 9.0
20325 2016-06-04 アイアイエンデバー 東京 9 222.2 2000 西田雄一 7 ゴールドヘイロー 1800.0 True False False False 嘉藤貴行 True False 9.0
2562 2016-11-26 アイアイハッピー 東京 7 173.8 1600 石橋脩 8 ゴールドヘイロー NaN False False NaN False False NaN False False NaN
55555 2017-01-29 アイアイハッピー 東京 8 144.8 1300 柴山雄一 12 ゴールドヘイロー 1600.0 False True False False 石橋脩 True False 8.0
15225 2017-05-21 アイアイハッピー 東京 11 192.5 1600 野中悠太 5 ゴールドヘイロー 1300.0 True False False False 柴山雄一 True False 12.0
908 2017-06-18 アイアイハッピー 東京 9 229.2 1600 菊沢一樹 3 ゴールドヘイロー 1600.0 False False False False 野中悠太 True False 5.0
16127 2021-02-06 アイアゲート 東京 2 4.7 1400 津村明秀 3 ダイワメジャー NaN False False NaN False False NaN False False NaN
51834 2021-05-16 アイアゲート 東京 1 4.4 1400 戸崎圭太 1 ダイワメジャー 1400.0 False False False False 津村明秀 True False 3.0
3992 2022-02-19 アイアゲート 東京 10 21.8 1600 坂井瑠星 1 ダイワメジャー 1400.0 True False False False 戸崎圭太 True False 1.0
76959 2022-05-21 アイアゲート 東京 7 10.5 1400 菅原明良 2 ダイワメジャー 1600.0 False True False False 坂井瑠星 True False 1.0
9955 2024-02-04 アイアゲート 東京 4 12.1 1800 坂井瑠星 4 ダイワメジャー 1400.0 True False False True 菅原明良 True False 2.0
34642 2019-10-05 アイアス 東京 15 136.1 1400 武士沢友 15 カネヒキリ NaN False False NaN False False NaN False False NaN
16945 2021-02-20 アイアムイチオシ 東京 13 122.7 1600 内田博幸 9 ヘニーヒューズ NaN False False NaN False False NaN False False NaN
29865 2021-06-05 アイアムイチオシ 東京 13 24.1 1400 山田敬士 5 ヘニーヒューズ 1600.0 False True False False 内田博幸 True False 9.0
49357 2024-11-02 アイアムイチバン 東京 5 3.2 1600 戸崎圭太 6 パイロ NaN False False NaN False False NaN False False NaN
df["前走通過順4"] = pd.to_numeric(df["前走通過順4"], errors="coerce")
df["単勝オッズ"]   = pd.to_numeric(df["単勝オッズ"],   errors="coerce")
df["確定着順"]     = pd.to_numeric(df["確定着順"],     errors="coerce")

# フィルタ条件
cond = (
    #(df["前走通過順4"] >= 9) &     # 前走通過順が 9 以上
    #(df["前走通過順4"] <= 4) &     # 前走通過順が 9 以上
    #(df["距離延長"]) &            # 距離延長 == True
    #(df["距離短縮"]) &            # 距離延長 == True
    (df["単勝オッズ"] < 10)   &      # 単勝オッズ < 40
    (df["鞍上弱化"])
)

sub = df.loc[cond].copy()

# 父馬名ごとに集計
summary = (
    sub.groupby("父馬名")
       .agg(
            sample=("確定着順", "size"),
            勝率=("確定着順", lambda s: (s.eq(1)).mean() * 100),
            複勝率=("確定着順", lambda s: (s.le(3)).mean() * 100),
       )
       .round({"勝率": 2, "複勝率": 2})
       .sort_values("sample", ascending=False) 
)
# min sample
min_samples = 35

summary_filtered = summary[summary["sample"] >= min_samples]

summary_filtered.reset_index().sort_values('複勝率', ascending=False)
父馬名 sample 勝率 複勝率
3 ロードカナロア 44 22.73 54.55
0 ディープインパクト 123 12.20 51.22
1 ハーツクライ 54 18.52 46.30
2 キングカメハメハ 52 17.31 42.31