python案例统计传球成功率哪队更高?

wen python案例 2

本文目录导读:

python案例统计传球成功率哪队更高?

  1. 方案一:基础版 - 两队简单对比
  2. 方案二:进阶版 - 多项传球指标分析
  3. 方案三:完整版 - 带数据输入和图表可视化
  4. 方案四:简洁对比版 - 两队直接比较
  5. 使用建议

我来帮你设计一个统计传球成功率的Python案例,这里提供几种不同场景的实现方案:

基础版 - 两队简单对比

def calculate_pass_accuracy(team_name, passes_completed, total_passes):
    """计算传球成功率"""
    if total_passes == 0:
        return 0
    accuracy = (passes_completed / total_passes) * 100
    return round(accuracy, 2)
def compare_teams(team1, team2):
    """比较两队传球成功率"""
    print(f"{'='*50}")
    print(f"{'球队':<15}{'成功传球':<10}{'总传球':<10}{'成功率':<10}")
    print(f"{'='*50}")
    # 输出两队数据
    print(f"{team1['name']:<15}{team1['completed']:<10}{team1['total']:<10}"
          f"{team1['accuracy']}%")
    print(f"{team2['name']:<15}{team2['completed']:<10}{team2['total']:<10}"
          f"{team2['accuracy']}%")
    print(f"{'='*50}")
    # 比较结果
    if team1['accuracy'] > team2['accuracy']:
        print(f"🏆 {team1['name']} 的传球成功率更高!")
    elif team2['accuracy'] > team1['accuracy']:
        print(f"🏆 {team2['name']} 的传球成功率更高!")
    else:
        print("🤝 两队传球成功率相同!")
# 示例数据
team_a = {
    'name': '曼联',
    'completed': 456,
    'total': 520
}
team_b = {
    'name': '曼城',
    'completed': 489,
    'total': 550
}
# 计算成功率
team_a['accuracy'] = calculate_pass_accuracy(team_a['name'], 
                                             team_a['completed'], 
                                             team_a['total'])
team_b['accuracy'] = calculate_pass_accuracy(team_b['name'], 
                                             team_b['completed'], 
                                             team_b['total'])
# 比较结果
compare_teams(team_a, team_b)

进阶版 - 多项传球指标分析

class FootballTeam:
    """足球队伍类"""
    def __init__(self, name, passes_data):
        self.name = name
        self.passes_data = passes_data  # 字典: {'successful': 成功数, 'total': 总数}
    def get_accuracy(self):
        """获取传球成功率"""
        successful = self.passes_data['successful']
        total = self.passes_data['total']
        return (successful / total * 100) if total > 0 else 0
def analyze_passes(teams):
    """分析多支球队的传球数据"""
    results = []
    for team in teams:
        accuracy = team.get_accuracy()
        results.append({
            'team': team.name,
            'accuracy': accuracy,
            'successful': team.passes_data['successful'],
            'total': team.passes_data['total']
        })
    # 排序
    results.sort(key=lambda x: x['accuracy'], reverse=True)
    # 显示结果
    print(f"\n{'='*60}")
    print(f"{'排名':<5}{'球队':<15}{'成功传球':<10}{'总传球':<10}{'成功率':<10}")
    print(f"{'='*60}")
    for i, result in enumerate(results, 1):
        print(f"{i:<5}{result['team']:<15}{result['successful']:<10}"
              f"{result['total']:<10}{result['accuracy']:.2f}%")
    print(f"{'='*60}")
    # 找出最高和最低
    best = results[0]
    worst = results[-1]
    print(f"\n📊 最佳传球成功率: {best['team']} {best['accuracy']:.2f}%")
    print(f"📊 最低传球成功率: {worst['team']} {worst['accuracy']:.2f}%")
    return results
# 示例数据
teams_data = [
    FootballTeam("巴塞罗那", {'successful': 523, 'total': 567}),
    FootballTeam("皇家马德里", {'successful': 498, 'total': 545}),
    FootballTeam("拜仁慕尼黑", {'successful': 512, 'total': 560}),
    FootballTeam("利物浦", {'successful': 456, 'total': 520}),
    FootballTeam("国际米兰", {'successful': 445, 'total': 510}),
]
# 执行分析
results = analyze_passes(teams_data)

