python案例怎么看两队边路突破能力对比?

wen python案例 1

Python 分析两队边路突破能力对比

下面给你一个完整的案例,从数据获取 → 指标构建 → 可视化对比全流程。

python案例怎么看两队边路突破能力对比?

核心思路

边路突破能力可以从这几个维度衡量:

指标 含义
边路进攻占比 从边路发起的进攻比例
成功过人次数 边路球员1v1突破
传中次数/成功率 突破后终结能力
边路进球/助攻 最终产出
推进距离 边路带球推进

数据准备(模拟示例)

实际可用 statsbombpy、football-data、mplsoccer 等库,这里先用模拟数据演示。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 模拟两队边路数据
data = {
    '指标': ['边路进攻占比(%)', '成功过人(次)', '传中次数', '传中成功率(%)',
             '边路进球', '边路助攻', '场均推进距离(m)'],
    'A队': [42, 18, 24, 33, 3, 5, 1850],
    'B队': [35, 12, 19, 26, 1, 2, 1420]
}
df = pd.DataFrame(data)
print(df)

雷达图对比(最直观)

from math import pi
# 归一化到0-1,方便雷达图显示
df_norm = df.copy()
for col in ['A队', 'B队']:
    df_norm[col] = df[col] / df[col].max()
categories = df['指标'].tolist()
N = len(categories)
angles = [n / float(N) * 2 * pi for n in range(N)]
angles += angles[:1]
fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(polar=True))
for team, color in zip(['A队', 'B队'], ['#e74c3c', '#3498db']):
    values = df_norm[team].tolist()
    values += values[:1]
    ax.plot(angles, values, color=color, linewidth=2, label=team)
    ax.fill(angles, values, color=color, alpha=0.25)
ax.set_xticks(angles[:-1])
ax.set_xticklabels(categories, fontsize=11)
ax.set_title('两队边路突破能力雷达图', fontsize=14, pad=20)
ax.legend(loc='upper right', bbox_to_anchor=(1.3, 1.1))
plt.show()

柱状图对比(精确数值)

fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# 左图:绝对数值
df.set_index('指标')[['A队', 'B队']].T.plot(
    kind='bar', ax=axes[0], color=['#e74c3c', '#3498db'],
    edgecolor='black'
)
axes[0].set_title('边路突破指标绝对值对比')
axes[0].tick_params(axis='x', rotation=0)
# 右图:A队相对B队的优势百分比
df['优势%'] = (df['A队'] - df['B队']) / df['B队'] * 100
sns.barplot(x='优势%', y='指标', data=df, ax=axes[1],
            palette='RdYlGn', hue='指标', legend=False)
axes[1].axvline(0, color='black', linewidth=1)
axes[1].set_title('A队相对B队的优势 (%)')
plt.tight_layout()
plt.show()

热力图:边路活动区域对比

如果你有球员坐标数据(如 StatsBomb 事件数据),可以画活动热图:

import matplotlib.patches as patches
def plot_side_heat(events, team_name, ax):
    """绘制边路活动热图(半场)"""
    # 筛选边路区域事件(x < 宽度三分之一 或 > 三分之二)
    left = events[(events['x'] < 20) & (events['team'] == team_name)]
    right = events[(events['x'] > 60) & (events['team'] == team_name)]
    side_events = pd.concat([left, right])
    sns.kdeplot(
        x=side_events['x'], y=side_events['y'],
        fill=True, cmap='Reds', levels=15, ax=ax
    )
    # 画球场
    pitch = patches.Rectangle((0, 0), 80, 60, linewidth=2,
                              edgecolor='black', facecolor='none')
    ax.add_patch(pitch)
    ax.set_xlim(0, 80); ax.set_ylim(0, 60)
    ax.set_title(f'{team_name} 边路活动热图')
    ax.axis('off')
# 示例调用(需要有 events 数据)
# fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# plot_side_heat(events, 'A队', axes[0])
# plot_side_heat(events, 'B队', axes[1])

用真实数据(StatsBomb 免费数据)

from statsbombpy import sb
from mplsoccer import Pitch
# 下载免费比赛数据(如欧冠决赛)
matches = sb.matches(competition_id=16, season_id=4)
events = sb.events(match_id=matches.iloc[0]['match_id'])
# 筛选过人事件
dribbles = events[events['type'] == 'Dribble']
# 筛选边路区域过人
dribbles['is_wide'] = (dribbles['location'].apply(
    lambda loc: loc[1] < 18 or loc[1] > 50)  # 场地宽80,边路区域
)

输出结论示例

# 综合评分
weights = {'成功过人(次)': 0.3, '传中成功率(%)': 0.25,
           '边路助攻': 0.25, '场均推进距离(m)': 0.2}
df['A队_score'] = sum(df.loc[df['指标']==k, 'A队'].values[0] * v
                      for k, v in weights.items())
df['B队_score'] = sum(df.loc[df['指标']==k, 'B队'].values[0] * v
                      for k, v in weights.items())
print(f"A队边路综合分: {df['A队_score'].iloc[0]:.1f}")
print(f"B队边路综合分: {df['B队_score'].iloc[0]:.1f}")
print(f"优势方: {'A队' if df['A队_score'].iloc[0] > df['B队_score'].iloc[0] else 'B队'}")

关键建议

  1. 数据源:免费可用 statsbombpy,商业可用 Opta / Wyscout
  2. 指标标准化:不同量纲要归一化或 Z-score
  3. 可视化:雷达图看整体,柱状图看细节,热图看空间分布
  4. 结合比赛情境:对手强弱、主客场、比分状态都会影响边路数据

如果你有具体的数据文件(CSV/Excel)或想针对某场比赛分析,可以告诉我,我帮你写针对性的代码。

上一篇python案例认为边路传中是得分利器吗?

下一篇当前分类已是最新一篇

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