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

wen python案例 3

本文目录导读:

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

  1. 场景一:基于球队赛季平均数据的对比(简单可视化)
  2. 场景二:基于事件流数据(逐球分析)的实战对比
  3. 关键指标速查表(对比时看哪些数字)
  4. 进阶:如果数据包含球员位置(有“边锋”位置标记)
  5. 我该用哪种?

在足球数据分析中,比较两队边路突破能力,通常需要通过进攻宽度、下底传中、1对1过人、边路推进速度等维度来量化。

由于你没有提供具体的Python代码或数据结构,我假设你的数据是球队级的(如场均数据)或球员级的(如事件流数据),我为你提供两种主流场景下的Python分析思路和代码范式。


基于球队赛季平均数据的对比(简单可视化)

如果你的数据是类似 Team, 边路进攻占比, 成功传中次数, 过人成功率, 下底传中次数 的DataFrame,直接对比图表即可。

Python代码示例(使用Pandas + Matplotlib):

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 示例数据(假设你从CSV或数据库读入)
data = {
    'Team': ['Team A', 'Team B'],
    '边路进攻占比(%)': [45, 52],        # 边路发起进攻的比例
    '场均下底传中': [18, 25],           # 下底传中次数
    '场均成功传中': [4.5, 7.2],         # 成功找到队友的传中
    '边路1对1过人成功率(%)': [50, 62],  # 边路突破效率
    '场均夺回球权后推进距离(m)': [150, 220]  # 推进距离
}
df = pd.DataFrame(data)
df.set_index('Team', inplace=True)
# 创建雷达图来直观对比(雷达图最适合多维能力对比)
def radar_plot(df):
    labels = df.columns.tolist()
    angles = np.linspace(0, 2 * np.pi, len(labels), endpoint=False).tolist()
    angles += angles[:1]  # 闭合图形
    fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(polar=True))
    for team in df.index:
        values = df.loc[team].values.tolist()
        # 归一化(这里简单处理,按最大值归一)
        values = (values - values.min()) / (values.max() - values.min())
        values += values[:1]
        ax.plot(angles, values, linewidth=1, linestyle='solid', label=team)
        ax.fill(angles, values, alpha=0.25)
    ax.set_xticks(angles[:-1])
    ax.set_xticklabels(labels)
    ax.legend(loc='upper right', bbox_to_anchor=(1.1, 1.1))
    plt.title('两队边路突破能力对比雷达图')
    plt.show()
radar_plot(df)
# 另外可以输出一个具体的得分公式(加权)
# 边路威胁指数 = 0.3*占比 + 0.3*传中成功率 + 0.4*过人成功率
df['边路威胁指数'] = (df['边路进攻占比(%)']*0.3 + 
                   (df['场均成功传中']/df['场均下底传中'])*100*0.3 +  # 传中成功率
                   df['边路1对1过人成功率(%)']*0.4)
print(df[['边路威胁指数']].sort_values('边路威胁指数', ascending=False))

适用场景: 快速给教练组看结论,知道哪只球队整体边路“更猛”。


基于事件流数据(逐球分析)的实战对比

如果你有逐事件的XML/JSON数据(如StatsBomb或Wyscout数据),你可以精确分析“边路突破”的具体过程。

定义“边路突破”

  • 位置在X < 25或X > 75(球场宽度坐标)。
  • 动作是Carry(推进)或Dribble(过人)。
  • 成功后方向是向对方底线或禁区(Y轴变大)。
  • 突破成功标志:过人后控制住球权,或制造了犯规/角球/传中。

Python代码示例(模拟事件流):

