本文目录导读:

“撞墙式配合”在足球里通常指 二过一 / 踢墙配合,如果你想用脚本统计比赛里完成了多少次,核心是:先定义什么叫“完成一次撞墙配合”,再从数据里识别事件序列。
下面给你一个可落地的方案和示例脚本。
先定义规则
建议这样定义一次成功的撞墙配合:
- 球员 A 传球给球员 B
- 球员 B 一脚出球 回传给 A
- A 在接球后继续推进或传球成功
- 整个过程时间间隔很短,≤ 3 秒
- 两次传球方向大致相反或形成“墙式回做”
简化版:
A 传给 B,B 在 3 秒内直接回传给 A,即计 1 次撞墙配合。
需要的数据
你至少要有事件数据,
| 字段 | 含义 |
|---|---|
| match_id | 比赛 ID |
| event_id | 事件 ID |
| minute | 分钟 |
| second | 秒 |
| team | 球队 |
| player | 球员 |
| event_type | 事件类型,如 pass |
| recipient | 接球人 |
| x, y | 坐标 |
| success | 是否成功 |
Python 示例脚本
假设数据是 CSV,字段如下:
match_id,event_id,minute,second,team,player,event_type,recipient,success,x,y 1,1,10,5,A队,甲,pass,乙,1,30,40 1,2,10,6,A队,乙,pass,甲,1,35,42 1,3,10,9,A队,甲,pass,丙,1,45,50
脚本:统计撞墙式配合次数
import pandas as pd
# 读取数据
df = pd.read_csv("events.csv")
# 只保留成功传球
passes = df[
(df["event_type"] == "pass") &
(df["success"] == 1)
].copy()
# 计算绝对时间(秒)
passes["time_sec"] = passes["minute"] * 60 + passes["second"]
# 按比赛和球队排序
passes = passes.sort_values(["match_id", "team", "time_sec", "event_id"]).reset_index(drop=True)
# 最大间隔,单位:秒
MAX_GAP = 3
count = 0
records = []
# 遍历每一条传球,判断是否和后一条构成撞墙
for i in range(len(passes) - 1):
p1 = passes.iloc[i]
p2 = passes.iloc[i + 1]
# 必须同一场比赛、同一球队
if p1["match_id"] != p2["match_id"]:
continue
if p1["team"] != p2["team"]:
continue
# 时间间隔
gap = p2["time_sec"] - p1["time_sec"]
if gap < 0 or gap > MAX_GAP:
continue
# 核心逻辑:
# p1: A -> B
# p2: B -> A
if p1["player"] == p2["recipient"] and p1["recipient"] == p2["player"]:
count += 1
records.append({
"match_id": p1["match_id"],
"team": p1["team"],
"player_a": p1["player"],
"player_b": p1["recipient"],
"time": f'{p1["minute"]}:{p1["second"]}',
"gap_sec": gap
})
print("撞墙式配合完成次数:", count)
print(pd.DataFrame(records))
输出示例
撞墙式配合完成次数: 1 match_id team player_a player_b time gap_sec 0 1 A队 甲 乙 10:5 1
表示:
- 甲传给乙
- 乙在 1 秒后回传给甲
- 统计为 1 次撞墙配合
如果数据是 StatsBomb / Opta
如果是专业数据,字段名不同,逻辑类似:
StatsBomb 示例字段
type.name == "Pass"player.namepass.recipient.nametimestampteam.name
核心判断仍然是:
p1.player == p2.recipient and p1.recipient == p2.player
再加上时间限制。
进阶版:提高准确性
可以加入这些条件:
- 一脚出球:B 接球后没有再触球、带球事件
- 传球距离:两次传球距离不能太长
- 方向变化:A→B 与 B→A 的方向夹角较大
- 推进效果:A 第二次接球后位置比第一次更靠前
- 排除定位球、界外球、门将开球
# 第二次接球位置比第一次更靠近对方球门
if p2["x"] > p1["x"]:
count += 1
最简判断公式
一次撞墙配合可以抽象为:
Pass(A -> B) + Pass(B -> A) + 时间间隔 <= 3秒
脚本核心就是:
if p1.player == p2.recipient and p1.recipient == p2.player and gap <= 3:
count += 1
如果你把数据格式发我,CSV 表头、StatsBomb JSON、Opta F24,我可以直接给你写一份能跑的完整脚本。