统计“撞墙式配合”完成次数的实用脚本
“撞墙式配合”(One-Two / Give-and-Go)通常指足球比赛中两名球员快速传接配合,如果你有比赛事件数据,可以用以下脚本统计。

数据格式假设
假设 CSV 事件数据格式如下(常见于 StatsBomb、Opta 等):
timestamp,team,player,event_type,receiver 00:12:30,TeamA,Player1,pass,Player2 00:12:32,TeamA,Player2,pass,Player1 00:15:10,TeamA,Player3,pass,Player4 00:15:12,TeamA,Player4,pass,Player3
判定规则:A→B 传球后,B 在短时间窗口内(如 5 秒)回传给 A,即为一次撞墙式配合。
Python 脚本
import pandas as pd
def count_one_twos(csv_path, time_window=5.0, same_team=True):
"""
统计撞墙式配合次数
:param csv_path: 事件数据 CSV
:param time_window: 回传时间窗口(秒)
:param same_team: 是否要求同队
:return: 撞墙配合列表
"""
df = pd.read_csv(csv_path)
# 秒转时间戳
def to_seconds(t):
h, m, s = map(float, t.split(':'))
return h * 3600 + m * 60 + s
df['sec'] = df['timestamp'].apply(to_seconds)
df = df.sort_values('sec').reset_index(drop=True)
one_twos = []
used = set() # 避免重复配对
for i, row in df.iterrows():
if i in used:
continue
# 第一次传球:player -> receiver
a, b, t1 = row['player'], row['receiver'], row['sec']
team1 = row['team']
# 向后找 B -> A 的回传
for j in range(i + 1, len(df)):
nxt = df.iloc[j]
if nxt['sec'] - t1 > time_window:
break
if j in used:
continue
# 判定条件
if (nxt['player'] == b and nxt['receiver'] == a
and (not same_team or nxt['team'] == team1)):
one_twos.append({
'player_a': a,
'player_b': b,
'start': row['timestamp'],
'end': nxt['timestamp'],
'team': team1
})
used.add(i)
used.add(j)
break
return one_twos
if __name__ == '__main__':
result = count_one_twos('events.csv', time_window=5.0)
print(f"撞墙式配合共完成:{len(result)} 次\n")
for r in result:
print(f" {r['start']} - {r['end']} {r['player_a']} ↔ {r['player_b']} ({r['team']})")
运行示例
撞墙式配合共完成:3 次 00:12:30 - 00:12:32 Player1 ↔ Player2 (TeamA) 00:15:10 - 00:15:12 Player3 ↔ Player4 (TeamA) 00:22:01 - 00:22:04 Player5 ↔ Player7 (TeamB)
关键参数调优
| 参数 | 建议值 | 说明 |
|---|---|---|
time_window |
3–6 秒 | 太大易误判,太小易漏判 |
same_team |
True | 除非统计交叉配合 |
| 位置过滤 | 可选 | 加入 x/y 坐标限制传球距离 < 30m |
增强版(加距离限制)
# 如果有 x,y 坐标,可加距离判断
import math
def dist(x1, y1, x2, y2):
return math.hypot(x2 - x1, y2 - y1)
# 判定时增加:
# if dist(row['x'], row['y'], nxt['x'], nxt['y']) < 30:
如果你能提供实际数据格式(列名、是否有坐标、是哪个平台导出的),我可以帮你改成完全适配的脚本,需要我按 StatsBomb / Opta / Wyscout 某一种格式来写吗?