python案例统计弧线球传中精准度如何?

wen python案例 4

本文目录导读:

python案例统计弧线球传中精准度如何?

  1. 主要功能:
  2. 使用方法:
  3. CSV数据格式示例:

我来为您创建一个统计弧线球传中精准度的Python案例,这个案例将模拟足球比赛中的数据,计算传中精准度。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
class CrossAccuracyAnalyzer:
    """弧线球传中精准度分析器"""
    def __init__(self):
        self.crosses = []
        self.player_stats = {}
    def add_cross_data(self, player_name, team, cross_type, target_zone, 
                      success, speed, curve_amount, match_id):
        """
        添加单次传中数据
        参数:
        - player_name: 球员名
        - team: 球队
        - cross_type: 传中类型 (弧线球/直线球/下底传中等)
        - target_zone: 目标区域 (前点/中路/后点)
        - success: 是否成功 (1成功, 0失败)
        - speed: 传球速度 (km/h)
        - curve_amount: 弧线程度 (1-10)
        - match_id: 比赛编号
        """
        cross_data = {
            'player': player_name,
            'team': team,
            'cross_type': cross_type,
            'target_zone': target_zone,
            'success': success,
            'speed': speed,
            'curve_amount': curve_amount,
            'match_id': match_id,
            'timestamp': datetime.now()
        }
        self.crosses.append(cross_data)
    def import_batch_data(self, data_file=None):
        """批量导入数据(默认生成模拟数据)"""
        if data_file:
            # 从CSV文件导入
            df = pd.read_csv(data_file)
            for _, row in df.iterrows():
                self.add_cross_data(
                    player_name=row['player'],
                    team=row['team'],
                    cross_type=row['cross_type'],
                    target_zone=row['target_zone'],
                    success=row['success'],
                    speed=row['speed'],
                    curve_amount=row['curve_amount'],
                    match_id=row['match_id']
                )
        else:
            # 生成模拟数据
            self._generate_simulated_data()
    def _generate_simulated_data(self, num_samples=100):
        """生成模拟数据用于演示"""
        players = ['梅西', 'C罗', '内马尔', '姆巴佩', '萨拉赫', '德布劳内', 
                  '阿诺德', '罗伯逊', '坎塞洛', '迪玛利亚']
        teams = ['巴黎圣日耳曼', '皇马', '利物浦', '曼城', '巴萨']
        cross_types = ['弧线球', '直线球', '下底传中', '倒三角']
        target_zones = ['前点', '中路', '后点']
        np.random.seed(42)
        for i in range(num_samples):
            player = np.random.choice(players)
            team = np.random.choice(teams)
            cross_type = np.random.choice(cross_types)
            target_zone = np.random.choice(target_zones)
            # 弧线球成功率更高
            if cross_type == '弧线球':
                success = np.random.choice([0, 1], p=[0.25, 0.75])
                curve = np.random.randint(6, 10)
            elif cross_type == '直线球':
                success = np.random.choice([0, 1], p=[0.4, 0.6])
                curve = np.random.randint(1, 4)
            else:
                success = np.random.choice([0, 1], p=[0.5, 0.5])
                curve = np.random.randint(3, 7)
            speed = np.random.uniform(50, 90)  # km/h
            match_id = f'M{np.random.randint(1, 20)}'
            self.add_cross_data(player, team, cross_type, target_zone, 
                              success, speed, curve, match_id)
    def calculate_accuracy(self, cross_type='弧线球'):
        """计算指定类型传中的精准度"""
        df = pd.DataFrame(self.crosses)
        if cross_type:
            df_filtered = df[df['cross_type'] == cross_type]
        else:
            df_filtered = df
        if len(df_filtered) == 0:
            return 0
        accuracy = df_filtered['success'].mean() * 100
        total_attempts = len(df_filtered)
        successful = df_filtered['success'].sum()
        return {
            '原精度': f'{accuracy:.2f}%',
            '总次数': total_attempts,
            '成功次数': successful,
            '失败次数': total_attempts - successful
        }
    def player_accuracy_ranking(self, cross_type='弧线球'):
        """球员精准度排名"""
        df = pd.DataFrame(self.crosses)
        # 过滤指定类型
        if cross_type:
            df_filtered = df[df['cross_type'] == cross_type]
        else:
            df_filtered = df
        # 按球员统计
        stats = df_filtered.groupby('player').agg({
            'success': ['count', 'sum']
        }).round(2)
        stats.columns = ['总传中', '成功']
        stats['精准度'] = (stats['成功'] / stats['总传中'] * 100).round(2)
        # 至少传中5次以上才参与排名
        stats = stats[stats['总传中'] >= 5]
        return stats.sort_values('精准度', ascending=False)
    def zone_analysis(self, cross_type='弧线球'):
        """区域精准度分析"""
        df = pd.DataFrame(self.crosses)
        if cross_type:
            df_filtered = df[df['cross_type'] == cross_type]
        else:
            df_filtered = df
        # 按区域统计
        zone_stats = df_filtered.groupby('target_zone').agg({
            'success': ['count', 'sum', 'mean']
        }).round(3)
        zone_stats.columns = ['总传中', '成功', '成功率']
        zone_stats['精准度%'] = (zone_stats['成功率'] * 100).round(2)
        return zone_stats
    def speed_analysis(self, cross_type='弧线球'):
        """速度对精准度的影响分析"""
        df = pd.DataFrame(self.crosses)
        if cross_type:
            df_filtered = df[df['cross_type'] == cross_type]
        else:
            df_filtered = df
        # 速度分段
        df_filtered['速度区间'] = pd.cut(df_filtered['speed'], 
                                        bins=[0, 60, 70, 80, 100], 
                                        labels=['低速(<60)', '中速(60-70)', 
                                                '快速(70-80)', '极速(>80)'])
        speed_stats = df_filtered.groupby('速度区间').agg({
            'success': ['count', 'mean']
        }).round(3)
        speed_stats.columns = ['次数', '成功率']
        speed_stats['精准度%'] = (speed_stats['成功率'] * 100).round(2)
        return speed_stats
    def visualize_analysis(self, player_name='梅西', cross_type='弧线球'):
        """可视化分析结果"""
        df = pd.DataFrame(self.crosses)
        # 筛选数据
        df_player = df[(df['player'] == player_name) & (df['cross_type'] == cross_type)]
        if len(df_player) == 0:
            print(f"没有找到球员 {player_name} 的{cross_type}数据")
            return
        fig, axes = plt.subplots(2, 2, figsize=(12, 10))
        fig.suptitle(f'{player_name} - {cross_type}精准度分析', fontsize=16)
        # 1. 精准度饼图
        success_count = df_player['success'].sum()
        fail_count = len(df_player) - success_count
        axes[0, 0].pie([success_count, fail_count], 
                       labels=['成功', '失败'],
                       autopct='%1.1f%%',
                       colors=['lightgreen', 'lightcoral'])
        axes[0, 0].set_title(f'成功率: {success_count/len(df_player)*100:.1f}%')
        # 2. 区域精准度柱状图
        zone_data = df_player.groupby('target_zone')['success'].agg(['mean', 'count'])
        zone_data['accuracy'] = zone_data['mean'] * 100
        axes[0, 1].bar(zone_data.index, zone_data['accuracy'], 
                      color=['#FF6B6B', '#4ECDC4', '#45B7D1'])
        axes[0, 1].set_title('不同区域精准度')
        axes[0, 1].set_ylabel('精准度 (%)')
        axes[0, 1].set_ylim(0, 100)
        # 添加数值标签
        for i, (idx, row) in enumerate(zone_data.iterrows()):
            axes[0, 1].text(i, row['accuracy'] + 2, 
                           f"{row['accuracy']:.1f}%", 
                           ha='center', fontsize=9)
        # 3. 速度与精准度散点图
        axes[1, 0].scatter(df_player['speed'], df_player['success'], alpha=0.6)
        axes[1, 0].set_xlabel('速度 (km/h)')
        axes[1, 0].set_ylabel('成功与否')
        axes[1, 0].set_title('速度与精准度关系')
        axes[1, 0].set_yticks([0, 1])
        axes[1, 0].set_yticklabels(['失败', '成功'])
        # 4. 弧线程度vs精准度
        curve_stats = df_player.groupby('curve_amount')['success'].mean() * 100
        axes[1, 1].bar(curve_stats.index, curve_stats.values)
        axes[1, 1].set_title('弧线程度vs精准度')
        axes[1, 1].set_xlabel('弧线程度 (1-10)')
        axes[1, 1].set_ylabel('精准度 (%)')
        axes[1, 1].set_ylim(0, 100)
        plt.tight_layout()
        plt.show()
    def generate_report(self):
        """生成综合报告"""
        print("=" * 50)
        print("弧线球传中精准度分析报告")
        print("=" * 50)
        # 总体统计
        total_crosses = len(self.crosses)
        df = pd.DataFrame(self.crosses)
        print(f"\n📊 总体统计:")
        print(f"总传中次数: {total_crosses}")
        print(f"总成功率: {df['success'].mean()*100:.2f}%")
        # 不同类型对比
        print(f"\n⚽ 不同类型传中对比:")
        type_stats = df.groupby('cross_type')['success'].agg(['count', 'mean'])
        for cross_type, row in type_stats.iterrows():
            print(f"  {cross_type}: {row['mean']*100:.1f}% ({int(row['count'])}次)")
        # 弧线球详细分析
        print(f"\n🎯 弧线球专项分析:")
        accuracy = self.calculate_accuracy('弧线球')
        print(f" 精准度: {accuracy['原精度']}")
        print(f" 成功次数: {accuracy['成功次数']}")
        print(f" 失败次数: {accuracy['失败次数']}")
        # 球员排名(Top5)
        print(f"\n🏆 弧线球精准度排名 (Top5):")
        ranking = self.player_accuracy_ranking('弧线球')
        if not ranking.empty:
            top5 = ranking.head(5)
            for i, (player, stats) in enumerate(top5.iterrows(), 1):
                print(f" {i}. {player}: {stats['精准度']}% ({int(stats['总传中'])}次)")
        # 区域分析
        print(f"\n📍 区域精准度分析:")
        zone_stats = self.zone_analysis('弧线球')
        print(zone_stats)
        # 速度分析
        print(f"\n⚡ 速度与精准度分析:")
        speed_stats = self.speed_analysis('弧线球')
        print(speed_stats)
        print("\n" + "=" * 50)
