实用脚本统计脚后跟传球成功几次?

wen 实用脚本 8

本文目录导读:

实用脚本统计脚后跟传球成功几次?

  1. 先定义清楚“脚后跟传球成功”
  2. Python 脚本(pandas 版)
  3. 按球队/比赛统计(可选)
  4. 统计成功率(更严谨)
  5. 如果你用的是 StatsBomb 开放数据
  6. 注意事项

要统计“脚后跟传球成功次数”,需要先明确数据源和统计口径,下面给你一个可落地的脚本框架,适用于足球赛事数据(如 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))

注意事项

  1. 数据源差异:Opta 用 heel,StatsBomb 用 Heel,Wyscout 可能用 back,需先确认字段值。
  2. “成功”定义:有的数据源把“传球被队友接到”算成功,有的算“未被拦截”,要统一口径。
  3. 事件级 vs 聚合级:上面是事件级统计,若你只有聚合数据(如每场传球部位分布),则无法精确到“成功次数”。
  4. 样本量小:脚后跟传球本身频率低,单场统计意义有限,建议按赛季/多场聚合。

如果你能告诉我数据源格式(CSV 字段、StatsBomb、Opta、还是自建标注表),我可以把脚本改成直接可跑的版本。

抱歉,评论功能暂时关闭!