本文目录导读:

高球传中争顶成功率”的统计,目前在开源体育数据项目中没有现成的、可直接调用的标准化指标,原因在于这个指标需要同时融合事件数据(传中)和空间/身体对抗数据(争顶),而多数开源项目只覆盖其中一部分。
下面按数据源、计算逻辑和可落地项目三个层面来说明。
为什么这个指标难以直接获取
“高球传中争顶成功率”拆解后涉及三个子问题:
| 子指标 | 数据需求 | 开源覆盖情况 |
|---|---|---|
| 高球传中识别 | 传球事件 + 起脚位置(边路/底线)+ 传球高度(高球) | StatsBomb 开放数据可支持 |
| 争顶事件 | 空中对抗(Aerial Duel)事件 | 部分开源数据集有 |
| 成功率归属 | 传中后第一落点争顶是否被进攻方赢下 | 需要事件序列关联,无现成字段 |
关键难点:传中事件与随后的争顶事件之间没有天然的外键关联,需要按时间窗口(3–5 秒)和空间距离做事件链接,这是自行开发的部分。
可用的开源数据源
-
StatsBomb Open Data(GitHub:
statsbomb/open-data)- 提供 360 冻结帧(部分赛事)、传球事件含
pass.height(高球/低球)、pass.cross(是否传中)字段。 - 有
duel事件类型,含aerial_won字段。 - 最接近需求,但需要自己写事件关联逻辑。
- 提供 360 冻结帧(部分赛事)、传球事件含
-
Wyscout 公开数据集(部分研究用版本)
- 有
Cross和Air Duel标签,但公开版赛事有限。
- 有
-
FBref / Opta 衍生数据
- FBref 有球队级“传中成功率”和“空中对抗成功率”,但不是传中后争顶的联合指标,且为聚合数据。
-
Socceraction / kloppy(开源库)
用于事件数据标准化和 SPADL 转换,可作为预处理工具,但不直接产出该指标。
自行计算的处理流程
若基于 StatsBomb 开放数据,典型 pipeline:
筛选 pass.cross == True 且 pass.height == "High Pass"
2. 定位传中事件的时间戳 t 和落点坐标 (end_location)
3. 在 [t, t+5s] 窗口内检索 duel 事件,type=aerial
4. 用落点坐标与 duel 位置做距离匹配(阈值 ~15m)
5. 判断该 aerial duel 的 winner 是否为传中方球队
6. 成功率 = 进攻方赢下争顶次数 / 高球传中总次数
伪代码示意:
crosses = events[(events.type=="Pass") &
(events.pass_cross==True) &
(events.pass_height=="High Pass")]
success = 0
for c in crosses:
window = events[(events.timestamp > c.timestamp) &
(events.timestamp < c.timestamp+5) &
(events.type=="Duel") &
(events.duel_type=="Aerial")]
# 空间匹配
match = window[dist(window.location, c.pass_end_location) < 15]
if not match.empty and match.iloc[0].team == c.team:
success += 1
rate = success / len(crosses)
相关开源项目参考
- socceraction(ML-KULeuven):事件数据 → SPADL,便于构建自定义指标。
- kloppy:多源事件数据统一接口。
- mplsoccer:可视化传中和争顶落点热图。
- statsbombpy:StatsBomb 数据 Python 封装,快速取数。
目前没有一个开源仓库直接输出“高球传中争顶成功率”这一指标,需要基于上述工具自行搭建,如果你需要,我可以帮你写一个完整的 StatsBomb 数据计算脚本。