# 使用示例
def main():
    # 创建分析器
    analyzer = CrossAccuracyAnalyzer()
    # 导入模拟数据
    analyzer.import_batch_data()  # 或者使用 import_batch_data('your_data.csv')
    # 生成综合报告
    analyzer.generate_report()
    # 查看特定球员的可视化分析
    print("\n📈 球员可视化分析:")
    analyzer.visualize_analysis('梅西', '弧线球')
    # 对比不同球员
    print("\n💡 球员对比:")
    players_to_compare = ['梅西', 'C罗', '内马尔']
    print(f"{'球员':<10} {'总传中':<8} {'成功':<8} {'精准度':<10}")
    print("-" * 40)
    for player in players_to_compare:
        df = pd.DataFrame(analyzer.crosses)
        player_data = df[(df['player'] == player) & (df['cross_type'] == '弧线球')]
        if len(player_data) > 0:
            accuracy = player_data['success'].mean() * 100
            print(f"{player:<10} {len(player_data):<8} {player_data['success'].sum():<8} {accuracy:<10.2f}%")
if __name__ == "__main__":
    main()

这个案例提供了以下功能:

主要功能:

  1. 数据记录:记录每次传中的详细信息(球员、球队、传中类型、目标区域、是否成功等)

  2. 精准度计算

    • 总体精准度
    • 不同类型传中对比
    • 球员个人精准度排名
  3. 多维分析

    • 按区域(前点/中路/后点)分析
    • 按速度区间分析
    • 弧线程度与精准度关系
  4. 数据可视化

    • 成功率饼图
    • 区域精准度柱状图
    • 速度与精准度散点图
    • 弧线程度分析
  5. 综合报告:自动生成详细的分析报告

使用方法:

# 1. 创建分析器
analyzer = CrossAccuracyAnalyzer()
# 2. 方式一:使用模拟数据(演示)
analyzer.import_batch_data()
# 方式二:导入自己的CSV文件
# analyzer.import_batch_data('cross_data.csv')
# 3. 查看球员排名
ranking = analyzer.player_accuracy_ranking('弧线球')
print(ranking)
# 4. 可视化分析某球员
analyzer.visualize_analysis('梅西', '弧线球')
# 5. 生成完整报告
analyzer.generate_report()

CSV数据格式示例:

player,team,cross_type,target_zone,speed,curve_amount,success,match_id
梅西,巴黎圣日耳曼,弧线球,前点,72,8,1,M1
C罗,皇马,弧线球,中路,65,7,1,M1
内马尔,巴黎圣日耳曼,弧线球,后点,78,9,0,M2

这个工具可以帮助教练和分析师评估球员的弧线球传中能力,对比不同球员的传中水平,并找出提高传中精准度的关键因素。

上一篇综合python案例,外脚背传球次数多少?

下一篇当前分类已是最新一篇

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