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

Pandas处理足球赛事Excel数据:扩展滚动均值计算需求

Python Pandas实现足球赛事赔率滚动均值扩展功能

假设你的原始数据核心字段如下,先构造示例数据方便验证:

import pandas as pd

# 模拟足球赛事数据
data = pd.DataFrame({
    '赛季': ['2022/23', '2022/23', '2022/23', '2022/23', '2023/24', '2023/24'],
    '主队': ['曼联', '曼城', '曼联', '利物浦', '曼城', '利物浦'],
    '客队': ['曼城', '曼联', '利物浦', '曼联', '利物浦', '曼城'],
    'PSCH': [2.1, 1.8, 2.0, 1.9, 1.7, 2.2],
    'PSCA': [3.5, 4.0, 3.2, 3.8, 4.2, 3.6]
})

需求1:计算球队跨主客身份的赔率均值

要获取主队作为客队参赛时的PSCA均值、客队作为主队参赛时的PSCH均值,需拆分主客视角数据集后关联匹配:

  1. 先处理基础的主队主战PSCH均值(已实现逻辑,用于对比)
# 按赛季+主队分组,计算历史累计PSCH均值(shift排除当前场次)
data['主队_PSCH历史均值'] = data.groupby(['赛季', '主队'])['PSCH'].expanding().mean().shift().reset_index(level=[0,1], drop=True)
  1. 计算主队作为客队时的PSCA历史均值
# 构造客队视角数据集:提取球队作为客队时的PSCA数据
away_records = data.rename(columns={'客队': '球队', 'PSCA': '客战_PSCA'})[['赛季', '球队', '客战_PSCA']]
# 按赛季+球队分组,计算客战PSCA的历史累计均值
away_records['客战_PSCA历史均值'] = away_records.groupby(['赛季', '球队'])['客战_PSCA'].expanding().mean().shift().reset_index(level=[0,1], drop=True)
# 匹配回原始数据:主队的客战PSCA均值
data = data.merge(away_records.rename(columns={'球队': '主队', '客战_PSCA历史均值': '主队当客队_PSCA历史均值'}),
                  on=['赛季', '主队'], how='left')
  1. 计算客队作为主队时的PSCH历史均值
# 构造主队视角数据集:提取球队作为主队时的PSCH数据
home_records = data.rename(columns={'主队': '球队', 'PSCH': '主战_PSCH'})[['赛季', '球队', '主战_PSCH']]
# 按赛季+球队分组,计算主战PSCH的历史累计均值
home_records['主战_PSCH历史均值'] = home_records.groupby(['赛季', '球队'])['主战_PSCH'].expanding().mean().shift().reset_index(level=[0,1], drop=True)
# 匹配回原始数据:客队的主战PSCH均值
data = data.merge(home_records.rename(columns={'球队': '客队', '主战_PSCH历史均值': '客队当主队_PSCH历史均值'}),
                  on=['赛季', '客队'], how='left')

需求2:支持最近N场滚动均值(替代全历史)

将上述代码中的expanding().mean()替换为rolling(window=N, min_periods=1).mean()即可实现最近N场的滚动计算,以N=3为例:

# 主队最近3场主战PSCH均值
data['主队_PSCH近3场均值'] = data.groupby(['赛季', '主队'])['PSCH'].rolling(window=3, min_periods=1).mean().shift().reset_index(level=[0,1], drop=True)

# 主队最近3场客战PSCA均值
away_records['客战_PSCA近3场均值'] = away_records.groupby(['赛季', '球队'])['客战_PSCA'].rolling(window=3, min_periods=1).mean().shift().reset_index(level=[0,1], drop=True)
data = data.merge(away_records.rename(columns={'球队': '主队', '客战_PSCA近3场均值': '主队当客队_PSCA近3场均值'}),
                  on=['赛季', '主队'], how='left')

# 客队最近3场主战PSCH均值
home_records['主战_PSCH近3场均值'] = home_records.groupby(['赛季', '球队'])['主战_PSCH'].rolling(window=3, min_periods=1).mean().shift().reset_index(level=[0,1], drop=True)
data = data.merge(home_records.rename(columns={'球队': '客队', '主战_PSCH近3场均值': '客队当主队_PSCH近3场均值'}),
                  on=['赛季', '客队'], how='left')

关键说明

  • shift()用于排除当前场次的数据,确保均值仅包含历史记录
  • min_periods=1处理球队赛季前几场不足N场的情况,返回已有场次的均值而非NaN
  • 可根据需求自由切换expanding(全历史)和rolling(最近N场)逻辑

内容的提问来源于stack exchange,提问作者eestlane

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 13:07:37