本文目录导读:

要统计“脚后跟传球成功次数”,需要先明确数据源和统计口径,下面给你一个可落地的脚本框架,适用于足球赛事数据(如 Opta、StatsBomb、Wyscout 或自定义标注数据)。
先定义清楚“脚后跟传球成功”
统计前必须明确 3 个字段:
| 字段 | 说明 |
|---|---|
pass_body_part |
传球部位,需包含 heel / backheel |
pass_outcome |
成功/失败,成功通常为 complete / successful |
player_id / match_id |
统计维度 |
注意:不同数据源字段名不同,下面用通用字段名,实际替换即可。
Python 脚本(pandas 版)
假设你有一份 CSV,字段包括:
match_id, player_id, player_name, pass_body_part, pass_outcome
import pandas as pd
# 1. 读取数据
df = pd.read_csv("passes.csv")
# 2. 筛选脚后跟传球
heel_passes = df[df["pass_body_part"].str.lower().isin(["heel", "backheel"])]
# 3. 筛选成功传球
heel_success = heel_passes[
heel_passes["pass_outcome"].str.lower().isin(["complete", "successful", "success"])
]
# 4. 按球员统计成功次数
result = (
heel_success.groupby(["player_id", "player_name"])
.size()
.reset_index(name="backheel_success_count")
.sort_values("backheel_success_count", ascending=False)
)
print(result)
# 5. 导出
result.to_csv("backheel_success_stats.csv", index=False)
按球队/比赛统计(可选)
# 按球队
team_result = (
heel_success.groupby("team_name")
.size()
.reset_index(name="backheel_success_count")
.sort_values("backheel_success_count", ascending=False)
)
# 按比赛
match_result = (
heel_success.groupby("match_id")
.size()
.reset_index(name="backheel_success_count")
)
统计成功率(更严谨)
summary = (
heel_passes.groupby(["player_id", "player_name"])
.agg(
backheel_total=("pass_outcome", "size"),
backheel_success=("pass_outcome", lambda x: x.str.lower().isin(
["complete", "successful", "success"]).sum())
)
.reset_index()
)
summary["success_rate"] = summary["backheel_success"] / summary["backheel_total"]
summary = summary.sort_values("backheel_success", ascending=False)
如果你用的是 StatsBomb 开放数据
StatsBomb 中传球部位字段是 pass.body_part.name,脚后跟为 "Heel",成功传球看 pass.outcome 是否为空(None 表示成功)。
import json
import pandas as pd
with open("events.json", encoding="utf-8") as f:
events = json.load(f)
rows = []
for e in events:
if e["type"]["name"] == "Pass":
body = e["pass"].get("body_part", {}).get("name")
outcome = e["pass"].get("outcome", {}).get("name") # None = 成功
rows.append({
"player": e["player"]["name"],
"team": e["team"]["name"],
"body_part": body,
"success": outcome is None
})
df = pd.DataFrame(rows)
heel = df[df["body_part"] == "Heel"]
result = heel.groupby(["player", "team"])["success"].sum().reset_index(
name="backheel_success")
print(result.sort_values("backheel_success", ascending=False))
注意事项
- 数据源差异:Opta 用
heel,StatsBomb 用Heel,Wyscout 可能用back,需先确认字段值。 - “成功”定义:有的数据源把“传球被队友接到”算成功,有的算“未被拦截”,要统一口径。
- 事件级 vs 聚合级:上面是事件级统计,若你只有聚合数据(如每场传球部位分布),则无法精确到“成功次数”。
- 样本量小:脚后跟传球本身频率低,单场统计意义有限,建议按赛季/多场聚合。
如果你能告诉我数据源格式(CSV 字段、StatsBomb、Opta、还是自建标注表),我可以把脚本改成直接可跑的版本。