综合python案例,边路传中成功率对比?

wen python案例 3

本文目录导读:

综合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
import warnings
warnings.filterwarnings('ignore')
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
class FootballCrossingAnalysis:
    """
    足球边路传中成功率分析系统
    """
    def __init__(self):
        self.data = None
        self.team_stats = None
        self.player_stats = None
    def generate_synthetic_data(self, teams=10, matches_per_team=20):
        """
        生成模拟数据
        """
        np.random.seed(42)
        team_names = [f'球队{i+1}' for i in range(teams)]
        player_names = []
        # 为每支球队生成球员数据
        for team in team_names:
            for j in range(15):  # 每队15名球员
                player_names.append(f'{team}球员{j+1}')
        # 生成比赛数据
        match_data = []
        for team1 in team_names:
            for team2 in team_names:
                if team1 != team2:
                    for match_num in range(matches_per_team // 2):
                        # 计算双方传中数据
                        for team, opponent in [(team1, team2), (team2, team1)]:
                            # 随机生成传中次数
                            crosses = np.random.randint(15, 35)
                            # 生成成功次数(受队伍实力影响)
                            success_rate = np.random.uniform(0.25, 0.45)
                            successful = int(crosses * success_rate)
                            match_data.append({
                                '比赛编号': f'{datetime.now().strftime("%Y%m%d")}_{match_num+1}',
                                '球队': team,
                                '对手': opponent,
                                '传中次数': crosses,
                                '成功传中': successful,
                                '成功率': successful / crosses * 100,
                                '传中方向': np.random.choice(['左侧', '右侧'], p=[0.5, 0.5]),
                                '比赛日期': f'2024-{np.random.randint(1,5):02d}-{np.random.randint(1,28):02d}',
                                '主客场': np.random.choice(['主场', '客场'])
                            })
        self.data = pd.DataFrame(match_data)
        # 生成球员个人数据
        player_data = []
        for player in player_names:
            crosses = np.random.randint(50, 200)
            successful = np.random.randint(15, 60)
            player_data.append({
                '球员': player,
                '球队': player.split('球员')[0],
                '传中次数': crosses,
                '成功传中': successful,
                '成功率': successful / crosses * 100,
                '助攻数': np.random.randint(0, 8),
                '场均传球': np.random.uniform(30, 60),
                '比赛出场': np.random.randint(15, 35)
            })
        self.player_stats = pd.DataFrame(player_data)
        return self.data
    def calculate_team_statistics(self):
        """
        计算球队统计数据
        """
        # 按球队聚合数据
        self.team_stats = self.data.groupby('球队').agg({
            '传中次数': 'sum',
            '成功传中': 'sum',
            '传中方向': 'first',
            '主客场': 'first'
        }).reset_index()
        # 计算成功率
        self.team_stats['总成功率'] = self.team_stats['成功传中'] / self.team_stats['传中次数'] * 100
        # 按主客场分析
        home_away_stats = self.data.groupby(['球队', '主客场']).agg({
            '传中次数': 'sum',
            '成功传中': 'sum'
        }).reset_index()
        # 透视表展示主客场成功率
        pivot_home_away = home_away_stats.pivot_table(
            values=['传中次数', '成功传中'],
            index='球队',
            columns='主客场',
            aggfunc='sum'
        )
        home_success = pivot_home_away['成功传中']['主场'] / pivot_home_away['传中次数']['主场'] * 100
        away_success = pivot_home_away['成功传中']['客场'] / pivot_home_away['传中次数']['客场'] * 100
        self.team_stats['主场成功率'] = home_success
        self.team_stats['客场成功率'] = away_success
        return self.team_stats
    def analyze_side_direction(self):
        """
        分析左右边路传中成功率
        """
        side_stats = self.data.groupby(['球队', '传中方向']).agg({
            '传中次数': 'sum',
            '成功传中': 'sum'
        }).reset_index()
        side_stats['成功率'] = side_stats['成功传中'] / side_stats['传中次数'] * 100
        # 创建透视表,展示左右边路对比
        comparison = side_stats.pivot_table(
            values='成功率',
            index='球队',
            columns='传中方向',
            fill_value=0
        )
        comparison['差异'] = comparison['左侧'] - comparison['右侧']
        return comparison
    def analyze_player_performance(self):
        """
        分析球员个人表现
        """
        # 筛选出场次数较多的球员
        qualified_players = self.player_stats[self.player_stats['比赛出场'] >= 20]
        # 添加球员效率评分
        qualified_players['效率评分'] = (
            qualified_players['成功率'] * 0.6 + 
            qualified_players['助攻数'] * 1.5 + 
            qualified_players['场均传球'] * 0.1
        )
        return qualified_players.sort_values('效率评分', ascending=False)
    def visualize_analysis(self):
        """
        可视化分析结果
        """
        if self.team_stats is None:
            self.calculate_team_statistics()
        # 创建多子图
        fig = plt.figure(figsize=(18, 12))
        # 1. 球队成功率排名
        ax1 = fig.add_subplot(2, 3, 1)
        sorted_teams = self.team_stats.sort_values('总成功率', ascending=True)
        colors = plt.cm.RdYlGn(np.linspace(0.2, 0.8, len(sorted_teams)))
        bars = ax1.barh(sorted_teams['球队'], sorted_teams['总成功率'], color=colors)
        ax1.set_xlabel('成功率 (%)')
        ax1.set_title('各球队传中成功率排名')
        ax1.set_xlim(0, 60)
        # 在条形图上添加数值
        for i, (bar, value) in enumerate(zip(bars, sorted_teams['总成功率'])):
            ax1.text(bar.get_width() + 0.5, bar.get_y() + bar.get_height()/2, 
                    f'{value:.1f}%', ha='left', va='center')
        # 2. 主客场成功率对比
        ax2 = fig.add_subplot(2, 3, 2)
        range_teams = np.arange(len(self.team_stats))
        width = 0.35
        ax2.bar(range_teams - width/2, self.team_stats['主场成功率'], width, 
                label='主场', alpha=0.8, color='green')
        ax2.bar(range_teams + width/2, self.team_stats['客场成功率'], width, 
                label='客场', alpha=0.8, color='orange')
        ax2.set_xticks(range_teams)
        ax2.set_xticklabels(self.team_stats['球队'], rotation=45)
        ax2.set_ylabel('成功率 (%)')
        ax2.set_title('主客场成功率对比')
        ax2.legend()
        ax2.axhline(y=self.team_stats['总成功率'].mean(), color='red', 
                   linestyle='--', label=f'平均 {self.team_stats["总成功率"].mean():.1f}%')
        # 3. 左右边路成功率热力图
        ax3 = fig.add_subplot(2, 3, 3)
        side_comparison = self.analyze_side_direction()
        sns.heatmap(side_comparison[['左侧', '右侧']], annot=True, fmt='.1f', 
                   cmap='coolwarm', ax=ax3, cbar_kws={'label': '成功率 (%)'})
        ax3.set_title('左右边路成功率对比热力图')
        # 4. 传中次数与成功率散点图
        ax4 = fig.add_subplot(2, 3, 4)
        scatter = ax4.scatter(self.team_stats['传中次数'], self.team_stats['总成功率'], 
                            c=self.team_stats['总成功率'], cmap='viridis', s=150)
        ax4.set_xlabel('传中次数')
        ax4.set_ylabel('成功率 (%)')
        ax4.set_title('传中次数与成功率关系')
        plt.colorbar(scatter, ax=ax4)
        # 5. 球员效率评分排行
        ax5 = fig.add_subplot(2, 3, 5)
        player_analysis = self.analyze_player_performance()
        top_players = player_analysis.head(10)
        bars = ax5.barh(top_players['球员'], top_players['效率评分'], 
                       color=plt.cm.Blues(np.linspace(0.3, 0.9, len(top_players))))
        ax5.set_xlabel('效率评分')
        ax5.set_title('球员效率评分TOP10')
        # 6. 成功率分布直方图
        ax6 = fig.add_subplot(2, 3, 6)
        ax6.hist(self.team_stats['总成功率'], bins=10, color='skyblue', 
                edgecolor='black', alpha=0.7)
        ax6.axvline(self.team_stats['总成功率'].mean(), color='red', 
                   linestyle='--', label=f'均值: {self.team_stats["总成功率"].mean():.2f}%')
        ax6.set_xlabel('成功率 (%)')
        ax6.set_ylabel('球队数量')
        ax6.set_title('球队成功率分布')
        ax6.legend()
        plt.suptitle('足球边路传中成功率综合分析报告', fontsize=16, fontweight='bold')
        plt.tight_layout()
        plt.show()
    def generate_report(self):
        """
        生成综合分析报告
        """
        print("=" * 60)
        print("足球边路传中成功率综合分析报告")
        print("=" * 60)
        # 总体统计
        total_crosses = self.data['传中次数'].sum()
        total_success = self.data['成功传中'].sum()
        overall_rate = total_success / total_crosses * 100
        print(f"\n总体数据统计:")
        print(f"总传中次数: {total_crosses}")
        print(f"成功传中次数: {total_success}")
        print(f"总体成功率: {overall_rate:.2f}%")
        # 最佳球队
        best_team = self.team_stats.loc[self.team_stats['总成功率'].idxmax()]
        print(f"\n最佳球队: {best_team['球队']}")
        print(f"球队成功率: {best_team['总成功率']:.2f}%")
        print(f"球队传中次数: {best_team['传中次数']}")
        # 最佳球员
        top_player = self.player_stats.loc[self.player_stats['成功率'].idxmax()]
        print(f"\n最佳传中球员: {top_player['球员']}")
        print(f"球员成功率: {top_player['成功率']:.2f}%")
        print(f"球员传中次数: {top_player['传中次数']}")
        # 左右边路分析
        side_analysis = self.data.groupby('传中方向').agg({
            '传中次数': 'sum',
            '成功传中': 'sum'
        })
        side_rate = side_analysis['成功传中'] / side_analysis['传中次数'] * 100
        print(f"\n边路对比:")
        for direction in ['左侧', '右侧']:
            print(f"{direction}传中成功率: {side_rate[direction]:.2f}%")
        # 主客场分析
        home_avg = self.team_stats['主场成功率'].mean()
        away_avg = self.team_stats['客场成功率'].mean()
        print(f"\n主客场对比:")
        print(f"主场平均成功率: {home_avg:.2f}%")
        print(f"客场平均成功率: {away_avg:.2f}%")
        print(f"主场优势: {'是' if home_avg > away_avg else '否'}")
        # 数据洞察
        print("\n" + "=" * 60)
        print("关键数据洞察:")
        print("=" * 60)
        # 找出最强边路
        if side_rate['左侧'] > side_rate['右侧']:
            print("→ 整体来看,球队在左侧边路传中效率更高")
        else:
            print("→ 整体来看,球队在右侧边路传中效率更高")
        # 主客场优势分析
        if self.team_stats['主场成功率'].mean() > self.team_stats['客场成功率'].mean():
            print("→ 球队在主场表现出更好的传中成功率")
        else:
            print("→ 球队在客场保持着更好的传中成功率")
# 主程序
def main():
    """
    主函数入口
    """
    # 创建分析对象
    analysis = FootballCrossingAnalysis()
    # 生成数据
    print("正在生成模拟数据...")
    analysis.generate_synthetic_data(teams=10, matches_per_team=20)
    print("数据生成完成!")
    # 计算球队统计数据
    analysis.calculate_team_statistics()
    # 打印球队排名
    print("\n球队成功率排名:")
    team_ranking = analysis.team_stats.sort_values('总成功率', ascending=False)
    for i, row in team_ranking.iterrows():
        print(f"{i+1}. {row['球队']}: {row['总成功率']:.2f}%")
    # 生成可视化分析
    analysis.visualize_analysis()
    # 生成详细报告
    analysis.generate_report()
    # 导出数据
    print("\n正在导出分析数据...")
    analysis.team_stats.to_csv('team_crossing_stats.csv', index=False)
    analysis.player_stats.to_csv('player_crossing_stats.csv', index=False)
    print("数据已导出到CSV文件!")
if __name__ == "__main__":
    main()

运行示例和预期输出

# 运行代码
analysis = FootballCrossingAnalysis()
analysis.generate_synthetic_data()
analysis.calculate_team_statistics()
# 查看球队统计
print(analysis.team_stats.head())

输出示例:

        球队  传中次数  成功传中  总成功率  主场成功率  客场成功率
0   球队1   345   123  35.65%  36.8%  34.5%
1   球队2   320   110  34.38%  35.2%  33.6%
2   球队3   352   130  36.93%  37.5%  36.4%
...

功能特点

  1. 数据生成:自动生成逼真的足球比赛数据
  2. 多维度分析:球队、球员、主客场、左右边路等多角度分析
  3. 可视化呈现:包含6种不同类型的图表
  4. 智能报告:自动生成分析报告和关键洞察
  5. 数据导出:支持CSV格式导出

扩展建议

# 可以添加更多功能
def add_player_defense_analysis(self):
    """添加防守数据分析"""
def add_correlation_analysis(self):
    """添加相关性分析"""
def add_time_series_analysis(self):
    """添加时间序列分析"""

这个案例包含了数据分析的完整流程,可以直接运行并得到丰富的分析结果!

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