本文目录导读:

“撞墙式配合”在足球里通常指 二过一(One-Two / Give-and-Go)。 如果你想要一个实用脚本统计撞墙式配合完成了几次,关键不是“写一个脚本”这么简单,而是要先明确:
你用什么数据? 不同数据源,统计方法完全不一样。
先说结论:最实用的方案
方案 A:你有事件数据(推荐)
StatsBomb、Opta、Wyscout、SkillCorner、车米、雷达数据等。
统计逻辑通常是:
- 找到球员 A 传球给球员 B
- 球员 B 在很短时间内一脚出球,传回给 A
- 且 A 接球后继续推进 / 成功接球
- 记为一次撞墙式配合
核心字段一般需要:
match_idperiodtimestampplayer_idteam_idevent_type:pass / reception / carrypass_recipient_idx, yend_x, end_y
一个简化版 Python 脚本示例
假设你有这样一份事件数据 events.csv:
match_id,period,timestamp,team_id,player_id,event_type,recipient_id,start_x,start_y,end_x,end_y 1,1,00:00:01,10,1001,pass,1002,30,40,45,50 1,1,00:00:02,10,1002,pass,1001,45,50,60,55 1,1,00:00:04,10,1003,pass,1004,20,30,35,35 1,1,00:00:05,10,1004,pass,1003,35,35,50,40
你可以用这个脚本统计:
import pandas as pd
# 读取事件数据
df = pd.read_csv("events.csv")
# 只保留传球事件
passes = df[df["event_type"] == "pass"].copy()
# 按时间排序
passes = passes.sort_values(["match_id", "period", "timestamp"]).reset_index(drop=True)
# 时间阈值:B 接球后多少秒内回传才算撞墙
TIME_THRESHOLD = 3.0 # 秒
def parse_time(t):
"""把 mm:ss 或 hh:mm:ss 转成秒"""
parts = list(map(int, str(t).split(":")))
if len(parts) == 2:
return parts[0] * 60 + parts[1]
elif len(parts) == 3:
return parts[0] * 3600 + parts[1] * 60 + parts[2]
return float(t)
passes["time_sec"] = passes["timestamp"].apply(parse_time)
one_two_count = 0
records = []
for i in range(len(passes) - 1):
p1 = passes.iloc[i]
p2 = passes.iloc[i + 1]
# 必须同一场比赛、同一阶段、同一球队
if not (
p1["match_id"] == p2["match_id"]
and p1["period"] == p2["period"]
and p1["team_id"] == p2["team_id"]
):
continue
# 时间间隔
dt = p2["time_sec"] - p1["time_sec"]
if dt < 0 or dt > TIME_THRESHOLD:
continue
# 第一脚:A -> B
# 第二脚:B -> A
if p1["player_id"] == p2["recipient_id"] and p1["recipient_id"] == p2["player_id"]:
one_two_count += 1
records.append({
"match_id": p1["match_id"],
"period": p1["period"],
"time": p1["timestamp"],
"player_a": p1["player_id"],
"player_b": p1["recipient_id"],
})
print("撞墙式配合次数:", one_two_count)
print(pd.DataFrame(records))
这个脚本能统计:
A 传给 B,B 在 3 秒内又传回给 A 的次数。
但真实比赛里,还要加这些条件才更准
上面只是“基础版”,如果要做得更实用,建议加:
① 时间阈值
常见是:
- 5 秒内
- 2 秒内
- 3 秒内
太慢就不像撞墙了。
② 传球方向
真正的撞墙式配合通常有:
- A 向前传
- B 回做
- A 继续前插接球
所以可以加:
# 第一脚传球向前 p1_forward = p1["end_x"] > p1["start_x"] # 第二脚回传 p2_backward = p2["end_x"] < p2["start_x"]
③ 成功接球
如果第二脚传回后 A 没接到,就不该算“完成”。
需要接球事件或控球事件来验证。
④ 排除死球、定位球
- 界外球
- 角球
- 任意球
- 门将开球
这些一般不算运动战撞墙配合。
⑤ 排除同一次进攻中的连续反弹
避免把普通倒脚误判成撞墙。
如果你只有视频,没有事件数据
那就不能靠简单脚本了,需要:
- 目标检测:识别球员
- 跟踪:跟踪球员 ID
- 球检测:识别足球
- 传球识别:判断球从谁到谁
- 事件判定:判断是否 A->B->A
这类方案可以用:
- YOLO + ByteTrack
- SoccerNet
- Roboflow Sports
- OpenCV + 手动标注
但开发成本高很多,不如直接买/找事件数据。
如果你说的是篮球里的“撞墙式配合”
篮球里更接近的是:
- 手递手
- 挡拆后回传
- 传切配合
- Give-and-Go
统计逻辑类似:
- A 传球给 B
- B 立刻回传给 A
- A 接球后投篮/突破/继续进攻
只是字段会变成:
passassistscreenhandoffcut
最实用建议
如果你要真做,我建议你按这个顺序:
第一步:确认数据源
你手里是:
- CSV?
- JSON?
- StatsBomb?
- Opta?
- 视频?
- 手动记录?
第二步:定义“完成”
必须明确:
- 几秒内回传?
- 要不要向前?
- 要不要成功接球?
- 要不要排除定位球?
第三步:写脚本
如果是事件数据,Python + pandas 最合适。
第四步:人工校验
先抽 10 个回合看脚本判得准不准,再调阈值。
你可以直接复制的最简统计逻辑
# 伪代码
count = 0
for each pass in match:
if pass.player == A and pass.recipient == B:
next_pass = get_next_pass()
if next_pass.player == B and next_pass.recipient == A:
if time_diff <= 3:
count += 1
print(count)
如果你愿意,我可以直接帮你写一个完整可运行脚本。 你只需要告诉我:
- 你的数据格式是什么?CSV / JSON / StatsBomb?
- 字段有哪些?
- 你说的“撞墙式配合”是足球、篮球还是别的?
- 你想按球员、球队、比赛统计,还是全场总数?
你把这几个信息发我,我可以给你一版能直接跑的代码。