本文目录导读:

在足球数据分析中(如StatsBomb或Wyscout数据),进攻三区通常指距离对方球门最后20米(或球场纵向的最后1/3区域)。
以下是一个基于Pandas和Matplotlib的完整示例,你可以直接复制并根据你的数据结构修改字段名。
假设的数据结构
假设你的数据(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
你的案例分析
如果你需要我针对你的具体代码提供建议,请提供以下信息:
- 你的数据列名是什么?(比如是
X/Y还是location_x?) - 你的“进攻三区”是怎么定义的?是最后20米还是过中线30米?
- 你目前的代码报错信息是什么?
你可以把代码和数据示例发给我,我帮你调整。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播