本文目录导读:

高球传中争顶成功率”的统计,目前在开源足球数据项目中没有现成的、可直接调用的标准化指标,这个指标需要基于事件数据和追踪数据自行计算,以下是详细说明和可行方案:
为什么开源项目少有这个指标
- 定义不统一:什么算“高球传中”(传中高度阈值?距离?),什么算“争顶成功”(争到球权?形成射门?)各项目定义不同。
- 需要追踪数据:判断“争顶”往往需要球员位置、起跳、身体对抗等数据,普通事件数据(如 StatsBomb 开放数据)只记录“Aerial Duel”结果,不区分是否来自传中。
- 样本稀疏:单场比赛中“高球传中+争顶”事件很少,统计意义有限。
可用的开源数据源
| 数据源 | 是否含争顶 | |
|---|---|---|
| StatsBomb Open Data | 事件数据(含 Aerial Duel、Cross、Pass 类型) | ✅ 有 aerial_lost/aerial_won 事件 |
| Wyscout Open Data | 事件数据(含 Air Duel、Cross) | ✅ 有 air_duel 事件 |
| FBref(可爬取) | 统计汇总(含 aerial wins %) | ⚠️ 仅汇总,无事件级关联 |
| Soccer-skillcorner / Metrica | 追踪数据(部分开源) | ⚠️ 需自行标注争顶 |
| OpenFootball | 基础赛果 | ❌ 无 |
自行计算的方法(以 StatsBomb 为例)
核心思路:把“传中事件”和“随后的争顶事件”在时间/位置上关联。
# 伪代码
for cross_event in events[type == 'Pass' and pass_height == 'High Pass'
and pass_cross == True]:
# 找传中后 N 秒内、落点附近的 Aerial Duel 事件
duels = events[type == 'Duel' and duel_type == 'Aerial Lost'
and 0 < timestamp - cross_event.timestamp < 5
and distance(location, cross_end_location) < 10]
if duels:
# 判断争顶方是否为传中方的队友
success = duels[0].team == cross_event.team
统计口径建议:
- 分子:传中后由传中方队友赢得的空中对抗次数
- 分母:产生空中对抗的高球传中总次数
- 可按球员/球队/区域分组
现成可参考的项目
statsbombpy+mplsoccer:可加载开放数据,自行写上述逻辑。socceraction(ML 开源库):有传球/对抗的 VAEP 框架,可扩展。football-data(GitHub 多个仓库):多为赛果/赔率,无此指标。kloppy:追踪数据标准化库,若你有追踪数据可自行标注争顶。
结论与建议
- 没有开箱即用的“高球传中争顶成功率”开源指标。
- 若只需球队/球员汇总,可从 FBref 爬
Aerial Wins与Crosses近似估算,但无法精确关联“传中导致的争顶”。 - 若需精确事件级统计,用 StatsBomb Open Data 自行实现上述关联逻辑是最可行路径(数据免费、事件含 cross 与 aerial duel 标记)。
- 若需追踪级(判断谁先起跳、对抗强度),需 Metrica/SkillCorner 等追踪数据 + 人工/模型标注,成本较高。
如果你需要,我可以帮你写一份基于 StatsBomb 开放数据的完整计算脚本(含数据下载、事件关联、按球员输出成功率)。