python案例统计头球争顶成功率如何?

wen python案例 5

本文目录导读:

python案例统计头球争顶成功率如何?

  1. 完整案例代码
  2. 输出示例
  3. 功能特点
  4. 可视化图表说明

我来为您提供一个头球争顶成功率统计的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%)

功能特点

  1. 数据生成:模拟生成多个球员多场比赛的头球争顶数据
  2. 成功率计算:计算每位球员、每支球队、每场比赛的成功率
  3. 排名分析:按成功率对球员进行排名
  4. 可视化展示:4种不同类型的图表展示分析结果
  5. 数据导出:支持导出到CSV文件

可视化图表说明

  1. 球员成功率排名:条形图展示TOP10球员
  2. 比赛趋势:折线图显示各轮比赛成功率变化
  3. 球队对比:柱状图对比不同球队表现
  4. 相关性分析:散点图展示争顶次数与成功率的关系

这个案例可以扩展到真实数据,只需将generate_sample_data替换为实际数据的读取即可,您可以根据需求调整球员数量、比赛场次等参数。

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