本文目录导读:

这段 Python 案例是如何统计/显示“横传转移球次数”的? 但你这条消息里没有附上代码或数据,所以我没法针对具体实现逐行解释。
下面我给你一个可直接运行的 Python 示例,演示如何从传球数据中统计“横传转移球次数”,并说明关键判定逻辑,你可以把它套到你的案例上。
什么是“横传转移球”?
通常可定义为:
球员 A 将球传给球员 B,且这次传球明显改变了进攻方向(从左路到右路,或从右路到左路),即横向转移。
常见判定方式(任选或组合):
- 按传球前后 x 坐标变化:
传球起点与终点的 y 方向位移大、x 方向位移小(即横向移动为主)。 - 按球场区域:
从一侧边路/肋部传到另一侧。 - 按传球角度:
传球方向与球场纵轴夹角接近 90°。 - 按“转移”标签:
数据里已有is_switch/cross_field等字段。
示例代码:统计横传转移球次数
假设你有这样的传球数据(CSV):
passer,receiver,x_start,y_start,x_end,y_end A,B,20,10,22,60 B,C,22,60,40,65 C,D,40,65,38,15 D,E,38,15,60,18 E,F,60,18,58,70
- 球场坐标:x 为纵向(0~100),y 为横向(0~100)。
- 判定“横传转移”:|Δy| ≥ 30 且 |Δx| ≤ 15(横向位移大、纵向位移小)。
import pandas as pd
# 读取数据
df = pd.read_csv("passes.csv")
# 计算位移
df["dx"] = df["x_end"] - df["x_start"]
df["dy"] = df["y_end"] - df["y_start"]
# 判定横传转移球
df["is_switch"] = (df["dy"].abs() >= 30) & (df["dx"].abs() <= 15)
# 统计次数
switch_count = df["is_switch"].sum()
print("横传转移球次数:", switch_count)
# 显示具体是哪几次
print(df[df["is_switch"]][["passer", "receiver", "x_start", "y_start", "x_end", "y_end"]])
输出示例:
横传转移球次数: 2
passer receiver x_start y_start x_end y_end
0 A B 20 10 22 60
4 E F 60 18 58 70
如果你要“按球员/球队统计”
# 按传球者统计
switch_by_passer = df[df["is_switch"]].groupby("passer").size()
print(switch_by_passer)
# 按球队统计(如果数据有 team 列)
# switch_by_team = df[df["is_switch"]].groupby("team").size()
更贴近足球数据的判定(可选)
如果你用的是 StatsBomb / Opta / Wyscout 数据,常见做法:
- StatsBomb:用
pass.end_location与pass.start_location计算角度; - 判定
abs(angle) > 60°且传球距离 > 15m 为转移; - 或直接用
pass.switch字段(部分数据有)。
示例(角度法):
import numpy as np
df["angle"] = np.degrees(np.arctan2(df["dy"], df["dx"]))
df["is_switch_angle"] = (df["angle"].abs() > 60) & (np.hypot(df["dx"], df["dy"]) > 15)
print("按角度判定横传转移球次数:", df["is_switch_angle"].sum())
你需要我做什么?
请把你的案例代码/数据字段发我(或截图),我可以帮你:
- 指出它具体用哪个字段/条件判定横传转移;
- 解释为什么这样判定;
- 帮你修改阈值或增加按球员/球队统计;
- 如果代码有 bug(比如次数不对),帮你排查。
你可以直接贴代码,我按你的案例逐行说明。