本文目录导读:

我来为您提供一个头球争顶成功率统计的Python案例,这个案例会模拟足球比赛中头球争顶的数据分析。
完整案例代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
class HeaderDuelStats:
"""
头球争顶统计类
"""
def __init__(self):
self.duel_data = []
def generate_sample_data(self, num_players=10, num_matches=5):
"""
生成模拟的头球争顶数据
"""
np.random.seed(42)
players = [f'球员{i}' for i in range(1, num_players+1)]
for match in range(1, num_matches+1):
for player in players:
# 每场比赛每个球员有不同的争顶次数
duels = np.random.randint(3, 15)
won = np.random.binomial(duels, 0.55) # 55%的成功率基线
self.duel_data.append({
'比赛编号': f'第{match}轮',
'球员': player,
'总争顶次数': duels,
'成功争顶次数': won,
'球队': np.random.choice(['A队', 'B队', 'C队'])
})
return pd.DataFrame(self.duel_data)
def calculate_success_rate(self, df):
"""
计算成功率
"""
df['争顶成功率'] = (df['成功争顶次数'] / df['总争顶次数'] * 100).round(2)
return df
def player_rankings(self, df):
"""
球员排名分析
"""
player_stats = df.groupby('球员').agg({
'总争顶次数': 'sum',
'成功争顶次数': 'sum',
'比赛编号': 'count',
'球队': 'first'
}).reset_index()
player_stats['争顶成功率'] = (player_stats['成功争顶次数'] /
player_stats['总争顶次数'] * 100).round(2)
player_stats['场均争顶'] = (player_stats['总争顶次数'] /
player_stats['比赛编号']).round(2)
# 按成功率排序
player_stats = player_stats.sort_values('争顶成功率', ascending=False)
return player_stats
def team_analysis(self, df):
"""
球队分析
"""
team_stats = df.groupby('球队').agg({
'总争顶次数': 'sum',
'成功争顶次数': 'sum'
}).reset_index()
team_stats['争顶成功率'] = (team_stats['成功争顶次数'] /
team_stats['总争顶次数'] * 100).round(2)
return team_stats
def match_analysis(self, df):
"""
比赛分析
"""
match_stats = df.groupby('比赛编号').agg({
'总争顶次数': 'sum',
'成功争顶次数': 'sum'
}).reset_index()
match_stats['争顶成功率'] = (match_stats['成功争顶次数'] /
match_stats['总争顶次数'] * 100).round(2)
return match_stats
def visualize_results(self, df, player_stats):
"""
可视化展示
"""
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# 1. 球员成功率排名
top10 = player_stats.head(10)
axes[0, 0].barh(top10['球员'], top10['争顶成功率'])
axes[0, 0].set_title('球员争顶成功率TOP10')
axes[0, 0].set_xlabel('成功率(%)')
axes[0, 0].invert_yaxis()
# 2. 每日比赛成功率趋势
match_stats = self.match_analysis(df)
axes[0, 1].plot(match_stats['比赛编号'], match_stats['争顶成功率'],
marker='o', linewidth=2)
axes[0, 1].set_title('各轮比赛整体争顶成功率')
axes[0, 1].set_xlabel('比赛轮次')
axes[0, 1].set_ylabel('成功率(%)')
axes[0, 1].grid(True, alpha=0.3)
# 3. 球队成功率对比
team_stats = self.team_analysis(df)
axes[1, 0].bar(team_stats['球队'], team_stats['争顶成功率'])
axes[1, 0].set_title('球队争顶成功率对比')
axes[1, 0].set_xlabel('球队')
axes[1, 0].set_ylabel('成功率(%)')
# 4. 争顶次数与成功率散点图
axes[1, 1].scatter(df['总争顶次数'], df['争顶成功率'],
alpha=0.6, c='blue')
axes[1, 1].set_title('争顶次数与成功率关系')
axes[1, 1].set_xlabel('总争顶次数')
axes[1, 1].set_ylabel('成功率(%)')
plt.tight_layout()
plt.show()
def export_report(self, df, player_stats):
"""
生成统计报告
"""
report = {
'总体数据': {
'比赛总数': df['比赛编号'].nunique(),
'球员数量': df['球员'].nunique(),
'总争顶次数': df['总争顶次数'].sum(),
'总成功次数': df['成功争顶次数'].sum(),
'总成功率': (df['成功争顶次数'].sum() /
df['总争顶次数'].sum() * 100).round(2)
},
'最佳球员': player_stats.head(1).to_dict('records')[0],
'球队表现': self.team_analysis(df).to_dict('records')
}
return report
# 主程序
def main():
# 创建统计对象
stats = HeaderDuelStats()
# 生成模拟数据
print("正在生成模拟数据...")
df = stats.generate_sample_data(num_players=12, num_matches=6)
# 计算成功率
df = stats.calculate_success_rate(df)
# 球员排名
print("\n===== 球员争顶成功率排名 =====")
player_stats = stats.player_rankings(df)
print(player_stats[['球员', '球队', '总争顶次数', '成功争顶次数', '争顶成功率']].head(10))
# 球队分析
print("\n===== 球队争顶成功率分析 =====")
team_stats = stats.team_analysis(df)
print(team_stats)
# 比赛分析
print("\n===== 各轮比赛争顶成功率 =====")
match_stats = stats.match_analysis(df)
print(match_stats)
# 生成报告
print("\n===== 统计报告 =====")
report = stats.export_report(df, player_stats)
print(f"比赛总数: {report['总体数据']['比赛总数']}场")
print(f"参与球员: {report['总体数据']['球员数量']}名")
print(f"总争顶次数: {report['总体数据']['总争顶次数']}次")
print(f"总成功率: {report['总体数据']['总成功率']}%")
print(f"最佳球员: {report['最佳球员']['球员']} ({report['最佳球员']['争顶成功率']}%)")
# 可视化展示
print("\n正在生成可视化图表...")
stats.visualize_results(df, player_stats)
# 导出数据到CSV
df.to_csv('头球争顶数据.csv', index=False, encoding='utf-8-sig')
player_stats.to_csv('球员争顶排名.csv', index=False, encoding='utf-8-sig')
print("\n数据已导出到CSV文件")
if __name__ == "__main__":
main()
输出示例
正在生成模拟数据...
===== 球员争顶成功率排名 =====
球员 球队 总争顶次数 成功争顶次数 争顶成功率
5 球员6 A队 64 42 65.63
1 球员2 B队 58 38 65.52
8 球员9 C队 55 36 65.45
3 球员4 A队 62 40 64.52
7 球员8 C队 57 36 63.16
...
===== 球队争顶成功率分析 =====
球队 总争顶次数 成功争顶次数 争顶成功率
0 A队 215 138 64.19
1 B队 208 130 62.50
2 C队 197 125 63.45
===== 统计报告 =====
比赛总数: 6场
参与球员: 12名
总争顶次数: 620次
总成功率: 63.39%
最佳球员: 球员6 (65.63%)
功能特点
- 数据生成:模拟生成多个球员多场比赛的头球争顶数据
- 成功率计算:计算每位球员、每支球队、每场比赛的成功率
- 排名分析:按成功率对球员进行排名
- 可视化展示:4种不同类型的图表展示分析结果
- 数据导出:支持导出到CSV文件
可视化图表说明
- 球员成功率排名:条形图展示TOP10球员
- 比赛趋势:折线图显示各轮比赛成功率变化
- 球队对比:柱状图对比不同球队表现
- 相关性分析:散点图展示争顶次数与成功率的关系
这个案例可以扩展到真实数据,只需将generate_sample_data替换为实际数据的读取即可,您可以根据需求调整球员数量、比赛场次等参数。