MLB球队周日夜赛后下一场比赛胜率计算技术求助
解决方案:高效计算MLB周日夜赛后下一场比赛的胜率
核心思路
摒弃逐行循环的低效方式,利用pandas的分组、排序和移位操作,精准关联球队的周日夜赛与下一场比赛,快速统计胜率。
步骤与代码实现
- 预处理数据:统一日期格式并按球队、年份、比赛日期排序,确保比赛顺序正确
import pandas as pd # 转换日期列为datetime类型 df['Date'] = pd.to_datetime(df['Date']) # 按球队、年份、日期排序,保证同队同年的比赛按时间先后排列 df = df.sort_values(by=['Team', df['Date'].dt.year, 'Date']).reset_index(drop=True)
- 标记周日夜赛:新增列标记该行是否为目标赛事
df['is_sunday_night'] = (df['Day'] == 'Sun') & (df['Day/Night'] == 'N')
- 关联下一场比赛:按球队+年份分组,获取下一场比赛的关键信息
# 移位获取同队同年的下一场比赛胜负结果 df['next_game_win'] = df.groupby(['Team', df['Date'].dt.year])['Winning Team'].shift(-1) # 标记下一场比赛是否为周一或周二(根据你的Day列缩写调整,比如'Mon'/'Tue') df['next_game_is_monday_tuesday'] = df.groupby(['Team', df['Date'].dt.year])['Day'].shift(-1).isin(['Mon', 'Tue'])
- 筛选有效样本并计算胜率:只保留符合条件的样本,统计胜率
# 筛选条件:当前是周日夜赛,且下一场是周一/周二 valid_samples = df[(df['is_sunday_night']) & (df['next_game_is_monday_tuesday'])] # 计算胜率:下一场获胜次数 / 有效样本总数 # 若Winning Team列存储的是获胜队名,判断逻辑如下;若用'W'/'L'标记,改为`next_game_win == 'W'`即可 win_count = (valid_samples['next_game_win'] == valid_samples['Team']).sum() total_count = len(valid_samples) win_percentage = win_count / total_count if total_count > 0 else 0 print(f"周日夜赛后下一场(周一/周二)比赛的胜率:{win_percentage:.2%}")
关键说明
- 按
Team + 年份分组:完美解决Game Number每年重置的问题,确保只在同一年份内匹配下一场比赛 - 移位操作
shift(-1):用向量化方式替代循环,性能提升显著 - 逻辑灵活调整:可根据你数据中胜负标记的实际格式,修改获胜判断条件
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

