本文目录导读:

我来为您创建一个统计弧线球传中精准度的Python案例,这个案例将模拟足球比赛中的数据,计算传中精准度。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
class CrossAccuracyAnalyzer:
"""弧线球传中精准度分析器"""
def __init__(self):
self.crosses = []
self.player_stats = {}
def add_cross_data(self, player_name, team, cross_type, target_zone,
success, speed, curve_amount, match_id):
"""
添加单次传中数据
参数:
- player_name: 球员名
- team: 球队
- cross_type: 传中类型 (弧线球/直线球/下底传中等)
- target_zone: 目标区域 (前点/中路/后点)
- success: 是否成功 (1成功, 0失败)
- speed: 传球速度 (km/h)
- curve_amount: 弧线程度 (1-10)
- match_id: 比赛编号
"""
cross_data = {
'player': player_name,
'team': team,
'cross_type': cross_type,
'target_zone': target_zone,
'success': success,
'speed': speed,
'curve_amount': curve_amount,
'match_id': match_id,
'timestamp': datetime.now()
}
self.crosses.append(cross_data)
def import_batch_data(self, data_file=None):
"""批量导入数据(默认生成模拟数据)"""
if data_file:
# 从CSV文件导入
df = pd.read_csv(data_file)
for _, row in df.iterrows():
self.add_cross_data(
player_name=row['player'],
team=row['team'],
cross_type=row['cross_type'],
target_zone=row['target_zone'],
success=row['success'],
speed=row['speed'],
curve_amount=row['curve_amount'],
match_id=row['match_id']
)
else:
# 生成模拟数据
self._generate_simulated_data()
def _generate_simulated_data(self, num_samples=100):
"""生成模拟数据用于演示"""
players = ['梅西', 'C罗', '内马尔', '姆巴佩', '萨拉赫', '德布劳内',
'阿诺德', '罗伯逊', '坎塞洛', '迪玛利亚']
teams = ['巴黎圣日耳曼', '皇马', '利物浦', '曼城', '巴萨']
cross_types = ['弧线球', '直线球', '下底传中', '倒三角']
target_zones = ['前点', '中路', '后点']
np.random.seed(42)
for i in range(num_samples):
player = np.random.choice(players)
team = np.random.choice(teams)
cross_type = np.random.choice(cross_types)
target_zone = np.random.choice(target_zones)
# 弧线球成功率更高
if cross_type == '弧线球':
success = np.random.choice([0, 1], p=[0.25, 0.75])
curve = np.random.randint(6, 10)
elif cross_type == '直线球':
success = np.random.choice([0, 1], p=[0.4, 0.6])
curve = np.random.randint(1, 4)
else:
success = np.random.choice([0, 1], p=[0.5, 0.5])
curve = np.random.randint(3, 7)
speed = np.random.uniform(50, 90) # km/h
match_id = f'M{np.random.randint(1, 20)}'
self.add_cross_data(player, team, cross_type, target_zone,
success, speed, curve, match_id)
def calculate_accuracy(self, cross_type='弧线球'):
"""计算指定类型传中的精准度"""
df = pd.DataFrame(self.crosses)
if cross_type:
df_filtered = df[df['cross_type'] == cross_type]
else:
df_filtered = df
if len(df_filtered) == 0:
return 0
accuracy = df_filtered['success'].mean() * 100
total_attempts = len(df_filtered)
successful = df_filtered['success'].sum()
return {
'原精度': f'{accuracy:.2f}%',
'总次数': total_attempts,
'成功次数': successful,
'失败次数': total_attempts - successful
}
def player_accuracy_ranking(self, cross_type='弧线球'):
"""球员精准度排名"""
df = pd.DataFrame(self.crosses)
# 过滤指定类型
if cross_type:
df_filtered = df[df['cross_type'] == cross_type]
else:
df_filtered = df
# 按球员统计
stats = df_filtered.groupby('player').agg({
'success': ['count', 'sum']
}).round(2)
stats.columns = ['总传中', '成功']
stats['精准度'] = (stats['成功'] / stats['总传中'] * 100).round(2)
# 至少传中5次以上才参与排名
stats = stats[stats['总传中'] >= 5]
return stats.sort_values('精准度', ascending=False)
def zone_analysis(self, cross_type='弧线球'):
"""区域精准度分析"""
df = pd.DataFrame(self.crosses)
if cross_type:
df_filtered = df[df['cross_type'] == cross_type]
else:
df_filtered = df
# 按区域统计
zone_stats = df_filtered.groupby('target_zone').agg({
'success': ['count', 'sum', 'mean']
}).round(3)
zone_stats.columns = ['总传中', '成功', '成功率']
zone_stats['精准度%'] = (zone_stats['成功率'] * 100).round(2)
return zone_stats
def speed_analysis(self, cross_type='弧线球'):
"""速度对精准度的影响分析"""
df = pd.DataFrame(self.crosses)
if cross_type:
df_filtered = df[df['cross_type'] == cross_type]
else:
df_filtered = df
# 速度分段
df_filtered['速度区间'] = pd.cut(df_filtered['speed'],
bins=[0, 60, 70, 80, 100],
labels=['低速(<60)', '中速(60-70)',
'快速(70-80)', '极速(>80)'])
speed_stats = df_filtered.groupby('速度区间').agg({
'success': ['count', 'mean']
}).round(3)
speed_stats.columns = ['次数', '成功率']
speed_stats['精准度%'] = (speed_stats['成功率'] * 100).round(2)
return speed_stats
def visualize_analysis(self, player_name='梅西', cross_type='弧线球'):
"""可视化分析结果"""
df = pd.DataFrame(self.crosses)
# 筛选数据
df_player = df[(df['player'] == player_name) & (df['cross_type'] == cross_type)]
if len(df_player) == 0:
print(f"没有找到球员 {player_name} 的{cross_type}数据")
return
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
fig.suptitle(f'{player_name} - {cross_type}精准度分析', fontsize=16)
# 1. 精准度饼图
success_count = df_player['success'].sum()
fail_count = len(df_player) - success_count
axes[0, 0].pie([success_count, fail_count],
labels=['成功', '失败'],
autopct='%1.1f%%',
colors=['lightgreen', 'lightcoral'])
axes[0, 0].set_title(f'成功率: {success_count/len(df_player)*100:.1f}%')
# 2. 区域精准度柱状图
zone_data = df_player.groupby('target_zone')['success'].agg(['mean', 'count'])
zone_data['accuracy'] = zone_data['mean'] * 100
axes[0, 1].bar(zone_data.index, zone_data['accuracy'],
color=['#FF6B6B', '#4ECDC4', '#45B7D1'])
axes[0, 1].set_title('不同区域精准度')
axes[0, 1].set_ylabel('精准度 (%)')
axes[0, 1].set_ylim(0, 100)
# 添加数值标签
for i, (idx, row) in enumerate(zone_data.iterrows()):
axes[0, 1].text(i, row['accuracy'] + 2,
f"{row['accuracy']:.1f}%",
ha='center', fontsize=9)
# 3. 速度与精准度散点图
axes[1, 0].scatter(df_player['speed'], df_player['success'], alpha=0.6)
axes[1, 0].set_xlabel('速度 (km/h)')
axes[1, 0].set_ylabel('成功与否')
axes[1, 0].set_title('速度与精准度关系')
axes[1, 0].set_yticks([0, 1])
axes[1, 0].set_yticklabels(['失败', '成功'])
# 4. 弧线程度vs精准度
curve_stats = df_player.groupby('curve_amount')['success'].mean() * 100
axes[1, 1].bar(curve_stats.index, curve_stats.values)
axes[1, 1].set_title('弧线程度vs精准度')
axes[1, 1].set_xlabel('弧线程度 (1-10)')
axes[1, 1].set_ylabel('精准度 (%)')
axes[1, 1].set_ylim(0, 100)
plt.tight_layout()
plt.show()
def generate_report(self):
"""生成综合报告"""
print("=" * 50)
print("弧线球传中精准度分析报告")
print("=" * 50)
# 总体统计
total_crosses = len(self.crosses)
df = pd.DataFrame(self.crosses)
print(f"\n📊 总体统计:")
print(f"总传中次数: {total_crosses}")
print(f"总成功率: {df['success'].mean()*100:.2f}%")
# 不同类型对比
print(f"\n⚽ 不同类型传中对比:")
type_stats = df.groupby('cross_type')['success'].agg(['count', 'mean'])
for cross_type, row in type_stats.iterrows():
print(f" {cross_type}: {row['mean']*100:.1f}% ({int(row['count'])}次)")
# 弧线球详细分析
print(f"\n🎯 弧线球专项分析:")
accuracy = self.calculate_accuracy('弧线球')
print(f" 精准度: {accuracy['原精度']}")
print(f" 成功次数: {accuracy['成功次数']}")
print(f" 失败次数: {accuracy['失败次数']}")
# 球员排名(Top5)
print(f"\n🏆 弧线球精准度排名 (Top5):")
ranking = self.player_accuracy_ranking('弧线球')
if not ranking.empty:
top5 = ranking.head(5)
for i, (player, stats) in enumerate(top5.iterrows(), 1):
print(f" {i}. {player}: {stats['精准度']}% ({int(stats['总传中'])}次)")
# 区域分析
print(f"\n📍 区域精准度分析:")
zone_stats = self.zone_analysis('弧线球')
print(zone_stats)
# 速度分析
print(f"\n⚡ 速度与精准度分析:")
speed_stats = self.speed_analysis('弧线球')
print(speed_stats)
print("\n" + "=" * 50)
# 使用示例
def main():
# 创建分析器
analyzer = CrossAccuracyAnalyzer()
# 导入模拟数据
analyzer.import_batch_data() # 或者使用 import_batch_data('your_data.csv')
# 生成综合报告
analyzer.generate_report()
# 查看特定球员的可视化分析
print("\n📈 球员可视化分析:")
analyzer.visualize_analysis('梅西', '弧线球')
# 对比不同球员
print("\n💡 球员对比:")
players_to_compare = ['梅西', 'C罗', '内马尔']
print(f"{'球员':<10} {'总传中':<8} {'成功':<8} {'精准度':<10}")
print("-" * 40)
for player in players_to_compare:
df = pd.DataFrame(analyzer.crosses)
player_data = df[(df['player'] == player) & (df['cross_type'] == '弧线球')]
if len(player_data) > 0:
accuracy = player_data['success'].mean() * 100
print(f"{player:<10} {len(player_data):<8} {player_data['success'].sum():<8} {accuracy:<10.2f}%")
if __name__ == "__main__":
main()
这个案例提供了以下功能:
主要功能:
-
数据记录:记录每次传中的详细信息(球员、球队、传中类型、目标区域、是否成功等)
-
精准度计算:
- 总体精准度
- 不同类型传中对比
- 球员个人精准度排名
-
多维分析:
- 按区域(前点/中路/后点)分析
- 按速度区间分析
- 弧线程度与精准度关系
-
数据可视化:
- 成功率饼图
- 区域精准度柱状图
- 速度与精准度散点图
- 弧线程度分析
-
综合报告:自动生成详细的分析报告
使用方法:
# 1. 创建分析器
analyzer = CrossAccuracyAnalyzer()
# 2. 方式一:使用模拟数据(演示)
analyzer.import_batch_data()
# 方式二:导入自己的CSV文件
# analyzer.import_batch_data('cross_data.csv')
# 3. 查看球员排名
ranking = analyzer.player_accuracy_ranking('弧线球')
print(ranking)
# 4. 可视化分析某球员
analyzer.visualize_analysis('梅西', '弧线球')
# 5. 生成完整报告
analyzer.generate_report()
CSV数据格式示例:
player,team,cross_type,target_zone,speed,curve_amount,success,match_id 梅西,巴黎圣日耳曼,弧线球,前点,72,8,1,M1 C罗,皇马,弧线球,中路,65,7,1,M1 内马尔,巴黎圣日耳曼,弧线球,后点,78,9,0,M2
这个工具可以帮助教练和分析师评估球员的弧线球传中能力,对比不同球员的传中水平,并找出提高传中精准度的关键因素。