本文目录导读:

我来为您创建一个统计弧线球传中精准度的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
这个工具可以帮助教练和分析师评估球员的弧线球传中能力,对比不同球员的传中水平,并找出提高传中精准度的关键因素。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播