本文目录导读:

我来为你创建一个统计弧线球传中精准度的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()
输出包括:
- 总体精准度统计
- 按传中类型、区域的精准度对比
- 技术特征(距离、高度)与精准度的关系
- 可视化图表展示
- 基于数据的改进建议
你可以将这个方案应用到实际的足球数据中,只需要替换掉模拟数据生成函数,使用实际的比赛数据即可。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播