完整版 - 带数据输入和图表可视化

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
def create_football_stats():
    """创建足球传球统计系统"""
    def get_team_data():
        """获取球队数据"""
        teams = []
        print("请输入球队数据(输入'完成'结束):")
        while True:
            team_name = input("球队名称: ").strip()
            if team_name.lower() == '完成' or team_name.lower() == 'quit':
                break
            try:
                successful = int(input(f"{team_name} 成功传球数: "))
                total = int(input(f"{team_name} 总传球数: "))
                if successful > total:
                    print("错误:成功传球数不能大于总传球数!")
                    continue
                teams.append({
                    'name': team_name,
                    'successful': successful,
                    'total': total,
                    'accuracy': (successful / total * 100) if total > 0 else 0
                })
                print(f"✅ {team_name} 数据已添加")
            except ValueError:
                print("❌ 请输入有效数字!")
        return teams
    def visualize_data(teams):
        """可视化传球数据"""
        if not teams:
            print("没有数据可以展示")
            return
        names = [team['name'] for team in teams]
        accuracy = [team['accuracy'] for team in teams]
        successful = [team['successful'] for team in teams]
        total = [team['total'] for team in teams]
        # 创建图表
        fig, axes = plt.subplots(2, 2, figsize=(12, 10))
        fig.suptitle('足球传球统计分析', fontsize=16)
        # 1. 传球成功率柱状图
        axes[0, 0].bar(names, accuracy, color=['red', 'blue', 'green', 'orange', 'purple'][:len(names)])
        axes[0, 0].set_title('传球成功率 (%)')
        axes[0, 0].set_ylabel('百分比')
        axes[0, 0].tick_params(axis='x', rotation=45)
        # 2. 成功传球数
        axes[0, 1].bar(names, successful, color='green', alpha=0.7)
        axes[0, 1].set_title('成功传球数')
        axes[0, 1].set_ylabel('次数')
        axes[0, 1].tick_params(axis='x', rotation=45)
        # 3. 饼图 - 各队成功传球占比
        axes[1, 0].pie(successful, labels=names, autopct='%1.1f%%')
        axes[1, 0].set_title('成功传球占比')
        # 4. 散点图 - 传球数与成功率关系
        axes[1, 1].scatter(total, accuracy, s=100)
        for i, name in enumerate(names):
            axes[1, 1].annotate(name, (total[i], accuracy[i]))
        axes[1, 1].set_xlabel('总传球数')
        axes[1, 1].set_ylabel('成功率 (%)')
        axes[1, 1].set_title('传球数 vs 成功率')
        plt.tight_layout()
        plt.show()
    def analyze_and_compare(teams):
        """分析并比较数据"""
        if not teams:
            print("没有数据可分析")
            return
        # 创建DataFrame便于分析
        df = pd.DataFrame(teams)
        # 统计数据
        print("\n" + "="*60)
        print("📊 传球数据统计报告")
        print("="*60)
        print("\n详细数据:")
        print(df[['name', 'successful', 'total', 'accuracy']].to_string(index=False))
        print(f"\n🔍 统计信息:")
        print(f"平均成功率: {df['accuracy'].mean():.2f}%")
        print(f"最高成功率: {df.loc[df['accuracy'].idxmax(), 'name']} "
              f"({df['accuracy'].max():.2f}%)")
        print(f"最低成功率: {df.loc[df['accuracy'].idxmin(), 'name']} "
              f"({df['accuracy'].min():.2f}%)")
        # 判断哪队更高
        max_team = df.loc[df['accuracy'].idxmax()]
        print(f"\n🏆 胜出球队: {max_team['name']} "
              f"(成功率: {max_team['accuracy']:.2f}%)")
        return df
    # 主程序流程
    print("⚽ 足球传球成功率统计系统 ⚽")
    print("="*60)
    # 获取数据
    teams = get_team_data()
    if teams:
        # 分析数据
        df = analyze_and_compare(teams)
        # 询问是否可视化
        show_chart = input("\n是否显示图表?(y/n): ").lower()
        if show_chart == 'y':
            visualize_data(teams)
    else:
        print("未输入任何数据,程序结束。")
# 运行程序
if __name__ == "__main__":
    create_football_stats()

简洁对比版 - 两队直接比较

def compare_two_teams(team1_name, team1_success, team1_total,
                     team2_name, team2_success, team2_total):
    """简洁版两队对比"""
    # 计算成功率
    acc1 = (team1_success / team1_total * 100) if team1_total > 0 else 0
    acc2 = (team2_success / team2_total * 100) if team2_total > 0 else 0
    # 显示结果
    print(f"""
    {'='*50}
    传球数据对比
    {'='*50}
    {team1_name}: {team1_success}/{team1_total} = {acc1:.1f}%
    {team2_name}: {team2_success}/{team2_total} = {acc2:.1f}%
    {'='*50}
    """)
    # 判定结果
    if acc1 > acc2:
        result = f"🏆 {team1_name} 获胜!"
    elif acc2 > acc1:
        result = f"🏆 {team2_name} 获胜!"
    else:
        result = "🤝 平局"
    print(f"结果: {result}")
    print(f"成功率差值: {abs(acc1 - acc2):.2f}%")
    return max(acc1, acc2)
# 使用示例
if __name__ == "__main__":
    # 手动输入
    compare_two_teams("阿森纳", 432, 480, "切尔西", 421, 475)
    # 或者让用户输入
    print("请输入球队1数据:")
    name1 = input("球队名: ")
    suc1 = int(input("成功传球: "))
    tot1 = int(input("总传球: "))
    print("请输入球队2数据:")
    name2 = input("球队名: ")
    suc2 = int(input("成功传球: "))
    tot2 = int(input("总传球: "))
    compare_two_teams(name1, suc1, tot1, name2, suc2, tot2)

使用建议

  1. 基础版:适合快速了解两家俱乐部的对比
  2. 进阶版:适合同时比较多支球队
  3. 可视化版:需要安装 matplotlibpandas
    pip install matplotlib pandas
  4. 简洁版:最轻量级,适合快速计算

每个版本都能有效地比较两队或多队的传球成功率,你可以根据实际需求选择合适的版本使用。

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