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

wen python案例 5

本文目录导读:

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

  1. 核心功能:
  2. 使用方法:
  3. 输出包括:

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

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime
class CrossAccuracyAnalyzer:
    """
    弧线球传中精准度分析器
    """
    def __init__(self, player_name="球员A", team_name="球队A"):
        self.player_name = player_name
        self.team_name = team_name
        self.cross_data = []
        self.df = None
    def generate_sample_data(self, n_crosses=100):
        """
        生成模拟的传中数据
        包含不同类型的传中情况
        """
        np.random.seed(42)  # 可重复性
        # 传中类型
        cross_types = ['低平球传中', '高球传中', '半高球传中', '外脚背传中']
        # 传中区域
        zones = ['左路', '右路', '中路']
        # 防守强度
        pressure_levels = ['低', '中', '高']
        for i in range(n_crosses):
            # 随机选择传中特征
            cross_type = np.random.choice(cross_types, p=[0.3, 0.3, 0.25, 0.15])
            zone = np.random.choice(zones, p=[0.4, 0.4, 0.2])
            pressure = np.random.choice(pressure_levels, p=[0.3, 0.4, 0.3])
            # 计算成功概率(考虑各种因素)
            success_prob = 0.5  # 基础概率
            # 根据传中类型调整
            if cross_type == '低平球传中':
                success_prob += 0.1
            elif cross_type == '高球传中':
                success_prob -= 0.05
            elif cross_type == '外脚背传中':
                success_prob += 0.05
            # 根据区域调整
            if zone == '左路':
                success_prob += 0.02
            elif zone == '右路':
                success_prob -= 0.02
            # 根据防守压力调整
            if pressure == '低':
                success_prob += 0.15
            elif pressure == '高':
                success_prob -= 0.2
            # 添加随机因素
            success_prob += np.random.normal(0, 0.1)
            success_prob = np.clip(success_prob, 0, 1)
            # 生成传中数据
            data = {
                '序号': i + 1,
                '比赛日期': datetime(2024, 1, 1).date() + pd.DateOffset(days=np.random.randint(0, 180)),
                '对手': f"对手{np.random.randint(1, 20)}",
                '传中类型': cross_type,
                '传中区域': zone,
                '防守压力': pressure,
                '传球距离(米)': np.random.randint(20, 50),
                '传球高度(米)': np.random.randint(1, 8),
                '传球速度(km/h)': np.random.randint(60, 100),
                '触球部位': np.random.choice(['内脚背', '外脚背', '脚背正面']),
                '是否成功': np.random.choice([1, 0], p=[success_prob, 1-success_prob])
            }
            self.cross_data.append(data)
        self.df = pd.DataFrame(self.cross_data)
        self.df['比赛日期'] = pd.to_datetime(self.df['比赛日期'])
    def calculate_accuracy(self):
        """
        计算总体精准度
        """
        if self.df is None:
            print("没有数据,请先导入或生成数据")
            return 0
        total_crosses = len(self.df)
        successful_crosses = self.df['是否成功'].sum()
        accuracy = successful_crosses / total_crosses * 100
        return accuracy, total_crosses, successful_crosses
    def calculate_accuracy_by_type(self):
        """
        按传中类型统计精准度
        """
        accuracy_by_type = self.df.groupby('传中类型').agg({
            '是否成功': ['count', 'sum', 'mean']
        }).round(3)
        accuracy_by_type.columns = ['总传中数', '成功数', '成功率']
        accuracy_by_type['精准度(%)'] = accuracy_by_type['成功率'] * 100
        return accuracy_by_type
    def calculate_accuracy_by_zone(self):
        """
        按传中区域统计精准度
        """
        accuracy_by_zone = self.df.groupby(['传中区域', '防守压力']).agg({
            '是否成功': ['count', 'sum', 'mean']
        }).round(3)
        accuracy_by_zone.columns = ['总传中数', '成功数', '成功率']
        accuracy_by_zone['精准度(%)'] = accuracy_by_zone['成功率'] * 100
        return accuracy_by_zone
    def analyze_technical_characteristics(self):
        """
        分析传球技术特征与精准度的关系
        """
        # 建立技术特征与精准度的关联
        df_analysis = self.df.copy()
        # 距离分组
        df_analysis['距离分类'] = pd.cut(df_analysis['传球距离(米)'], 
                                        bins=[0, 25, 35, 50], 
                                        labels=['短传(<25m)', '中距离(25-35m)', '长传(>35m)'])
        # 高度分组
        df_analysis['高度分类'] = pd.cut(df_analysis['传球高度(米)'], 
                                        bins=[0, 2, 5, 8], 
                                        labels=['低平球(0-2m)', '中高度(2-5m)', '高球(5-8m)'])
        # 分析不同距离的精准度
        distance_accuracy = df_analysis.groupby('距离分类')['是否成功'].agg(['count', 'mean']).reset_index()
        distance_accuracy['精准度(%)'] = (distance_accuracy['mean'] * 100).round(2)
        # 分析不同高度的精准度
        height_accuracy = df_analysis.groupby('高度分类')['是否成功'].agg(['count', 'mean']).reset_index()
        height_accuracy['精准度(%)'] = (height_accuracy['mean'] * 100).round(2)
        return {
            'distance_accuracy': distance_accuracy,
            'height_accuracy': height_accuracy
        }
    def visualize_results(self):
        """
        可视化分析结果
        """
        fig, axes = plt.subplots(2, 2, figsize=(15, 12))
        # 1. 总体精准度
        accuracy, total, success = self.calculate_accuracy()
        ax1 = axes[0, 0]
        ax1.bar(['总体精准度'], [accuracy], color='blue', alpha=0.7)
        ax1.set_ylabel('精准度 (%)')
        ax1.set_title(f'{self.player_name} 弧线球传中总体精准度')
        ax1.text(0, accuracy+1, f'{accuracy:.1f}%', ha='center', fontweight='bold')
        # 2. 各类型精准度
        acc_by_type = self.calculate_accuracy_by_type()
        ax2 = axes[0, 1]
        ax2.bar([t.replace(' ', '\n') for t in acc_by_type.index], 
                acc_by_type['精准度(%)'], 
                color=['blue', 'green', 'orange', 'red'])
        ax2.set_ylabel('精准度 (%)')
        ax2.set_title('不同传中类型的精准度')
        ax2.set_ylim(0, 100)
        for i, v in enumerate(acc_by_type['精准度(%)']):
            ax2.text(i, v+2, f'{v:.1f}%', ha='center', fontsize=8)
        # 3. 不同区域的精准度
        acc_by_zone = self.calculate_accuracy_by_zone()
        zones = ['左路', '右路', '中路']
        acc_by_zone_simple = []
        for zone in zones:
            zone_data = acc_by_zone.xs(zone, level='传中区域') if zone in acc_by_zone.index.get_level_values(0) else None
            if zone_data is not None:
                avg_accuracy = zone_data['精准度(%)'].mean()
                acc_by_zone_simple.append(avg_accuracy)
            else:
                acc_by_zone_simple.append(0)
        ax3 = axes[1, 0]
        ax3.bar(zones, acc_by_zone_simple, color=['blue', 'green', 'orange'])
        ax3.set_ylabel('平均精准度 (%)')
        ax3.set_title('不同区域的传中精准度')
        for i, v in enumerate(acc_by_zone_simple):
            ax3.text(i, v+1, f'{v:.1f}%', ha='center')
        # 4. 按防守压力的精准度
        pressure_accuracy = self.df.groupby('防守压力')['是否成功'].mean() * 100
        ax4 = axes[1, 1]
        ax4.bar(pressure_accuracy.index, pressure_accuracy, color=['green', 'orange', 'red'])
        ax4.set_ylabel('精准度 (%)')
        ax4.set_title('不同防守压力下的精准度')
        for i, v in enumerate(pressure_accuracy):
            ax4.text(i, v+1, f'{v:.1f}%', ha='center')
        plt.tight_layout()
        plt.show()
    def generate_report(self):
        """
        生成完整分析报告
        """
        print("\n" + "="*60)
        print(f"弧线球传中精准度分析报告")
        print(f"球员:{self.player_name} | 球队:{self.team_name}")
        print("="*60)
        # 总体统计
        accuracy, total, success = self.calculate_accuracy()
        print(f"\n【总体统计】")
        print(f"总传中次数:{total}")
        print(f"成功传中:{success}")
        print(f"总体精准度:{accuracy:.2f}%")
        # 按类型统计
        print(f"\n【按传中类型】")
        acc_by_type = self.calculate_accuracy_by_type()
        print(acc_by_type.to_string())
        # 技术特征分析
        print(f"\n【技术特征分析】")
        tech_analysis = self.analyze_technical_characteristics()
        print("\n按传球距离:")
        print(tech_analysis['distance_accuracy'].to_string(index=False))
        print("\n按传球高度:")
        print(tech_analysis['height_accuracy'].to_string(index=False))
        # 最佳实践建议
        print(f"\n【分析建议】")
        best_type = acc_by_type['精准度(%)'].idxmax()
        print(f"最擅长的传中类型:{best_type}")
        best_pressure = self.df.groupby('防守压力')['是否成功'].mean().idxmax()
        print(f"最适合的防守压力:{best_pressure}")
        # 技术特性最优
        df_tech = self.df
        best_distance_cat = tech_analysis['distance_accuracy'].loc[tech_analysis['distance_accuracy']['精准度(%)'].idxmax(), '距离分类']
        best_height_cat = tech_analysis['height_accuracy'].loc[tech_analysis['height_accuracy']['精准度(%)'].idxmax(), '高度分类']
        print(f"最精准的距离范围:{best_distance_cat}")
        print(f"最精准的高度范围:{best_height_cat}")
        print("\n" + "="*60)
