根据python案例,进攻三区传球成功率?

wen python案例 3

本文目录导读:

根据python案例,进攻三区传球成功率?

  1. 假设的数据结构
  2. 核心计算逻辑(Python代码)
  3. 进阶:按球队/球员分组统计
  4. 可视化展示(条形图)
  5. 如果你遇到“No module named”错误
  6. 你的案例分析

在足球数据分析中(如StatsBomb或Wyscout数据),进攻三区通常指距离对方球门最后20米(或球场纵向的最后1/3区域)。

以下是一个基于PandasMatplotlib的完整示例,你可以直接复制并根据你的数据结构修改字段名。

假设的数据结构

假设你的数据(DataFrame)包含以下列:

  • x:传球起始点的X坐标(0-100,100为对方底线)
  • y:传球起始点的Y坐标(0-100)
  • end_x:传球结束点的X坐标
  • end_y:传球结束点的Y坐标
  • is_success:布尔值(True为成功,False为失败)
  • team:球队名称

核心计算逻辑(Python代码)

import pandas as pd
import numpy as np
# 假设 df 是你的数据框
# df = pd.read_csv('your_data.csv')
def calculate_final_third_success(df, pitch_length=100, final_third_ratio=0.8):
    """
    计算进攻三区传球成功率
    参数:
    df: 包含传球数据的DataFrame
    pitch_length: 球场长度(通常为100)
    final_third_ratio: 进攻三区起始点比例(0.8表示最后20%区域)
    """
    # 定义进攻三区边界(假设X轴从0(本方底线)到100(对方底线))
    final_third_start = pitch_length * final_third_ratio  # 通常是80米
    # 过滤条件:传球起始点必须在进攻三区(或传入进攻三区)
    # 场景1:传球发生在进攻三区(起始点在80-100之间)
    in_final_third = df[df['x'] >= final_third_start]
    # 场景2:传球传入进攻三区(起始点<80,但终点>=80)
    into_final_third = df[(df['x'] < final_third_start) & (df['end_x'] >= final_third_start)]
    # 合并场景(根据需求选择,通常统计“在进攻三区内的传球”)
    final_third_passes = pd.concat([in_final_third, into_final_third])
    # 计算成功率
    total_passes = len(final_third_passes)
    successful_passes = final_third_passes['is_success'].sum()
    success_rate = np.round(successful_passes / total_passes * 100, 2) if total_passes > 0 else 0
    # 输出明细
    print(f"进攻三区总传球次数: {total_passes}")
    print(f"成功传球次数: {successful_passes}")
    print(f"进攻三区传球成功率: {success_rate}%")
    return {
        'total_passes': total_passes,
        'successful': successful_passes,
        'success_rate': success_rate,
        'data': final_third_passes  # 返回筛选后的数据供进一步分析
    }
# 示例调用
result = calculate_final_third_success(df)

进阶:按球队/球员分组统计

# 按球队分组计算进攻三区成功率
def team_final_third_stats(df):
    final_third_start = 80  # 假设100制球场
    # 筛选进攻三区传球
    final_third_df = df[df['x'] >= final_third_start]
    # 分组聚合
    stats = final_third_df.groupby('team').agg(
        total_passes=('is_success', 'count'),
        successful_passes=('is_success', 'sum')
    ).reset_index()
    # 计算成功率
    stats['success_rate'] = np.round(stats['successful_passes'] / stats['total_passes'] * 100, 2)
    return stats.sort_values('success_rate', ascending=False)
# 使用
team_stats = team_final_third_stats(df)
print(team_stats)

可视化展示(条形图)

import matplotlib.pyplot as plt
import seaborn as sns
# 设置中文字体(防止乱码)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 或 ['Arial Unicode MS'] for Mac
plt.rcParams['axes.unicode_minus'] = False
def plot_success_rate(stats_df):
    plt.figure(figsize=(10, 6))
    sns.barplot(x='team', y='success_rate', data=stats_df, palette='viridis')
    plt.title('各球队进攻三区传球成功率对比')
    plt.ylabel('成功率 (%)')
    plt.xlabel('球队')
    plt.ylim(0, 100)
    # 在柱子上显示数值
    for index, row in stats_df.iterrows():
        plt.text(index, row['success_rate'] + 2, f"{row['success_rate']:.1f}%", 
                ha='center', va='bottom')
    plt.tight_layout()
    plt.show()
# 调用可视化
plot_success_rate(team_stats)

如果你遇到“No module named”错误

如果运行报错,请先在终端安装依赖库:

pip install pandas matplotlib seaborn numpy

你的案例分析

如果你需要我针对你的具体代码提供建议,请提供以下信息:

  1. 你的数据列名是什么?(比如是 X/Y 还是 location_x?)
  2. 你的“进攻三区”是怎么定义的?是最后20米还是过中线30米?
  3. 你目前的代码报错信息是什么?

你可以把代码和数据示例发给我,我帮你调整。

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