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

wen python案例 3

本文目录导读:

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

  1. 主要功能
  2. 输出示例
  3. 使用建议

我将为您创建一个门球短传配合成功率的统计系统,这个案例会包含数据模型、统计分析函数和可视化展示。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime
import random
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
class GateballPassAnalyzer:
    """门球短传配合分析器"""
    def __init__(self):
        self.passes_data = []
    def add_match_data(self, match_id, team_name, passes):
        """
        添加比赛数据
        :param match_id: 比赛编号
        :param team_name: 队伍名称
        :param passes: 传球列表,每项包含 (传球成功与否, 传球距离, 传球方向, 时机)
        """
        for pass_data in passes:
            self.passes_data.append({
                'match_id': match_id,
                'team': team_name,
                'success': pass_data['success'],
                'distance': pass_data['distance'],
                'direction': pass_data['direction'],
                'timing': pass_data['timing'],
                'pressure': pass_data['pressure']
            })
    def calculate_success_rate(self):
        """计算总体成功率"""
        if not self.passes_data:
            return 0
        df = pd.DataFrame(self.passes_data)
        success_rate = df['success'].mean() * 100
        return round(success_rate, 2)
    def analyze_by_distance(self):
        """按传球距离分析成功率"""
        df = pd.DataFrame(self.passes_data)
        # 定义距离区间
        bins = [0, 5, 10, 15, 20, 30, 100]
        labels = ['0-5m', '5-10m', '10-15m', '15-20m', '20-30m', '30m以上']
        df['distance_group'] = pd.cut(df['distance'], bins=bins, labels=labels, right=False)
        result = df.groupby('distance_group').agg({
            'success': ['count', 'mean', 'sum']
        }).round(3)
        result.columns = ['传球次数', '成功率', '成功次数']
        result['成功率'] = result['成功率'] * 100
        return result
    def analyze_by_timing(self):
        """按时机分析成功率"""
        df = pd.DataFrame(self.passes_data)
        result = df.groupby('timing').agg({
            'success': ['count', 'mean', 'sum']
        }).round(3)
        result.columns = ['传球次数', '成功率', '成功次数']
        result['成功率'] = result['成功率'] * 100
        return result
    def analyze_by_direction(self):
        """按方向分析成功率"""
        df = pd.DataFrame(self.passes_data)
        result = df.groupby('direction').agg({
            'success': ['count', 'mean', 'sum']
        }).round(3)
        result.columns = ['传球次数', '成功率', '成功次数']
        result['成功率'] = result['成功率'] * 100
        return result
    def analyze_by_pressure(self):
        """按压力程度分析成功率"""
        df = pd.DataFrame(self.passes_data)
        result = df.groupby('pressure').agg({
            'success': ['count', 'mean', 'sum']
        }).round(3)
        result.columns = ['传球次数', '成功率', '成功次数']
        result['成功率'] = result['成功率'] * 100
        return result
    def visualize_success_rate(self):
        """可视化成功率"""
        df = pd.DataFrame(self.passes_data)
        fig, axes = plt.subplots(2, 2, figsize=(14, 10))
        # 1. 距离分析
        ax1 = axes[0, 0]
        distance_data = self.analyze_by_distance()
        ax1.bar(distance_data.index, distance_data['成功率'], color='skyblue')
        ax1.set_title('不同距离的传球成功率')
        ax1.set_xlabel('传球距离')
        ax1.set_ylabel('成功率 (%)')
        ax1.set_ylim(0, 100)
        # 2. 时机分析
        ax2 = axes[0, 1]
        timing_data = self.analyze_by_timing()
        ax2.bar(timing_data.index, timing_data['成功率'], color='lightgreen')
        ax2.set_title('不同时机的传球成功率')
        ax2.set_xlabel('传球时机')
        ax2.set_ylabel('成功率 (%)')
        ax2.set_ylim(0, 100)
        # 3. 方向分析
        ax3 = axes[1, 0]
        direction_data = self.analyze_by_direction()
        ax3.bar(direction_data.index, direction_data['成功率'], color='orange')
        ax3.set_title('不同方向的传球成功率')
        ax3.set_xlabel('传球方向')
        ax3.set_ylabel('成功率 (%)')
        ax3.set_ylim(0, 100)
        # 4. 压力分析
        ax4 = axes[1, 1]
        pressure_data = self.analyze_by_pressure()
        ax4.bar(pressure_data.index, pressure_data['成功率'], color='lightcoral')
        ax4.set_title('不同压力下的传球成功率')
        ax4.set_xlabel('压力程度')
        ax4.set_ylabel('成功率 (%)')
        ax4.set_ylim(0, 100)
        plt.tight_layout()
        plt.show()
    def get_detailed_report(self):
        """获取详细报告"""
        df = pd.DataFrame(self.passes_data)
        report = {
            '总传球次数': len(df),
            '成功传球次数': df['success'].sum(),
            '总成功率': self.calculate_success_rate(),
            '平均传球距离': round(df['distance'].mean(), 2),
            '最大传球距离': df['distance'].max(),
            '最小传球距离': df['distance'].min(),
        }
        return report
    def compare_teams(self):
        """比较不同队伍的成功率"""
        df = pd.DataFrame(self.passes_data)
        team_stats = df.groupby('team').agg({
            'success': ['count', 'mean', 'sum'],
            'distance': ['mean', 'std']
        }).round(3)
        team_stats.columns = ['传球次数', '成功率', '成功次数', '平均距离', '距离标准差']
        team_stats['成功率'] = team_stats['成功率'] * 100
        return team_stats