# 使用示例
def main():
    # 创建分析器
    analyzer = CrossAccuracyAnalyzer("C罗", "皇马")
    # 生成模拟数据(200次传中)
    analyzer.generate_sample_data(200)
    # 生成分析报告
    analyzer.generate_report()
    # 可视化分析
    analyzer.visualize_results()
    # 额外分析:查看原始数据前10行
    print("\n【原始数据预览】")
    print(analyzer.df.head(10))
if __name__ == "__main__":
    main()

这个程序提供了完整的弧线球传中精准度分析功能,包括:

核心功能:

  1. 数据模拟:生成符合足球实际的传中数据(包括位置、类型、压力等)
  2. 精准度计算:统计总体及各维度精准度
  3. 技术分析:分析距离、高度等技术因素对精准度的影响
  4. 可视化展示:直观展示分析结果
  5. 报告生成:自动生成文字分析报告

使用方法:

# 创建分析器
analyzer = CrossAccuracyAnalyzer("球员名字", "球队名字")
# 生成数据(可调整数量)
analyzer.generate_sample_data(200)
# 输出报告
analyzer.generate_report()
# 显示图表
analyzer.visualize_results()

输出包括:

  • 总体精准度统计
  • 按传中类型、区域的精准度对比
  • 技术特征(距离、高度)与精准度的关系
  • 可视化图表展示
  • 基于数据的改进建议

你可以将这个方案应用到实际的足球数据中,只需要替换掉模拟数据生成函数,使用实际的比赛数据即可。

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