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均值,需拆分主客视角数据集后关联匹配:
- 先处理基础的主队主战PSCH均值(已实现逻辑,用于对比)
# 按赛季+主队分组,计算历史累计PSCH均值(shift排除当前场次) data['主队_PSCH历史均值'] = data.groupby(['赛季', '主队'])['PSCH'].expanding().mean().shift().reset_index(level=[0,1], drop=True)
- 计算主队作为客队时的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')
- 计算客队作为主队时的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
相关产品推荐
相关产品推荐