def generate_sample_data():
    """生成示例数据"""
    random.seed(42)
    match_ids = ['M001', 'M002', 'M003']
    teams = ['红队', '蓝队', '绿队']
    timings = ['进攻初期', '进攻中期', '进攻后期', '防守反击']
    directions = ['向前', '横向', '向后', '斜向']
    pressures = ['低', '中', '高']
    all_passes = []
    for match_id in match_ids:
        for team in teams:
            num_passes = random.randint(30, 60)
            for _ in range(num_passes):
                pass_data = {
                    'success': random.random() < 0.7,  # 70%的基础成功率
                    'distance': random.uniform(1, 25),
                    'direction': random.choice(directions),
                    'timing': random.choice(timings),
                    'pressure': random.choice(pressures)
                }
                all_passes.append(pass_data)
    return match_ids, teams, all_passes
def main():
    """主函数"""
    print("="*60)
    print("门球短传配合成功率统计系统")
    print("="*60)
    # 创建分析器
    analyzer = GateballPassAnalyzer()
    # 生成示例数据
    match_ids, teams, all_passes = generate_sample_data()
    # 分配数据到各个比赛和队伍
    data_index = 0
    passes_per_team = len(all_passes) // (len(match_ids) * len(teams))
    for match_id in match_ids:
        for team in teams:
            team_passes = []
            for _ in range(passes_per_team):
                team_passes.append(all_passes[data_index])
                data_index += 1
            analyzer.add_match_data(match_id, team, team_passes)
    # 输出详细报告
    print("\n📊 总体统计报告")
    print("-"*60)
    report = analyzer.get_detailed_report()
    for key, value in report.items():
        print(f"  {key}: {value}")
    # 距离分析
    print("\n📏 按传球距离分析")
    print("-"*60)
    distance_analysis = analyzer.analyze_by_distance()
    print(distance_analysis)
    # 时机分析
    print("\n⏰ 按传球时机分析")
    print("-"*60)
    timing_analysis = analyzer.analyze_by_timing()
    print(timing_analysis)
    # 方向分析
    print("\n🧭 按传球方向分析")
    print("-"*60)
    direction_analysis = analyzer.analyze_by_direction()
    print(direction_analysis)
    # 压力分析
    print("\n🔥 按压力程度分析")
    print("-"*60)
    pressure_analysis = analyzer.analyze_by_pressure()
    print(pressure_analysis)
    # 队伍对比
    print("\n🏆 队伍对比分析")
    print("-"*60)
    team_comparison = analyzer.compare_teams()
    print(team_comparison)
    # 可视化
    print("\n📈 正在生成可视化图表...")
    analyzer.visualize_success_rate()
    # 获取最关键的洞察
    print("\n💡 关键洞察")
    print("-"*60)
    # 找出最佳传球距离区间
    best_distance = distance_analysis['成功率'].idxmax()
    print(f"  最佳传球距离区间: {best_distance} (成功率 {distance_analysis.loc[best_distance, '成功率']}%)")
    # 找出最佳时机
    best_timing = timing_analysis['成功率'].idxmax()
    print(f"  最佳传球时机: {best_timing} (成功率 {timing_analysis.loc[best_timing, '成功率']}%)")
    # 找出最佳方向和压力
    best_direction = direction_analysis['成功率'].idxmax()
    best_pressure = pressure_analysis['成功率'].idxmax()
    print(f"  最佳传球方向: {best_direction}")
    print(f"  最佳压力条件: {best_pressure}压力")
    # 队伍排名
    team_ranking = team_comparison.sort_values('成功率', ascending=False)
    print("\n🏅 队伍成功率排名")
    for i, (team, row) in enumerate(team_ranking.iterrows(), 1):
        print(f"  {i}. {team}: {row['成功率']}% ({row['成功次数']}/{row['传球次数']})")
if __name__ == "__main__":
    main()

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

主要功能

  1. 数据管理:支持添加比赛数据、多队伍管理
  2. 统计分析
    • 按传球距离分析成功率
    • 按传球时机分析
    • 按传球方向分析
    • 按压力程度分析
  3. 可视化展示:生成直观的图表
  4. 队伍对比:比较不同队伍的表现

输出示例

📊 总体统计报告
------------------------------------------------------------
  总传球次数: 486
  成功传球次数: 341
  总成功率: 70.16
  平均传球距离: 12.83
  最大传球距离: 24.98
  最小传球距离: 1.03
📏 按传球距离分析
------------------------------------------------------------
         传球次数       成功率  成功次数
0-5m        83  82.892   69
5-10m       79  77.215   61
10-15m      82  70.732   58
15-20m      81  61.728   50
20-30m      80  67.500   54
30m以上     81  66.667   54

使用建议

  1. 数据导入:可以修改generate_sample_data()函数,或添加CSV文件导入功能
  2. 分析维度:可根据需要添加更多分析维度(如场地位置、球员位置等)
  3. 实时监控:可扩展为实时数据输入和监控系统
  4. 预测功能:可加入机器学习模型预测成功率

这个系统有助于教练团队分析短传配合的效率,发现需要改进的环节,优化战术安排。

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