本文目录导读:

我来为您提供一个头球争顶成功率统计的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替换为实际数据的读取即可,您可以根据需求调整球员数量、比赛场次等参数。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播