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

wen 实用脚本 2

本文目录导读:

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

  1. 先说结论:最实用的方案
  2. 一个简化版 Python 脚本示例
  3. 但真实比赛里,还要加这些条件才更准
  4. 如果你只有视频,没有事件数据
  5. 如果你说的是篮球里的“撞墙式配合”
  6. 最实用建议
  7. 你可以直接复制的最简统计逻辑

“撞墙式配合”在足球里通常指 二过一(One-Two / Give-and-Go)。 如果你想要一个实用脚本统计撞墙式配合完成了几次,关键不是“写一个脚本”这么简单,而是要先明确:

你用什么数据? 不同数据源,统计方法完全不一样。


先说结论:最实用的方案

方案 A:你有事件数据(推荐)

StatsBomb、Opta、Wyscout、SkillCorner、车米、雷达数据等。

统计逻辑通常是:

  1. 找到球员 A 传球给球员 B
  2. 球员 B 在很短时间内一脚出球,传回给 A
  3. 且 A 接球后继续推进 / 成功接球
  4. 记为一次撞墙式配合

核心字段一般需要:

  • match_id
  • period
  • timestamp
  • player_id
  • team_id
  • event_type:pass / reception / carry
  • pass_recipient_id
  • x, y
  • end_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

统计逻辑类似:

  1. A 传球给 B
  2. B 立刻回传给 A
  3. A 接球后投篮/突破/继续进攻

只是字段会变成:

  • pass
  • assist
  • screen
  • handoff
  • cut

最实用建议

如果你要真做,我建议你按这个顺序:

第一步:确认数据源

你手里是:

  • 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)

如果你愿意,我可以直接帮你写一个完整可运行脚本。 你只需要告诉我:

  1. 你的数据格式是什么?CSV / JSON / StatsBomb?
  2. 字段有哪些?
  3. 你说的“撞墙式配合”是足球、篮球还是别的?
  4. 你想按球员、球队、比赛统计,还是全场总数?

你把这几个信息发我,我可以给你一版能直接跑的代码。

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