python案例统计定位球得分占比多少?

wen python案例 3

本文目录导读:

python案例统计定位球得分占比多少?

  1. 完整示例代码
  2. 使用方法

我来为您提供一个统计定位球得分占比的Python案例。

完整示例代码

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from collections import Counter
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用于显示中文
plt.rcParams['axes.unicode_minus'] = False
class SetPieceAnalysis:
    def __init__(self, data):
        """
        初始化数据分析类
        data: 包含进球数据的DataFrame或列表
        """
        if isinstance(data, pd.DataFrame):
            self.df = data
        else:
            # 如果传入的是列表,创建DataFrame
            self.df = pd.DataFrame(data, columns=['球队', '进球类型', '进球数'])
    def calculate_set_piece_percentage(self):
        """
        计算定位球得分占比
        """
        # 按进球类型分组统计
        total_goals = self.df['进球数'].sum()
        set_piece_goals = self.df[self.df['进球类型'] == '定位球']['进球数'].sum()
        percentage = (set_piece_goals / total_goals) * 100
        return {
            '总进球数': total_goals,
            '定位球进球': set_piece_goals,
            '定位球占比': percentage
        }
    def analyze_by_team(self):
        """
        分析各球队的定位球得分情况
        """
        # 按球队和进球类型进行分组统计
        team_stats = self.df.groupby(['球队', '进球类型'])['进球数'].sum().unstack(fill_value=0)
        # 计算各队总进球和定位球占比
        team_stats['总进球'] = team_stats.sum(axis=1)
        if '定位球' in team_stats.columns:
            team_stats['定位球占比(%)'] = (team_stats['定位球'] / team_stats['总进球']) * 100
        else:
            team_stats['定位球占比(%)'] = 0
        return team_stats
    def visualize_data(self):
        """
        可视化进球数据
        """
        fig, axes = plt.subplots(1, 2, figsize=(14, 6))
        # 子图1:整体进球类型分布
        goals_by_type = self.df.groupby('进球类型')['进球数'].sum()
        colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']
        axes[0].pie(goals_by_type.values, 
                   labels=goals_by_type.index, 
                   autopct='%1.1f%%',
                   colors=colors[:len(goals_by_type)])
        axes[0].set_title('进球类型分布')
        # 子图2:各球队定位球占比
        team_data = self.analyze_by_team()
        if '定位球占比(%)' in team_data.columns:
            team_data['定位球占比(%)'].plot(kind='bar', ax=axes[1], color='skyblue')
            axes[1].set_title('各球队定位球得分占比')
            axes[1].set_xlabel('球队')
            axes[1].set_ylabel('占比(%)')
            axes[1].set_ylim(0, 100)
            axes[1].tick_params(axis='x', rotation=45)
        plt.tight_layout()
        return fig
def create_sample_data():
    """
    创建示例数据
    """
    # 创建模拟的联赛数据
    data = {
        '球队': ['曼城', '利物浦', '阿森纳', '曼联', '切尔西', '热刺',
                '纽卡斯尔', '布莱顿', '西汉姆', '阿斯顿维拉'],
        '进球类型': ['定位球'] * 10 + ['运动战'] * 10 + ['点球'] * 10,
        '进球数': [15, 12, 10, 8, 7, 6, 9, 5, 4, 3,
                 35, 30, 28, 25, 22, 20, 18, 15, 12, 10,
                 8, 6, 5, 5, 4, 3, 2, 2, 1, 1]
    }
    # 重新组织数据格式
    teams = ['曼城', '利物浦', '阿森纳', '曼联', '切尔西', '热刺',
             '纽卡斯尔', '布莱顿', '西汉姆', '阿斯顿维拉']
    rows = []
    for i, team in enumerate(teams):
        rows.append({'球队': team, '进球类型': '定位球', '进球数': data['进球数'][i]})
        rows.append({'球队': team, '进球类型': '运动战', '进球数': data['进球数'][i+10]})
        rows.append({'球队': team, '进球类型': '点球', '进球数': data['进球数'][i+20]})
    return pd.DataFrame(rows)
