Files
bet/BetMetices.py
2025-10-26 00:51:50 +08:00

67 lines
2.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import pandas as pd
from common.bet_tools import compute_metrics
from common.bet_tools import calculate_no_vig_moneyline_power, moneyline_to_prob
from loguru import logger
from common.utils import timeit
def get_no_vig_prob(row) -> pd.Series:
odds = [row["first_price"], row["second_price"]]
no_vig_odds_power = calculate_no_vig_moneyline_power(odds)
novig_probs_power = [moneyline_to_prob(o) for o in no_vig_odds_power]
# 返回两个无水概率
return pd.Series(
{
"first_no_vig_prob": novig_probs_power[0],
"second_no_vig_prob": novig_probs_power[1],
}
)
@timeit
def calc_metrics(df: pd.DataFrame, cols: list) -> pd.DataFrame:
data_list = []
for cs in df[cols].drop_duplicates().values:
tmp_df = df[cols + ["win_prob", "res"]].copy()
for i, col in enumerate(cols):
tmp_df = tmp_df[tmp_df[col] == cs[i]]
# if len(tmp_df) < 10000:
# continue
res = compute_metrics(df=tmp_df, include_draws=False)
res["filter_cols"] = ",".join(cs)
data_list.append(res)
res_df = pd.DataFrame(data_list)
res_df["reg_alpha"] = abs(res_df["reg_alpha"])
res_df = res_df.sort_values(by=["brier", "logloss", "ece", "reg_alpha"])
return res_df
if __name__ == "__main__":
df = pd.read_csv(
"/Users/aszer/Documents/vscode/bet/data/pinnical_1xbet_all_api.csv",
encoding="utf-8-sig",
)
df = df[
[
"sportsbook",
"sport",
"league",
"fixture_id",
"game_id",
"market",
"first_price",
"second_price",
"market_width",
"result",
]
]
# 防止 SettingWithCopyWarning推荐使用 .loc 显式分配
df.loc[:, ["first_no_vig_prob", "second_no_vig_prob"]] = df[
["first_price", "second_price"]
].apply(get_no_vig_prob, axis=1)
df["win_prob"] = df["first_no_vig_prob"]
df["res"] = df["result"]
cols = ["sportsbook", "sport"]
res_df = calc_metrics(df, cols)
logger.info(f"\n{res_df}")