实用脚本统计快发任意球尝试几次?

wen 实用脚本 3

统计“快发任意球”尝试次数的实用脚本方案

下面给你几个不同场景的脚本思路,你可以根据数据来源选用。

实用脚本统计快发任意球尝试几次?


基于事件日志(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)

需要你确认的几点

为了给你更精准的脚本,请告诉我:

  1. 数据来源:CSV?JSON?StatsBomb?爬虫抓的?
  2. “快发”的判定标准:是数据里已有标记,还是要按时间差判断?阈值几秒?
  3. 统计维度:按球队、按球员、还是按比赛?
  4. 语言偏好:Python / R / SQL / Excel 公式?

确认后我可以直接给你一份可运行的完整脚本。

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