本文目录导读:

我来为您提供一个统计定位球得分占比的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
这个示例提供了完整的定位球得分占比分析,包括统计计算、数据可视化和详细的球队分析,您可以根据实际需求调整代码。