Python如何计算足球数据的年度及生涯场均滚动平均值
足球赛事数据场均指标计算实现思路
前置准备:数据排序
所有时间维度的窗口计算核心前提是保证数据按比赛先后顺序排列,先执行排序操作,让每个球员的记录按职业生涯比赛顺序排列:
df = df.sort_values(by=['Player', '年份', '周次']).reset_index(drop=True)
排序完成后分组内的行顺序天然匹配比赛先后顺序,不需要为rolling自定义时间窗口,直接基于行顺序计算即可。
场景1:累计场均计算(截止到当前周的总场均)
如果要计算的是生涯/年度截止到当前周的所有比赛场均值,使用pandas的expanding累计窗口实现即可,代码如下:
# 配置指标映射关系,可按需扩展 metric_map = { '冲球码数': ['生涯场均冲球码数', '年度场均冲球码数'], '接球数': ['生涯场均接球数', '年度场均接球数'] } for origin_col, (career_col, annual_col) in metric_map.items(): # 计算生涯累计场均:按球员分组,累计从首秀到当前场的指标平均值 df[career_col] = df.groupby('Player')[origin_col].expanding(min_periods=1).mean().reset_index(drop=True) # 计算年度累计场均:按球员+年份分组,累计当年首周到当前周的指标平均值 df[annual_col] = df.groupby(['Player', '年份'])[origin_col].expanding(min_periods=1).mean().reset_index(drop=True)
上述逻辑直接在原数据集上新增字段,不需要额外做关联合并操作。
场景2:近N场滚动场均计算
如果你需要的是最近N场比赛的滚动平均值而非累计场均,把上述代码中的expanding替换为rolling(N)即可:
N = 3 # 可按需调整窗口大小 for origin_col, (career_col, annual_col) in metric_map.items(): # 生涯近N场场均 df[career_col] = df.groupby('Player')[origin_col].rolling(N, min_periods=0).mean().reset_index(drop=True) # 年度近N场场均 df[annual_col] = df.groupby(['Player', '年份'])[origin_col].rolling(N, min_periods=0).mean().reset_index(drop=True)
特殊场景说明:如果原始数据中存在同一球员同一周有多条比赛记录的情况,需要先按
Player、年份、周次分组聚合单周的总冲球码数、总接球数,再执行上述场均计算逻辑,避免周内重复统计。
内容的提问来源于stack exchange,提问作者kh7
相关产品推荐
相关产品推荐

