本文目录导读:

我来为你创建一个统计弧线球传中精准度的Python案例,这个案例会模拟足球比赛中的弧线球传中数据,并计算精准度。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime
class CrossAccuracyAnalyzer:
"""
弧线球传中精准度分析器
"""
def __init__(self, player_name="球员A", team_name="球队A"):
self.player_name = player_name
self.team_name = team_name
self.cross_data = []
self.df = None
def generate_sample_data(self, n_crosses=100):
"""
生成模拟的传中数据
包含不同类型的传中情况
"""
np.random.seed(42) # 可重复性
# 传中类型
cross_types = ['低平球传中', '高球传中', '半高球传中', '外脚背传中']
# 传中区域
zones = ['左路', '右路', '中路']
# 防守强度
pressure_levels = ['低', '中', '高']
for i in range(n_crosses):
# 随机选择传中特征
cross_type = np.random.choice(cross_types, p=[0.3, 0.3, 0.25, 0.15])
zone = np.random.choice(zones, p=[0.4, 0.4, 0.2])
pressure = np.random.choice(pressure_levels, p=[0.3, 0.4, 0.3])
# 计算成功概率(考虑各种因素)
success_prob = 0.5 # 基础概率
# 根据传中类型调整
if cross_type == '低平球传中':
success_prob += 0.1
elif cross_type == '高球传中':
success_prob -= 0.05
elif cross_type == '外脚背传中':
success_prob += 0.05
# 根据区域调整
if zone == '左路':
success_prob += 0.02
elif zone == '右路':
success_prob -= 0.02
# 根据防守压力调整
if pressure == '低':
success_prob += 0.15
elif pressure == '高':
success_prob -= 0.2
# 添加随机因素
success_prob += np.random.normal(0, 0.1)
success_prob = np.clip(success_prob, 0, 1)
# 生成传中数据
data = {
'序号': i + 1,
'比赛日期': datetime(2024, 1, 1).date() + pd.DateOffset(days=np.random.randint(0, 180)),
'对手': f"对手{np.random.randint(1, 20)}",
'传中类型': cross_type,
'传中区域': zone,
'防守压力': pressure,
'传球距离(米)': np.random.randint(20, 50),
'传球高度(米)': np.random.randint(1, 8),
'传球速度(km/h)': np.random.randint(60, 100),
'触球部位': np.random.choice(['内脚背', '外脚背', '脚背正面']),
'是否成功': np.random.choice([1, 0], p=[success_prob, 1-success_prob])
}
self.cross_data.append(data)
self.df = pd.DataFrame(self.cross_data)
self.df['比赛日期'] = pd.to_datetime(self.df['比赛日期'])
def calculate_accuracy(self):
"""
计算总体精准度
"""
if self.df is None:
print("没有数据,请先导入或生成数据")
return 0
total_crosses = len(self.df)
successful_crosses = self.df['是否成功'].sum()
accuracy = successful_crosses / total_crosses * 100
return accuracy, total_crosses, successful_crosses
def calculate_accuracy_by_type(self):
"""
按传中类型统计精准度
"""
accuracy_by_type = self.df.groupby('传中类型').agg({
'是否成功': ['count', 'sum', 'mean']
}).round(3)
accuracy_by_type.columns = ['总传中数', '成功数', '成功率']
accuracy_by_type['精准度(%)'] = accuracy_by_type['成功率'] * 100
return accuracy_by_type
def calculate_accuracy_by_zone(self):
"""
按传中区域统计精准度
"""
accuracy_by_zone = self.df.groupby(['传中区域', '防守压力']).agg({
'是否成功': ['count', 'sum', 'mean']
}).round(3)
accuracy_by_zone.columns = ['总传中数', '成功数', '成功率']
accuracy_by_zone['精准度(%)'] = accuracy_by_zone['成功率'] * 100
return accuracy_by_zone
def analyze_technical_characteristics(self):
"""
分析传球技术特征与精准度的关系
"""
# 建立技术特征与精准度的关联
df_analysis = self.df.copy()
# 距离分组
df_analysis['距离分类'] = pd.cut(df_analysis['传球距离(米)'],
bins=[0, 25, 35, 50],
labels=['短传(<25m)', '中距离(25-35m)', '长传(>35m)'])
# 高度分组
df_analysis['高度分类'] = pd.cut(df_analysis['传球高度(米)'],
bins=[0, 2, 5, 8],
labels=['低平球(0-2m)', '中高度(2-5m)', '高球(5-8m)'])
# 分析不同距离的精准度
distance_accuracy = df_analysis.groupby('距离分类')['是否成功'].agg(['count', 'mean']).reset_index()
distance_accuracy['精准度(%)'] = (distance_accuracy['mean'] * 100).round(2)
# 分析不同高度的精准度
height_accuracy = df_analysis.groupby('高度分类')['是否成功'].agg(['count', 'mean']).reset_index()
height_accuracy['精准度(%)'] = (height_accuracy['mean'] * 100).round(2)
return {
'distance_accuracy': distance_accuracy,
'height_accuracy': height_accuracy
}
def visualize_results(self):
"""
可视化分析结果
"""
fig, axes = plt.subplots(2, 2, figsize=(15, 12))
# 1. 总体精准度
accuracy, total, success = self.calculate_accuracy()
ax1 = axes[0, 0]
ax1.bar(['总体精准度'], [accuracy], color='blue', alpha=0.7)
ax1.set_ylabel('精准度 (%)')
ax1.set_title(f'{self.player_name} 弧线球传中总体精准度')
ax1.text(0, accuracy+1, f'{accuracy:.1f}%', ha='center', fontweight='bold')
# 2. 各类型精准度
acc_by_type = self.calculate_accuracy_by_type()
ax2 = axes[0, 1]
ax2.bar([t.replace(' ', '\n') for t in acc_by_type.index],
acc_by_type['精准度(%)'],
color=['blue', 'green', 'orange', 'red'])
ax2.set_ylabel('精准度 (%)')
ax2.set_title('不同传中类型的精准度')
ax2.set_ylim(0, 100)
for i, v in enumerate(acc_by_type['精准度(%)']):
ax2.text(i, v+2, f'{v:.1f}%', ha='center', fontsize=8)
# 3. 不同区域的精准度
acc_by_zone = self.calculate_accuracy_by_zone()
zones = ['左路', '右路', '中路']
acc_by_zone_simple = []
for zone in zones:
zone_data = acc_by_zone.xs(zone, level='传中区域') if zone in acc_by_zone.index.get_level_values(0) else None
if zone_data is not None:
avg_accuracy = zone_data['精准度(%)'].mean()
acc_by_zone_simple.append(avg_accuracy)
else:
acc_by_zone_simple.append(0)
ax3 = axes[1, 0]
ax3.bar(zones, acc_by_zone_simple, color=['blue', 'green', 'orange'])
ax3.set_ylabel('平均精准度 (%)')
ax3.set_title('不同区域的传中精准度')
for i, v in enumerate(acc_by_zone_simple):
ax3.text(i, v+1, f'{v:.1f}%', ha='center')
# 4. 按防守压力的精准度
pressure_accuracy = self.df.groupby('防守压力')['是否成功'].mean() * 100
ax4 = axes[1, 1]
ax4.bar(pressure_accuracy.index, pressure_accuracy, color=['green', 'orange', 'red'])
ax4.set_ylabel('精准度 (%)')
ax4.set_title('不同防守压力下的精准度')
for i, v in enumerate(pressure_accuracy):
ax4.text(i, v+1, f'{v:.1f}%', ha='center')
plt.tight_layout()
plt.show()
def generate_report(self):
"""
生成完整分析报告
"""
print("\n" + "="*60)
print(f"弧线球传中精准度分析报告")
print(f"球员:{self.player_name} | 球队:{self.team_name}")
print("="*60)
# 总体统计
accuracy, total, success = self.calculate_accuracy()
print(f"\n【总体统计】")
print(f"总传中次数:{total}")
print(f"成功传中:{success}")
print(f"总体精准度:{accuracy:.2f}%")
# 按类型统计
print(f"\n【按传中类型】")
acc_by_type = self.calculate_accuracy_by_type()
print(acc_by_type.to_string())
# 技术特征分析
print(f"\n【技术特征分析】")
tech_analysis = self.analyze_technical_characteristics()
print("\n按传球距离:")
print(tech_analysis['distance_accuracy'].to_string(index=False))
print("\n按传球高度:")
print(tech_analysis['height_accuracy'].to_string(index=False))
# 最佳实践建议
print(f"\n【分析建议】")
best_type = acc_by_type['精准度(%)'].idxmax()
print(f"最擅长的传中类型:{best_type}")
best_pressure = self.df.groupby('防守压力')['是否成功'].mean().idxmax()
print(f"最适合的防守压力:{best_pressure}")
# 技术特性最优
df_tech = self.df
best_distance_cat = tech_analysis['distance_accuracy'].loc[tech_analysis['distance_accuracy']['精准度(%)'].idxmax(), '距离分类']
best_height_cat = tech_analysis['height_accuracy'].loc[tech_analysis['height_accuracy']['精准度(%)'].idxmax(), '高度分类']
print(f"最精准的距离范围:{best_distance_cat}")
print(f"最精准的高度范围:{best_height_cat}")
print("\n" + "="*60)
# 使用示例
def main():
# 创建分析器
analyzer = CrossAccuracyAnalyzer("C罗", "皇马")
# 生成模拟数据(200次传中)
analyzer.generate_sample_data(200)
# 生成分析报告
analyzer.generate_report()
# 可视化分析
analyzer.visualize_results()
# 额外分析:查看原始数据前10行
print("\n【原始数据预览】")
print(analyzer.df.head(10))
if __name__ == "__main__":
main()
这个程序提供了完整的弧线球传中精准度分析功能,包括:
核心功能:
- 数据模拟:生成符合足球实际的传中数据(包括位置、类型、压力等)
- 精准度计算:统计总体及各维度精准度
- 技术分析:分析距离、高度等技术因素对精准度的影响
- 可视化展示:直观展示分析结果
- 报告生成:自动生成文字分析报告
使用方法:
# 创建分析器
analyzer = CrossAccuracyAnalyzer("球员名字", "球队名字")
# 生成数据(可调整数量)
analyzer.generate_sample_data(200)
# 输出报告
analyzer.generate_report()
# 显示图表
analyzer.visualize_results()
输出包括:
- 总体精准度统计
- 按传中类型、区域的精准度对比
- 技术特征(距离、高度)与精准度的关系
- 可视化图表展示
- 基于数据的改进建议
你可以将这个方案应用到实际的足球数据中,只需要替换掉模拟数据生成函数,使用实际的比赛数据即可。