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

wen 实用脚本 1

本文目录导读:

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

  1. 先定义规则
  2. 需要的数据
  3. Python 示例脚本
  4. 输出示例
  5. 如果数据是 StatsBomb / Opta
  6. 进阶版:提高准确性
  7. 最简判断公式

“撞墙式配合”在足球里通常指 二过一 / 踢墙配合,如果你想用脚本统计比赛里完成了多少次,核心是:先定义什么叫“完成一次撞墙配合”,再从数据里识别事件序列。

下面给你一个可落地的方案和示例脚本。


先定义规则

建议这样定义一次成功的撞墙配合:

  1. 球员 A 传球给球员 B
  2. 球员 B 一脚出球 回传给 A
  3. A 在接球后继续推进或传球成功
  4. 整个过程时间间隔很短,≤ 3 秒
  5. 两次传球方向大致相反或形成“墙式回做”

简化版:

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.name
  • pass.recipient.name
  • timestamp
  • team.name

核心判断仍然是:

p1.player == p2.recipient and p1.recipient == p2.player

再加上时间限制。


进阶版:提高准确性

可以加入这些条件:

  1. 一脚出球:B 接球后没有再触球、带球事件
  2. 传球距离:两次传球距离不能太长
  3. 方向变化:A→B 与 B→A 的方向夹角较大
  4. 推进效果:A 第二次接球后位置比第一次更靠前
  5. 排除定位球、界外球、门将开球
# 第二次接球位置比第一次更靠近对方球门
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,我可以直接给你写一份能跑的完整脚本。

上一篇这个实用脚本更信赖经验还是年轻活力?

下一篇当前分类已是最新一篇

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