python案例统计门球短传配合成功率?

wen python案例 1

本文目录导读:

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, timedelta
import random
from collections import defaultdict
class 门球短传配合分析系统:
    def __init__(self):
        """初始化分析系统"""
        self.data = None
        self.success_rate = 0
    def generate_match_data(self, num_passes=100):
        """
        生成模拟的门球比赛传球数据
        """
        print("正在生成模拟数据...")
        # 可能的传球区域
        areas = ['前场左路', '前场中路', '前场右路', 
                '中场左路', '中场中路', '中场右路',
                '后场左路', '后场中路', '后场右路']
        # 球员编号
        players = [f'球员{i:02d}' for i in range(1, 11)]
        # 生成传球数据
        passes_data = []
        for i in range(num_passes):
            # 随机生成传球记录
            pass_record = {
                '传球编号': i + 1,
                '传球时间': f'{random.randint(0, 2):02d}:{random.randint(0, 59):02d}:{random.randint(0, 59):02d}',
                '传球球员': random.choice(players),
                '接球球员': random.choice(players),
                '传球区域': random.choice(areas),
                '传球距离': round(random.uniform(5, 25), 1),  # 5-25米的短传
                '接球区域': random.choice(areas),
                '是否成功': random.choice([0, 1]),  # 0=失败,1=成功
                '比赛节次': random.randint(1, 4),  # 四节比赛
                '进攻方向': random.choice(['左路进攻', '中路进攻', '右路进攻'])
            }
            # 确保传球球员和接球球员不同
            while pass_record['传球球员'] == pass_record['接球球员']:
                pass_record['接球球员'] = random.choice(players)
            # 根据距离调整成功率(距离越近成功率越高)
            if pass_record['传球距离'] < 8:
                success_rate = 0.7
            elif pass_record['传球距离'] < 15:
                success_rate = 0.55
            else:
                success_rate = 0.4
            pass_record['是否成功'] = np.random.choice([1, 0], p=[success_rate, 1-success_rate])
            passes_data.append(pass_record)
        self.data = pd.DataFrame(passes_data)
        return self.data
    def calculate_success_rate(self):
        """
        计算总体成功率
        """
        total_passes = len(self.data)
        successful_passes = self.data['是否成功'].sum()
        self.success_rate = (successful_passes / total_passes) * 100
        print(f"总传球数: {total_passes}")
        print(f"成功传球数: {successful_passes}")
        print(f"总体成功率: {self.success_rate:.2f}%")
        return self.success_rate
    def analyze_by_area(self):
        """
        按区域分析传球成功率
        """
        print("\n=== 按区域分析传球成功率 ===")
        area_analysis = self.data.groupby('传球区域').agg({
            '是否成功': ['count', 'sum', 'mean']
        }).round(3)
        area_analysis.columns = ['传球总数', '成功次数', '成功率']
        area_analysis['成功率百分比'] = area_analysis['成功率'] * 100
        print(area_analysis.to_string())
        return area_analysis
    def analyze_by_player(self):
        """
        按球员分析传球成功率
        """
        print("\n=== 按球员分析传球成功率 ===")
        player_analysis = self.data.groupby('传球球员').agg({
            '是否成功': ['count', 'sum', 'mean']
        }).round(3)
        player_analysis.columns = ['传球总数', '成功次数', '成功率']
        player_analysis['成功率百分比'] = player_analysis['成功率'] * 100
        player_analysis = player_analysis.sort_values('成功率百分比', ascending=False)
        print(player_analysis.to_string())
        return player_analysis
    def analyze_by_distance(self):
        """
        按距离段分析传球成功率
        """
        print("\n=== 按距离段分析传球成功率 ===")
        # 划分距离段
        bins = [0, 7, 10, 13, 16, 20, 25]
        labels = ['5-7m', '7-10m', '10-13m', '13-16m', '16-20m', '20m以上']
        self.data['距离段'] = pd.cut(self.data['传球距离'], bins=bins, labels=labels, right=False)
        distance_analysis = self.data.groupby('距离段').agg({
            '是否成功': ['count', 'sum', 'mean']
        }).round(3)
        distance_analysis.columns = ['传球总数', '成功次数', '成功率']
        distance_analysis['成功率百分比'] = distance_analysis['成功率'] * 100
        print(distance_analysis.to_string())
        return distance_analysis
    def visualize_results(self):
        """
        可视化分析结果
        """
        # 设置中文字体
        plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
        plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
        # 创建子图
        fig, axes = plt.subplots(2, 2, figsize=(15, 12))
        fig.suptitle('门球短传配合分析报告', fontsize=16, fontweight='bold')
        # 1. 各区域传球成功率
        area_analysis = self.analyze_by_area()
        ax1 = axes[0, 0]
        area_analysis['成功率百分比'].plot(kind='bar', ax=ax1, color='skyblue')
        ax1.set_title('各区域传球成功率')
        ax1.set_xlabel('传球区域')
        ax1.set_ylabel('成功率 (%)')
        ax1.set_ylim(0, 100)
        for i, v in enumerate(area_analysis['成功率百分比']):
            ax1.text(i, v + 3, f'{v:.1f}%', ha='center', fontsize=9)
        # 2. 球员传球成功率
        player_analysis = self.analyze_by_player()
        ax2 = axes[0, 1]
        player_analysis['成功率百分比'].plot(kind='bar', ax=ax2, color='lightcoral')
        ax2.set_title('球员传球成功率')
        ax2.set_xlabel('球员')
        ax2.set_ylabel('成功率 (%)')
        ax2.set_ylim(0, 100)
        for i, v in enumerate(player_analysis['成功率百分比']):
            ax2.text(i, v + 2, f'{v:.1f}%', ha='center', fontsize=9, rotation=45)
        # 3. 距离与成功率关系
        distance_analysis = self.analyze_by_distance()
        ax3 = axes[1, 0]
        ax3.plot(distance_analysis.index, distance_analysis['成功率百分比'], 
                marker='o', linewidth=2, color='green')
        ax3.set_title('传球距离与成功率关系')
        ax3.set_xlabel('传球距离')
        ax3.set_ylabel('成功率 (%)')
        ax3.set_ylim(0, 100)
        ax3.grid(True)
        # 4. 成功/失败饼图
        ax4 = axes[1, 1]
        success_count = self.data['是否成功'].sum()
        fail_count = len(self.data) - success_count
        ax4.pie([success_count, fail_count], 
               labels=['成功', '失败'],
               autopct='%1.1f%%',
               colors=['lightgreen', 'lightcoral'],
               explode=(0.05, 0))
        ax4.set_title('成功/失败比例')
        plt.tight_layout()
        plt.show()
    def generate_report(self):
        """
        生成详细的文字报告
        """
        print("\n" + "="*60)
        print("门球短传配合分析报告")
        print("="*60)
        # 总体统计
        print(f"\n【总体概况】")
        print(f"总传球次数: {len(self.data)}")
        print(f"平均传球距离: {self.data['传球距离'].mean():.2f}米")
        print(f"最大传球距离: {self.data['传球距离'].max()}米")
        print(f"最小传球距离: {self.data['传球距离'].min()}米")
        # 各节比赛成功率
        print(f"\n【各节比赛分析】")
        for section in range(1, 5):
            section_data = self.data[self.data['比赛节次'] == section]
            if len(section_data) > 0:
                success_rate = section_data['是否成功'].mean() * 100
                print(f"第{section}节: 传球{len(section_data)}次, 成功率{success_rate:.1f}%")
        # 进攻方向分析
        print(f"\n【进攻方向分析】")
        direction_analysis = self.data.groupby('进攻方向').agg({
            '是否成功': ['count', 'mean']
        }).round(3)
        direction_analysis.columns = ['传球总数', '成功率']
        direction_analysis['成功率百分比'] = direction_analysis['成功率'] * 100
        print(direction_analysis.to_string())
        # 找出表现最好的球员
        player_analysis = self.analyze_by_player()
        top_players = player_analysis[player_analysis['传球总数'] >= 5].head(3)
        print(f"\n【最佳传球手】")
        for player in top_players.index:
            row = top_players.loc[player]
            print(f"{player}: {row['成功率百分比']:.1f}%成功率 ({int(row['成功次数'])}次成功/{int(row['传球总数'])}次传球)")
    def export_data(self, filename='门球传球数据.csv'):
        """
        导出数据到CSV文件
        """
        self.data.to_csv(filename, index=False, encoding='utf-8-sig')
        print(f"数据已导出到 {filename}")
    def run_full_analysis(self, num_passes=100):
        """
        运行完整分析流程
        """
        # 生成数据
        self.generate_match_data(num_passes)
        # 计算总体成功率
        print("\n" + "="*60)
        print("基本统计")
        print("="*60)
        self.calculate_success_rate()
        # 详细分析
        area_analysis = self.analyze_by_area()
        player_analysis = self.analyze_by_player()
        distance_analysis = self.analyze_by_distance()
        # 可视化
        self.visualize_results()
        # 生成报告
        self.generate_report()
        # 导出数据
        self.export_data()
        return self.data
