python案例统计脚后跟传球成功几次?

wen python案例 3

本文目录导读:

python案例统计脚后跟传球成功几次?

  1. 基础版本
  2. 进阶版本(更详细的统计)
  3. 进阶版本(数据可视化)
  4. 使用CSV文件版本
  5. 主要功能说明

我来帮你创建一个统计足球比赛中脚后跟传球成功次数的Python案例。

基础版本

def count_heel_passes(events):
    """
    统计脚后跟传球成功次数
    events: 比赛事件列表,每个事件是一个字典
    """
    heel_pass_count = 0
    for event in events:
        # 判断是否为脚后跟传球且成功
        if (event.get('event_type') == 'pass' and 
            event.get('pass_type') == 'heel' and 
            event.get('outcome') == 'success'):
            heel_pass_count += 1
    return heel_pass_count
# 示例数据
match_events = [
    {'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'success', 'player': '梅西'},
    {'event_type': 'pass', 'pass_type': 'normal', 'outcome': 'success', 'player': 'C罗'},
    {'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'fail', 'player': '内马尔'},
    {'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'success', 'player': '本泽马'},
    {'event_type': 'pass', 'pass_type': 'long', 'outcome': 'success', 'player': '德布劳内'},
    {'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'success', 'player': '梅西'},
    {'event_type': 'shot', 'pass_type': None, 'outcome': 'goal', 'player': '姆巴佩'},
]
result = count_heel_passes(match_events)
print(f"脚后跟传球成功次数: {result}")

进阶版本(更详细的统计)

class HeelPassAnalyzer:
    """脚后跟传球分析器"""
    def __init__(self):
        self.passes = []
        self.success_count = 0
        self.fail_count = 0
        self.total_count = 0
        self.player_stats = {}  # 球员统计
        self.equipment_stats = {}  # 场地/比赛阶段统计
    def add_event(self, event):
        """添加一个比赛事件"""
        if event.get('event_type') != 'pass':
            return
        if event.get('pass_type') != 'heel':
            return
        self.passes.append(event)
        self.total_count += 1
        outcome = event.get('outcome')
        if outcome == 'success':
            self.success_count += 1
        elif outcome == 'fail':
            self.fail_count += 1
        # 统计球员数据
        player = event.get('player', 'unknown')
        if player not in self.player_stats:
            self.player_stats[player] = {'success': 0, 'fail': 0}
        if outcome == 'success':
            self.player_stats[player]['success'] += 1
        elif outcome == 'fail':
            self.player_stats[player]['fail'] += 1
        # 统计比赛阶段
        period = event.get('period', 'unknown')
        if period not in self.equipment_stats:
            self.equipment_stats[period] = {'success': 0, 'fail': 0}
        if outcome == 'success':
            self.equipment_stats[period]['success'] += 1
        elif outcome == 'fail':
            self.equipment_stats[period]['fail'] += 1
    def get_success_rate(self):
        """获取成功率"""
        if self.total_count == 0:
            return 0
        return (self.success_count / self.total_count) * 100
    def get_player_ranking(self):
        """获取球员排名"""
        ranking = []
        for player, stats in self.player_stats.items():
            total = stats['success'] + stats['fail']
            if total > 0:
                rate = (stats['success'] / total) * 100
                ranking.append({
                    'player': player,
                    'total': total,
                    'success': stats['success'],
                    'success_rate': round(rate, 1)
                })
        return sorted(ranking, key=lambda x: x['success_rate'], reverse=True)
    def get_summary(self):
        """获取汇总信息"""
        return {
            'total_pass': self.total_count,
            'success_count': self.success_count,
            'fail_count': self.fail_count,
            'success_rate': round(self.get_success_rate(), 1),
            'players_used': len(self.player_stats),
            'periods_analyzed': len(self.equipment_stats)
        }
def load_match_data():
    """加载比赛数据(模拟)"""
    # 这里可以替换为从文件或API加载真实数据
    return [
        {'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'success', 
         'player': '梅西', 'period': '上半场', 'minute': 12},
        {'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'success', 
         'player': 'C罗', 'period': '上半场', 'minute': 15},
        {'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'fail', 
         'player': '内马尔', 'period': '上半场', 'minute': 23},
        {'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'success', 
         'player': '梅西', 'period': '上半场', 'minute': 45},
        {'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'success', 
         'player': '本泽马', 'period': '下半场', 'minute': 55},
        {'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'fail', 
         'player': '姆巴佩', 'period': '下半场', 'minute': 67},
        {'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'success', 
         'player': '德布劳内', 'period': '下半场', 'minute': 78},
        {'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'success', 
         'player': 'C罗', 'period': '下半场', 'minute': 85},
        {'event_type': 'pass', 'pass_type': 'heel', 'outcome': 'success', 
         'player': '梅西', 'period': '下半场', 'minute': 90},
    ]
def main():
    """主函数"""
    analyzer = HeelPassAnalyzer()
    # 加载数据
    match_events = load_match_data()
    # 分析所有事件
    for event in match_events:
        analyzer.add_event(event)
    # 输出结果
    print("=" * 50)
    print("脚后跟传球统计分析")
    print("=" * 50)
    # 基本统计
    summary = analyzer.get_summary()
    print(f"\n📊 基本统计:")
    print(f"  总传球次数: {summary['total_pass']}")
    print(f"  成功次数:   {summary['success_count']}")
    print(f"  失败次数:   {summary['fail_count']}")
    print(f"  成功率:     {summary['success_rate']}%")
    print(f"  参与球员数: {summary['players_used']}")
    # 球员排名
    print(f"\n🏆 球员排名(按成功率):")
    player_ranking = analyzer.get_player_ranking()
    for i, player in enumerate(player_ranking, 1):
        print(f"  {i}. {player['player']}: {player['success']}/{player['total']} "
              f"({player['success_rate']}%)")
    # 场地/时期统计
    print(f"\n⏱️ 比赛阶段统计:")
    for period, stats in analyzer.equipment_stats.items():
        success_rate = 0
        total = stats['success'] + stats['fail']
        if total > 0:
            success_rate = (stats['success'] / total) * 100
        print(f"  {period}: 成功 {stats['success']} 次, "
              f"失败 {stats['fail']} 次, 成功率 {success_rate:.1f}%")
# 运行主程序
if __name__ == "__main__":
    main()

进阶版本(数据可视化)

import matplotlib.pyplot as plt
import pandas as pd
from collections import Counter
def visualize_heel_passes():
    """可视化脚后跟传球数据"""
    # 模拟数据
    data = {
        'player': ['梅西', 'C罗', '内马尔', '本泽马', '姆巴佩', '德布劳内', '哈兰德'],
        'success': [8, 6, 5, 4, 3, 7, 2],
        'fail': [2, 3, 4, 2, 1, 2, 1]
    }
    df = pd.DataFrame(data)
    df['total'] = df['success'] + df['fail']
    df['success_rate'] = (df['success'] / df['total'] * 100).round(1)
    # 创建图表
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
    # 柱状图显示成功/失败次数
    x = np.arange(len(df))
    width = 0.35
    ax1.bar(x - width/2, df['success'], width, label='成功', color='green')
    ax1.bar(x + width/2, df['fail'], width, label='失败', color='red')
    ax1.set_xlabel('球员')
    ax1.set_ylabel('次数')
    ax1.set_title('脚后跟传球成功/失败次数')
    ax1.set_xticks(x)
    ax1.set_xticklabels(df['player'])
    ax1.legend()
    # 饼图显示成功率
    colors = plt.cm.Set3(range(len(df)))
    ax2.pie(df['success'], labels=df['player'], autopct='%1.1f%%', 
            colors=colors, startangle=90)
    ax2.set_title('脚后跟传球成功分布')
    plt.tight_layout()
    plt.show()

使用CSV文件版本

import csv
def analyze_from_csv(file_path):
    """从CSV文件读取数据并分析"""
    heel_pass_success = 0
    heel_pass_total = 0
    with open(file_path, 'r', encoding='utf-8') as file:
        reader = csv.DictReader(file)
        for row in reader:
            if (row['event_type'] == 'pass' and row['pass_type'] == 'heel'):
                heel_pass_total += 1
                if row['outcome'] == 'success':
                    heel_pass_success += 1
    return {
        'total': heel_pass_total,
        'success': heel_pass_success,
        'fail': heel_pass_total - heel_pass_success,
        'success_rate': (heel_pass_success / heel_pass_total * 100) if heel_pass_total > 0 else 0
    }
# 示例:创建CSV文件
def create_example_csv():
    """创建示例CSV文件"""
    headers = ['event_type', 'pass_type', 'outcome', 'player', 'minute']
    data = [
        ['pass', 'heel', 'success', '梅西', 12],
        ['pass', 'heel', 'success', 'C罗', 15],
        ['pass', 'normal', 'success', '内马尔', 20],
        ['pass', 'heel', 'fail', '本泽马', 25],
        ['pass', 'heel', 'success', '姆巴佩', 45],
        ['pass', 'long', 'success', '德布劳内', 60],
        ['pass', 'heel', 'success', '哈兰德', 75],
        ['pass', 'heel', 'success', '梅西', 85],
    ]
    with open('match_data.csv', 'w', newline='', encoding='utf-8') as file:
        writer = csv.writer(file)
        writer.writerow(headers)
        writer.writerows(data)
if __name__ == "__main__":
    # 创建示例文件并分析
    create_example_csv()
    result = analyze_from_csv('match_data.csv')
    print(f"脚后跟传球总数: {result['total']}")
    print(f"成功次数:      {result['success']}")
    print(f"失败次数:      {result['fail']}")
    print(f"成功率:        {result['success_rate']:.1f}%")

主要功能说明

  1. 基础版本:简单统计成功次数
  2. 进阶版本:支持按球员、时间段等维度详细统计
  3. 可视化版本:生成图表展示结果
  4. CSV版本:从文件读取真实比赛数据

这些代码可以直接运行,你也可以根据自己的数据结构进行调整,需要我解释某个部分或者添加特定功能吗?

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