实用脚本统计弧线球传中精准度如何?

wen 实用脚本 4

本文目录导读:

实用脚本统计弧线球传中精准度如何?

  1. 先定义“弧线球传中精准度”
  2. 脚本示例(StatsBomb 风格字段)
  3. 输出解读要点
  4. 如果你用的是其他数据源

“弧线球传中精准度”这个指标在足球数据分析里通常不是一个直接给出的单一数据,需要自己构造,下面给你一个可执行的脚本框架(Python + pandas),以及指标定义思路,你可以按自己手上的数据源(StatsBomb / Opta / Wyscout / 自采)调整字段名。


先定义“弧线球传中精准度”

建议拆成三层指标,避免单一指标误导:

指标 定义 说明
弧线球识别率 传中事件中被标记为弧线/外脚背/内脚背的比例 依赖数据源是否标注传中类型
落点精准度 弧线传中落点与目标区域(小禁区/点球点附近)的距离 需要坐标
接球成功率 弧线传中后本方球员第一脚触球/射门的比例 最接近“精准”的实战指标
威胁转化 弧线传中后 3 秒内形成射门/进球的比例 xT / xG 加成

多数公开数据(如 StatsBomb)有 pass.type、pass.technique、pass.end_location、pass.outcome,可以直接构造。


脚本示例(StatsBomb 风格字段)

import pandas as pd
import numpy as np
# ---------- 1. 读入事件数据 ----------
# events: 每行一个事件,含 type, pass_technique, pass_end_location, pass_outcome,
#         player, team, minute, possession 等字段
events = pd.read_parquet("events.parquet")
# ---------- 2. 筛选传中 ----------
# StatsBomb: pass.cross == True;technique: Inswinging / Outswinging / Straight
crosses = events[
    (events["type"] == "Pass") &
    (events["pass_cross"] == True)
].copy()
# ---------- 3. 标记弧线球 ----------
curve_tech = ["Inswinging", "Outswinging"]
crosses["is_curve"] = crosses["pass_technique"].isin(curve_tech)
# ---------- 4. 落点坐标 ----------
# pass_end_location 通常是 [x, y],x 进攻方向 0-120,y 0-80
crosses["end_x"] = crosses["pass_end_location"].apply(lambda v: v[0] if isinstance(v, list) else np.nan)
crosses["end_y"] = crosses["pass_end_location"].apply(lambda v: v[1] if isinstance(v, list) else np.nan)
# ---------- 5. 定义“精准落点” ----------
# 例:落点在小禁区前沿 + 点球点之间(x 102-114, y 18-62)
def in_danger_zone(x, y):
    return (102 <= x <= 114) and (18 <= y <= 62)
crosses["accurate_zone"] = crosses.apply(
    lambda r: in_danger_zone(r["end_x"], r["end_y"]), axis=1
)
# ---------- 6. 接球成功 / 形成射门 ----------
# 需要事件序列:看该 pass 的 possession 内后续 3 个事件是否有 Shot 或本方接球
# 简化:用 pass_outcome 为空表示传球成功(未被拦截/出界)
crosses["completed"] = crosses["pass_outcome"].isna()
# 更严格的“接球后射门”需按 possession + timestamp 排序后 shift
events_sorted = events.sort_values(["match_id", "possession", "index"]).reset_index(drop=True)
events_sorted["next_type"] = events_sorted.groupby(["match_id", "possession"])["type"].shift(-1)
events_sorted["next2_type"] = events_sorted.groupby(["match_id", "possession"])["type"].shift(-2)
shot_after = events_sorted[
    (events_sorted["type"] == "Pass") &
    (events_sorted["pass_cross"] == True)
].copy()
shot_after["led_to_shot"] = shot_after["next_type"].eq("Shot") | shot_after["next2_type"].eq("Shot")
crosses = crosses.merge(
    shot_after[["id", "led_to_shot"]], on="id", how="left"
)
# ---------- 7. 汇总 ----------
def summarize(df):
    return pd.Series({
        "传中总数": len(df),
        "弧线球数": df["is_curve"].sum(),
        "弧线球占比": df["is_curve"].mean(),
        "弧线球落点精准率": df.loc[df["is_curve"], "accurate_zone"].mean(),
        "弧线球传球成功率": df.loc[df["is_curve"], "completed"].mean(),
        "弧线球→射门率": df.loc[df["is_curve"], "led_to_shot"].mean(),
        "非弧线球落点精准率": df.loc[~df["is_curve"], "accurate_zone"].mean(),
    })
overall = summarize(crosses)
by_player = crosses.groupby("player").apply(summarize).reset_index()
print(overall)
print(by_player.sort_values("弧线球→射门率", ascending=False).head(20))

输出解读要点

  1. 弧线球占比:反映球员/球队传中习惯,一般边锋/边后卫 40%–70%。
  2. 落点精准率:只说明“传到危险区”,不代表队友能接到,需配合接球率看。
  3. 弧线球→射门率:最接近“精准有效”的实战指标,通常精英传中手在 8%–15%。
  4. 对比非弧线球:若弧线球精准率明显高于直传,说明该球员弧线球是有效武器;若相近,则“弧线”只是习惯而非优势。

如果你用的是其他数据源

  • Opta / Wyscout:字段名不同(pass_type、cross、angle),把第 2–3 步的筛选条件换成对应字段即可。
  • 自采数据:至少需要 传球起点/终点坐标、传球类型、后续事件序列,否则“精准度”只能做落点距离,无法做接球/射门转化。

如果你告诉我具体数据源字段结构(StatsBomb open data 的列名、或你 CSV 的表头),我可以把脚本里的字段名和阈值直接改成能跑通的版本。

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

友情链接攻略窝 · 礼包窝 · 配置窝 · 换算窝 · 算法窝 · 查文窝 · 手册窝 · 问答窝 · 全文搜 · 手册库
相关站点礼包窝 · 查文窝