统计“快发任意球”尝试次数的实用脚本方案
下面给你几个不同场景的脚本思路,你可以根据数据来源选用。

基于事件日志(CSV/JSON)统计
假设你的数据里有个事件字段,event_type = "quick_free_kick"。
Python 脚本
import csv
from collections import defaultdict
def count_quick_fk(csv_path, team_field="team", event_field="event_type"):
"""
统计每支球队的快发任意球尝试次数
"""
counts = defaultdict(int)
with open(csv_path, "r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
if row.get(event_field) == "quick_free_kick":
counts[row[team_field]] += 1
return dict(counts)
if __name__ == "__main__":
result = count_quick_fk("events.csv")
for team, n in sorted(result.items(), key=lambda x: -x[1]):
print(f"{team}: {n} 次")
输出示例:
曼城: 5 次
利物浦: 3 次
阿森纳: 2 次
从比赛时间序列里识别“快发”行为
如果日志里没有直接标记,需要自己判断:判罚任意球后 N 秒内就发出。
import csv
from datetime import datetime
QUICK_THRESHOLD_SEC = 5 # 判罚后 5 秒内发出算快发
def parse_time(t):
return datetime.strptime(t, "%H:%M:%S")
def count_quick_fk_by_rules(csv_path):
events = []
with open(csv_path, encoding="utf-8") as f:
for row in csv.DictReader(f):
events.append({
"time": parse_time(row["time"]),
"type": row["event_type"], # foul / free_kick / ...
"team": row["team"],
})
events.sort(key=lambda e: e["time"])
counts = {}
last_foul = None # (time, team)
for e in events:
if e["type"] == "foul_committed":
# 记录被犯规方(对方获得任意球)
last_foul = (e["time"], e["team"])
elif e["type"] == "free_kick_taken" and last_foul:
delta = (e["time"] - last_foul[0]).total_seconds()
if 0 <= delta <= QUICK_THRESHOLD_SEC:
counts[e["team"]] = counts.get(e["team"], 0) + 1
last_foul = None
return counts
⚠️ 注意:最后这个“被犯规方”逻辑要按你数据里
team字段的含义调整(是犯规方还是获利方)。
配合 StatsBomb / Opta 数据
如果用的是 StatsBomb Open Data,任意球事件类型通常是:
type.name == "Free Kick"
快发的判断依据一般看 play_pattern 或上下文时间间隔:
from statsbombpy import sb
def count_quick_fk(match_id):
events = sb.events(match_id=match_id)
fk = events[events["type"] == "Free Kick"]
counts = fk["team"].value_counts().to_dict()
return counts
如果需要“快发”语义,还得结合上一事件是犯规且间隔很短,参考方案二。
一行式快捷统计(pandas)
import pandas as pd
df = pd.read_csv("events.csv")
result = (df[df["event_type"] == "quick_free_kick"]
.groupby("team")
.size()
.sort_values(ascending=False))
print(result)
需要你确认的几点
为了给你更精准的脚本,请告诉我:
- 数据来源:CSV?JSON?StatsBomb?爬虫抓的?
- “快发”的判定标准:是数据里已有标记,还是要按时间差判断?阈值几秒?
- 统计维度:按球队、按球员、还是按比赛?
- 语言偏好:Python / R / SQL / Excel 公式?
确认后我可以直接给你一份可运行的完整脚本。