如何用Featuretools基于历史球员统计生成球队比赛特征?
问题描述
我拥有橄榄球联盟的体育数据DataFrames/实体集,包含以下数据表:
- players:
player_id、player_name - teams:
team_id、team_name - games:
game_id、venue_id - venues:
venue_id、venue_coordinates - team_stats:
game_id、team_id+ 单场球队统计数据 - player_stats:
game_id、team_id、player_id+ 单场球员统计数据
我的最终目标是基于聚合后的历史球员统计数据,生成某场比赛中特定球队的特征,例如game_id、team_id以及某统计量的球员均值之和(示例:球队2名球员某统计量历史值为[1,2],球队该统计量均值之和为3)。我尝试使用分组转换原语(group by trans primitives)但未成功,不确定是否需要为players数据表添加team_id,请问最高效的实现方式是什么?
解决方案
核心结论:不需要给players表加team_id
你的player_stats表已经包含team_id、player_id和game_id三个关键关联字段,完全可以直接用这张表完成所有计算,不需要修改players表结构。
高效实现步骤
- 过滤历史数据:针对每条目标比赛记录,只保留该比赛发生之前的球员统计数据(避免未来数据泄露),过滤条件设为
player_stats.game_id < 目标game_id。 - 计算球员历史场均值:按
player_id+team_id分组,计算每个球员在对应球队的目标统计量历史均值——绑定team_id是为了处理球员转会情况,确保只统计他在当前球队的过往数据。 - 聚合球队特征:针对目标比赛的
game_id和team_id,汇总该场比赛中球队所有球员的历史均值,得到球队层面的均值之和特征。
示例代码(Pandas)
import pandas as pd # 替换为你要计算的目标统计字段 target_stat = "yards_gained" # 1. 计算每个球员在对应球队的历史场均(按比赛顺序累积计算) player_history = ( player_stats.sort_values("game_id") .groupby(["player_id", "team_id"])[target_stat] .expanding() .mean() .reset_index() .rename(columns={target_stat: f"avg_{target_stat}"}) ) # 2. 将历史场均数据关联回原球员统计数据表 player_stats_with_history = pd.merge( player_stats, player_history, on=["player_id", "team_id", "game_id"], how="left" ) # 3. 按比赛+球队分组,求和得到球队的均值之和特征 team_final_features = ( player_stats_with_history.groupby(["game_id", "team_id"])[f"avg_{target_stat}"] .sum() .reset_index() .rename(columns={f"avg_{target_stat}": f"team_sum_avg_{target_stat}"}) )
关于分组转换原语失效的说明
这类原语通常适用于固定分组的静态聚合,但你的场景需要动态时间窗口(每场比赛只取之前的历史数据),直接用Pandas窗口函数或SQL窗口函数会更灵活高效。如果用Featuretools类工具,需要将game_id设为时间索引,再使用滚动聚合原语,但手动用Pandas实现会更直观可控。
内容的提问来源于stack exchange,提问作者apapa2234
相关产品推荐
相关产品推荐

