本文目录导读:

你提到的“任意球战术设计”如果是用Python来分析,通常需要先明确分析对象:是比赛视频/追踪数据、事件数据(如StatsBomb、Opta),还是战术板模拟,下面按几种常见场景给出可操作的Python分析思路和案例代码框架。
先明确数据源
| 数据类型 | 来源示例 | 能分析什么 |
|---|---|---|
| 事件数据 | StatsBomb Open Data、Wyscout | 传球序列、跑位、射门位置 |
| 追踪数据 | Metrica Sports、SkillCorner | 球员移动轨迹、防守阵型 |
| 视频 | 自己拍摄/转播 | 用CV做检测跟踪 |
| 战术板 | 手动标注坐标 | 模拟跑位路线 |
最常用的是事件数据 + 追踪数据,因为可以直接量化“战术设计”。
案例:用StatsBomb数据看一次任意球战术
StatsBomb开放数据里有定位球事件(Free Kick、Corner),可以提取一次任意球的完整传球序列。
from statsbombpy import sb
import pandas as pd
import matplotlib.pyplot as plt
from mplsoccer import Pitch
# 1. 加载某场比赛事件
events = sb.events(match_id=3788741) # 示例:某场欧冠
# 2. 筛选任意球相关事件
fk = events[events['type'].isin(['Free Kick', 'Pass', 'Shot', 'Carry'])]
fk = fk.sort_values('index')
# 3. 找一次任意球开始的时刻
start_idx = fk[fk['type'] == 'Free Kick'].index[0]
seq = fk.loc[start_idx:start_idx+8] # 取后续8个事件
# 4. 画战术图
pitch = Pitch(line_color='black')
fig, ax = pitch.draw(figsize=(10, 7))
for _, row in seq.iterrows():
if pd.notna(row.get('location')):
x, y = row['location']
pitch.scatter(x, y, ax=ax, s=100, color='red')
if row['type'] == 'Pass' and pd.notna(row.get('pass_end_location')):
ex, ey = row['pass_end_location']
pitch.arrows(x, y, ex, ey, ax=ax, color='blue', width=1.5)
"任意球战术序列")
plt.show()
怎么看结果:
- 箭头方向 = 传球路线
- 起点集中区 = 任意球发起点
- 后续事件密度 = 战术是“直接射门”还是“短传配合”
- 若出现多次横向传球 → 典型“战术任意球”(training ground routine)
量化战术设计的几个指标
def analyze_free_kick(seq):
metrics = {}
# 传球次数
metrics['num_passes'] = (seq['type'] == 'Pass').sum()
# 是否直接射门
metrics['direct_shot'] = (seq['type'] == 'Shot').any()
# 传球总距离
dist = 0
for _, r in seq[seq['type']=='Pass'].iterrows():
if pd.notna(r.get('pass_end_location')):
x1,y1 = r['location']; x2,y2 = r['pass_end_location']
dist += ((x2-x1)**2 + (y2-y1)**2)**0.5
metrics['total_pass_dist'] = round(dist,1)
# 涉及球员数
metrics['involved_players'] = seq['player'].nunique()
# 进攻方向变化(横向/纵向)
return metrics
print(analyze_free_kick(seq))
解读逻辑:
num_passes高 +direct_shot=False→ 设计型战术任意球total_pass_dist短 → 短传配合(如巴萨式)involved_players多 → 复杂跑位设计- 若第一脚传球方向与球门夹角大 → 故意拉开防守
进阶:追踪数据看跑位设计
如果有追踪数据(如Metrica),可以画球员轨迹,看“谁做掩护、谁跑位”:
import numpy as np
# 假设 tracking_df 有 frame, player_id, x, y
def plot_routine(tracking_df, frames_range):
pitch = Pitch(line_color='black')
fig, ax = pitch.draw(figsize=(10,7))
for pid in tracking_df['player_id'].unique():
sub = tracking_df[(tracking_df['player_id']==pid) &
(tracking_df['frame'].between(*frames_range))]
pitch.plot(sub['x'], sub['y'], ax=ax, linewidth=2, label=str(pid))
ax.legend()
plt.title("任意球跑位轨迹")
plt.show()
看什么:
- 是否有球员做“假跑”吸引防守(轨迹先向外再折返)
- 是否有2-3人同时向禁区同一点跑(掩护配合)
- 防守方是否被拉扯出空档
视频CV方案(较重)
如果只有视频:
- YOLOv8 检测球员/球
- ByteTrack 跟踪
- 单应性变换 把像素坐标映射到球场坐标
- 再套用上面的轨迹分析
# 伪代码
from ultralytics import YOLO
model = YOLO('yolov8x.pt')
results = model.track(video_path, persist=True, classes=[0,32]) # person, sports ball
这一步成本高,一般只有专业分析才做。
实战建议
- 先定问题:你想看“是不是设计好的”还是“执行效果”?前者看跑位/传球序列,后者看xG/xT变化。
- 对比基线:把这次任意球和联赛平均任意球对比(传球数、射门转化率)。
- 可视化优先:mplsoccer画图最直观,先看图再算指标。
- 小样本注意:单次任意球样本太小,结论要谨慎,最好看一个赛季同类战术。
如果你能告诉我:
- 你手头是什么数据(视频/事件/追踪/纯战术板)
- 想分析哪支球队或哪场比赛
我可以给你更具体的代码和“怎么看”的判读标准。