使用pandas的shift与rolling构建足球预测ML模型时遇技术问题
计算球队过去n场平均进球(排除当前场)的正确方法
核心问题分析
你之前的代码存在两个关键问题:
- 没有按球队分组,所有球队的比赛数据混合计算滚动平均,结果完全不符合需求
- 先
shift(1)再rolling(n)的顺序错误,导致有效数据量不必要减少
正确实现步骤
要计算当前比赛前n场的平均进球数,必须按球队分组、保证比赛时间顺序,再调整滚动平均和位移的顺序:
- 先将数据按球队和比赛日期排序,确保每个球队的比赛按时间先后排列
- 按球队分组后,先计算包含当前场的n场滚动平均,再用
shift(1)将结果下移一行,这样当前行的数值就是该球队当前场之前的n场平均进球
代码示例
假设你的数据包含主队列HomeTeam、客队列AwayTeam、主队进球FTHG、客队进球FTAG和比赛日期Date:
import pandas as pd df = pd.read_csv("D1.csv") n = 5 # 转换日期格式并按球队+日期排序,保证比赛顺序正确 df['Date'] = pd.to_datetime(df['Date']) df = df.sort_values(['HomeTeam', 'Date']) # 计算主队过去5场平均进球(排除当前场) df['Home_Prev5_Avg'] = df.groupby('HomeTeam')['FTHG'].rolling(n).mean().shift(1).reset_index(level=0, drop=True) # 同理计算客队过去5场平均进球 df['Away_Prev5_Avg'] = df.groupby('AwayTeam')['FTAG'].rolling(n).mean().shift(1).reset_index(level=0, drop=True)
关键说明
- 每个球队的前n场比赛会出现
NaN,这是合理的(因为没有足够的历史数据),你可以根据需求选择保留这些行,或者用df.dropna()删除 - 先
rolling再shift的顺序,既避免了当前场数据被纳入计算,又最大化保留了有效数据量
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