import pandas as pd
# 假设你有两队的边路事件数据,包含字段:team, event_type, x, y, end_x, end_y, outcome
# 这里模拟一些数据
sample_data = [
    {'team': 'TeamA', 'event': 'dribble', 'x': 10, 'y': 30, 'success': True},
    {'team': 'TeamA', 'event': 'pass', 'x': 8, 'y': 45, 'success': True},
    {'team': 'TeamB', 'event': 'carry', 'x': 20, 'y': 60, 'success': False},
    # ... 省略更多
]
df_events = pd.DataFrame(sample_data)
def analyze_wide_breakthrough(df, team_name):
    # 筛选该队边路事件(x<25或x>75,且y值在中前场或对方半场)
    wide_events = df[(df['team'] == team_name) & 
                     ((df['x'] < 25) | (df['x'] > 75))]
    # 1. 边路进攻次数(尝试突破)
    attempts = len(wide_events)
    # 2. 成功突破次数(outcome为success)
    successful = len(wide_events[wide_events['success'] == True])
    # 3. 突破成功率
    success_rate = successful / attempts if attempts else 0
    # 4. 平均推进距离(假设有end_y - y)
    # 这里简化示例,假设有推进距离列
    if 'progress_distance' in wide_events.columns:
        avg_distance = wide_events['progress_distance'].mean()
    else:
        avg_distance = "数据缺失,需额外计算"
    return {
        '边路尝试次数': attempts,
        '成功突破次数': successful,
        '成功率(%)': round(success_rate*100, 2),
        '平均每次推进距离(m)': avg_distance
    }
# 获取两队对比结果
result_a = analyze_wide_breakthrough(df_events, 'TeamA')
result_b = analyze_wide_breakthrough(df_events, 'TeamB')
comparison = pd.DataFrame([result_a, result_b], index=['TeamA', 'TeamB'])
print(comparison)
# 可视化:绘制边路区域热力图(展示在哪条边路更活跃)
# 需要安装 matplotlib 和 numpy
import matplotlib.pyplot as plt
import numpy as np
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
for ax, team in zip(axes, ['TeamA', 'TeamB']):
    team_data = df_events[(df_events['team'] == team) & 
                          ((df_events['x'] < 25) | (df_events['x'] > 75))]
    if team_data.empty:
        continue
    # 简化:只用x和y坐标画散点热力
    heatmap, xedges, yedges = np.histogram2d(team_data['x'], team_data['y'], bins=20, range=[[0, 100], [0, 100]])
    ax.imshow(heatmap.T, origin='lower', cmap='Reds', extent=[0, 100, 0, 100])
    ax.set_title(f'{team} 边路活动热力图(越红越活跃)')
    ax.set_xlabel('横向 (X坐标)')
    ax.set_ylabel('纵向 (Y坐标)')
    # 标出两条边路区域
    ax.axvspan(0, 25, alpha=0.2, color='blue')
    ax.axvspan(75, 100, alpha=0.2, color='blue')
plt.tight_layout()
plt.show()

关键指标速查表(对比时看哪些数字)

维度 核心指标 说明
宽度利用能力 场均边路传球次数 球队是否愿意把球倒到边上
突破能力 边路1对1次数 & 成功率 能否硬解防守
传中威胁 运动战传中次数 & 禁区内触球 下底后的威胁程度
攻防转换 边路夺回球权后推进速度 攻转守的犀利程度
区域侧重 左路 vs 右路 活动占比 对手的劣势边路在哪

进阶:如果数据包含球员位置(有“边锋”位置标记)

你可以用 groupby('position') 筛选出 LW(左翼)和 RW(右翼)的球员,再对比他们的一对一人均次数:

# 假设有球员位置列
player_df = pd.DataFrame({
    'position': ['LW', 'RW', 'LW', 'RW'],
    'dribbles': [3, 5, 2, 4],
    'dribbles_success': [1, 3, 0, 2]
})
# 计算边锋场均突破
player_df['成功过人率'] = player_df['dribbles_success'] / player_df['dribbles']
print(player_df.groupby('position').mean())

我该用哪种?

  • 如果你只有官网的赛后统计表格(比如控球率、传球次数),用场景一(雷达图)。
  • 如果你有一整年的事件流数据(比如从 sportsdataverseStatsBomb 下载的),用场景二(精确计算)。

你需要我针对某个特定的数据格式(如CSV表头是怎么样)或某个特定指标(如下底传中成功率)再拆解一下吗?你可以把字段名发给我,我帮你改一下代码。

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