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

如何用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表结构。

高效实现步骤

  1. 过滤历史数据:针对每条目标比赛记录,只保留该比赛发生之前的球员统计数据(避免未来数据泄露),过滤条件设为player_stats.game_id < 目标game_id。
  2. 计算球员历史场均值:按player_id+team_id分组,计算每个球员在对应球队的目标统计量历史均值——绑定team_id是为了处理球员转会情况,确保只统计他在当前球队的过往数据。
  3. 聚合球队特征:针对目标比赛的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:02:46