本文目录导读:

要统计“犯规战术阻止反击”的次数,需要先明确几个定义,因为不同比赛、不同统计口径差异很大,下面给你一个可落地的实用脚本方案,分两种场景:
先定义什么算“犯规战术阻止反击”
建议用可操作规则,
| 条件 | 说明 |
|---|---|
| ① 犯规发生 | 有犯规事件 |
| ② 反击状态 | 犯规前本方处于由守转攻/快攻 |
| ③ 地点 | 通常在中前场或中场附近 |
| ④ 意图 | 犯规方明显阻止推进(非争抢球) |
| ⑤ 结果 | 反击被中断 |
简化版口径:“在对方由守转攻阶段,中场及前场发生的战术犯规”。
方案 A:手动打点 + Python 脚本统计(最实用)
适合:你自己看录像/直播,按时间戳打点。
数据格式(CSV)
fouls.csv
time,team,zone,phase,is_tactical 12:34,A,mid,counter,1 23:10,B,attacking_third,counter,1 35:02,A,defensive_third,set_attack,0 47:55,B,mid,counter,1
字段说明:
time:比赛时间team:犯规方zone:defensive_third/mid/attacking_thirdphase:counter(反击)/set_attack(阵地)is_tactical:是否战术犯规(1/0)
统计脚本
import pandas as pd
df = pd.read_csv("fouls.csv")
# 口径:中场或前场 + 反击阶段 + 战术犯规
mask = (
df["zone"].isin(["mid", "attacking_third"]) &
(df["phase"] == "counter") &
(df["is_tactical"] == 1)
)
tactical_fouls = df[mask]
print("战术犯规阻止反击次数:", len(tactical_fouls))
print("\n按球队统计:")
print(tactical_fouls.groupby("team").size())
print("\n按区域统计:")
print(tactical_fouls.groupby("zone").size())
# 导出
tactical_fouls.to_csv("tactical_fouls_result.csv", index=False)
输出示例:
战术犯规阻止反击次数: 7
按球队统计:
team
A 4
B 3
按区域统计:
zone
mid 5
attacking_third 2
方案 B:自动识别(半自动,靠事件数据)
如果你有 StatsBomb / Opta / Wyscout 之类事件数据,可以用“反击序列”定义:
逻辑:
- 找到对方一次进攻序列开始(由守转攻)
- 在该序列结束前出现犯规
- 犯规地点在中场/前场
- 序列推进速度/纵向距离超过阈值
伪代码:
def count_tactical_fouls(events):
count = 0
for i, e in enumerate(events):
if e.type == "Foul Committed":
# 往前找最近一次球权转换
prev = find_last_possession_change(events, i)
if prev and prev.new_team == e.team:
# 对方刚拿到球,正在反击
if e.zone in ["mid", "attacking_third"]:
if is_fast_break(events, prev, i):
count += 1
return count
关键函数:
find_last_possession_change:找最近一次球权转换is_fast_break:判断转换后到犯规的时间/推进距离是否达到反击标准
推荐阈值(可根据联赛调整)
| 指标 | 建议阈值 |
|---|---|
| 转换到犯规时间 | ≤ 8 秒 |
| 纵向推进 | ≥ 15 米 |
| 犯规区域 | 中场或前场 |
| 对方人数 | 反击方人数 ≥ 犯规方 |
如果你要直接用的最小脚本
你只需要给我:
- 比赛事件 CSV(时间、球队、区域、阶段)
- 或者你手动打点的表
我可以帮你:
- 写好完整统计脚本
- 自动出“哪队几次、哪分钟、哪区域”
- 生成可视化图
一句话总结:
先定义“反击 + 中场/前场 + 战术犯规”三个条件,然后用 Pandas 过滤 CSV 就能统计,如果你有具体数据格式,我可以直接帮你写成能跑的脚本。