本文目录导读:

这是一个非常具体的需求,通常出现在足球(篮球/手球)高阶数据分析中,目前没有一个统一的、开箱即用的开源项目叫“统计界外球进攻威胁次数”,因为“威胁”是高度主观的指标,且需要结合事件数据(Event Data)和追踪数据(Tracking Data)。
我们可以基于现有的开源生态,组合出一个解决方案来实现这个统计。
以下是具体实现思路和推荐的开源工具组合:
定义“威胁次数”(这是核心)
在写代码前,需要先定义清楚什么叫“威胁”,否则统计没有意义,可以有几种量化标准(按难度递增):
- 基准版(基于区域):界外球掷入前场(如对方半场)或最后30米区域,且球的落点在禁区内或罚球区附近,记为1次威胁。
- 进阶版(基于后续事件):界外球掷出后,10秒内(或控球权未丢失前)触发了射门、传球入禁区、角球等事件,记为1次威胁。
- 高级版(基于预期进球模型):界外球落点形成了射门,计算该落点的 xG(预期进球值),累计所有界外球引发的xG作为威胁评分。
开源工具与数据源推荐
由于没有现成的命令行工具,我们需要用代码实现,以下是最好的开源资源:
A. 数据获取(Play-by-Play数据)
- StatsBombR (R语言) / statsbombpy (Python)
- 开源且数据免费,包含完整的“Throw-in”(界外球)事件,且标注了开始坐标和结束坐标。
- 这是最适合做此统计的数据源,几乎所有的欧洲主流联赛数据都有。
B. 核心计算逻辑库
- kloppy (Python)
标准化的足球数据解析库,支持将界外球数据标准化为统一的坐标系,方便计算区域。
- mplsoccer (Python)
用于绘制球场和统计区域,可以直观验证你的“威胁区域”是否定义正确。
C. 高级模型(可选)
- Mathematical-analysis-of-football(GitHub常见项目):用于计算传球威胁度。
代码实现方案(Python示例)
假设我们使用 statsbombpy 获取英超数据,统计某一个赛季所有球队的界外球进攻威胁次数。
import pandas as pd
from statsbombpy import sb
from mplsoccer import Pitch
# 1. 加载数据(曼城 vs 利物浦,比赛ID为 3788741)
# 实际上需要循环所有比赛,这里仅展示逻辑
df = sb.events(match_id=3788741)
# 2. 筛选界外球事件
throw_ins = df[(df['type'] == 'Throw-in')]
# 3. 定义“威胁”的判定函数
def is_threatening(row):
# 设球门在右侧,坐标范围 0-120(x轴),0-80(y轴)
# 威胁判定:界外球落点(end_location)在对方禁区内 或 距离底线20米内
try:
end_x = row['end_location'][0] # 落点X坐标
end_y = row['end_location'][1] # 落点Y坐标
except (TypeError, IndexError):
return False # 没有落点信息的界外球不算
# 假设我们分析的是左侧进攻方向,如果界外球发生在前场(x > 80)
if end_x > 80: # 进入对方半场(高威胁区域)
# 并且在对方禁区(罚球区)或宽度(y)在禁区附近
if 102 <= end_x <= 120 or (end_x >= 100 and 18 <= end_y <= 62):
return True
return False
# 4. 计算威胁次数
threat_count = throw_ins.apply(is_threatening, axis=1).sum()
# 5. 按球队汇总
result = throw_ins[['team', 'minute']].copy()
result['is_threat'] = throw_ins.apply(is_threatening, axis=1)
summary = result.groupby('team')['is_threat'].sum().reset_index()
summary.columns = ['队伍', '界外球威胁次数']
print(summary)
进阶版本(基于后续事件):
如果你要统计“界外球形成射门的威胁”,需要在界外球事件后,筛选出下一个控球事件(possession列)中,若发生射门或传球入禁区,则计数。
直接可用的训练好的模型项目
如果你需要更专业、无需自己写逻辑的:
- 足球数据爬虫与分析系统(GitHub: footballdata-analyze):部分项目自带“攻防威胁指数”模块,但通常做的是传球数据,针对界外球的较少。
- StatsBomb的Freeze Frame数据:如果有兴趣做射门前的界外球作用,可以查 Shot事件中的
freeze_frame,里面包含该射门事件的“先前恢复比赛类型”,如果是Throw-in,就计入统计。
替代方案(不写代码)
如果你非开发人员,也可以使用现成的开源BI工具配合数据包:
- Power BI + StatsBomb开源数据:建立事件数据模型,直接筛选
type = Throw-in,然后用地图可视化选择“落在对方禁区”的界外球数量。
| 指标 | 建议开源工具 | 实现难度 |
|---|---|---|
| 统计前场界外球数 | statsbombpy + pandas |
简单 |
| 统计进入禁区的界外球数 | mplsoccer(用于确认区域) |
简单 |
| 统计引发射门的界外球(xG累计) | statsbombpy + xG模型 |
中等 |
推荐步骤:使用 statsbombpy 获取数据,用地图形状定义禁区(使用 mplsoccer),然后用 pandas 做筛选即可,目前社区公认的标准是StatsBomb数据,用它做“界外球威胁”统计是准确且可复现的。