实用脚本统计撞墙式配合完成了几次?

wen 实用脚本 1

统计“撞墙式配合”完成次数的实用脚本

“撞墙式配合”(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 某一种格式来写吗?

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