# 使用示例
if __name__ == "__main__":
    # 创建分析系统实例
    analyzer = 门球短传配合分析系统()
    # 运行完整分析
    data = analyzer.run_full_analysis(num_passes=200)
    # 可以直接查看数据
    print("\n" + "="*60)
    print("数据预览(前10行)")
    print("="*60)
    print(data.head(10).to_string())

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

主要功能

  1. 数据模拟:自动生成模拟的门球传球数据

  2. 成功率统计:计算总体成功率和各维度成功率

  3. 多维度分析

    • 按区域分析(前场、中场、后场)
    • 按球员分析
    • 按传球距离分析
    • 按比赛节次分析
    • 按进攻方向分析
  4. 可视化:生成直观的图表展示分析结果

  5. 报告生成:输出详细的分析报告

  6. 数据导出:支持CSV格式导出

分析维度

  • 传球区域成功率
  • 球员个人成功率
  • 距离与成功率关系
  • 不同比赛节次的成功率变化
  • 进攻方向的成功率

使用说明

运行程序后会自动:

  1. 生成200次模拟传球数据
  2. 计算总体成功率
  3. 分析各维度数据
  4. 显示可视化图表
  5. 生成详细报告

您可以根据实际需求调整传球数据数量和分析参数,这个框架可以直接用于实际的比赛数据统计分析。

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