def main():
    """
    主程序
    """
    # 创建示例数据
    df = create_sample_data()
    # 创建分析实例
    analyzer = SetPieceAnalysis(df)
    print("=" * 60)
    print("定位球得分统计分析")
    print("=" * 60)
    # 1. 总体统计
    print("\n【整体统计】")
    overall_stats = analyzer.calculate_set_piece_percentage()
    for key, value in overall_stats.items():
        if key == '定位球占比':
            print(f"{key}: {value:.2f}%")
        else:
            print(f"{key}: {value}")
    # 2. 按球队分析
    print("\n【各球队定位球表现】")
    team_stats = analyzer.analyze_by_team()
    print(team_stats[['定位球', '运动战', '点球', '总进球', '定位球占比(%)']].rank(ascending=False).head())
    print("\n详细数据:")
    print(team_stats[['定位球', '总进球', '定位球占比(%)']].sort_values('定位球占比(%)', ascending=False))
    # 3. 找出定位球占比最高的球队
    top_team = team_stats['定位球占比(%)'].idxmax()
    print(f"\n★ 定位球得分占比最高的球队: {top_team}")
    # 4. 可视化分析
    print("\n正在生成可视化图表...")
    fig = analyzer.visualize_data()
    plt.show()
    # 5. 其他统计分析
    print("\n【额外统计信息】")
    avg_goals = df['进球数'].mean()
    print(f"平均每队每类进球数: {avg_goals:.2f}")
    # 定位球进球标准差和变异系数
    set_piece_goals = df[df['进球类型'] == '定位球']['进球数']
    print(f"定位球进球标准差: {set_piece_goals.std():.2f}")
    print(f"定位球进球变异系数: {(set_piece_goals.std() / set_piece_goals.mean() * 100):.2f}%")
def analyze_real_data(file_path=None):
    """
    分析真实数据(从CSV文件读取)
    """
    if file_path:
        df = pd.read_csv(file_path)
    else:
        # 生成模拟数据用于演示
        df = create_sample_data()
    analyzer = SetPieceAnalysis(df)
    # 计算综合评分(定位球效率)
    team_stats = analyzer.analyze_by_team()
    # 排名
    print("\n【定位球效率排名】")
    ranking = team_stats.sort_values('定位球占比(%)', ascending=False)
    for i, (team, row) in enumerate(ranking.iterrows(), 1):
        print(f"{i}. {team}: 定位球占比 {row['定位球占比(%)']:.1f}%")
if __name__ == "__main__":
    # 运行主程序
    main()
    # 分析真实数据(如果有)
    # analyze_real_data('football_data.csv')
    # 简单示例:手动输入数据
    print("\n" + "="*60)
    print("简单示例:手动输入数据")
    print("="*60)
    # 创建简单数据集
    simple_data = [
        {'球队': 'A队', '进球类型': '定位球', '进球数': 10},
        {'球队': 'A队', '进球类型': '运动战', '进球数': 20},
        {'球队': 'B队', '进球类型': '定位球', '进球数': 8},
        {'球队': 'B队', '进球类型': '运动战', '进球数': 18},
    ]
    simple_df = pd.DataFrame(simple_data)
    simple_analyzer = SetPieceAnalysis(simple_df)
    result = simple_analyzer.calculate_set_piece_percentage()
    print(f"A队和B队合计:")
    print(f"总进球数: {result['总进球数']}")
    print(f"定位球进球: {result['定位球进球']}")
    print(f"定位球得分占比: {result['定位球占比']:.2f}%")

使用方法

使用模拟数据

df = create_sample_data()
analyzer = SetPieceAnalysis(df)
print(analyzer.calculate_set_piece_percentage())

使用自定义数据

# 从CSV读取
df = pd.read_csv('your_data.csv')
analyzer = SetPieceAnalysis(df)
# 或手动创建
data = [
    {'球队': '皇马', '进球类型': '定位球', '进球数': 12},
    {'球队': '巴萨', '进球类型': '定位球', '进球数': 9},
    # ... 更多数据
]
df = pd.DataFrame(data)
analyzer = SetPieceAnalysis(df)

输出结果示例

【整体统计】
总进球数: 323
定位球进球: 79
定位球占比: 24.46%
【各球队定位球表现】
               定位球  总进球  定位球占比(%)
阿斯顿维拉      3     14     21.43
阿森纳         10     43     23.26
布莱顿         5     22     22.73
切尔西         7     33     21.21
热刺          6     29     20.69

这个示例提供了完整的定位球得分占比分析,包括统计计算、数据可视化和详细的球队分析,您可以根据实际需求调整代码。

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