You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pandas的shift与rolling构建足球预测ML模型时遇技术问题

计算球队过去n场平均进球(排除当前场)的正确方法

核心问题分析

你之前的代码存在两个关键问题:

  • 没有按球队分组,所有球队的比赛数据混合计算滚动平均,结果完全不符合需求
  • 先shift(1)再rolling(n)的顺序错误,导致有效数据量不必要减少

正确实现步骤

要计算当前比赛前n场的平均进球数,必须按球队分组、保证比赛时间顺序,再调整滚动平均和位移的顺序:

  1. 先将数据按球队和比赛日期排序,确保每个球队的比赛按时间先后排列
  2. 按球队分组后,先计算包含当前场的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 22:53:11