本文目录导读:

我来为您创建一个足球高球传中争顶成功率的统计案例。
完整代码实现
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime
class HighBallStatAnalyzer:
"""高球传中争顶成功率分析器"""
def __init__(self):
"""初始化数据容器"""
self.data = []
self.df = None
def generate_sample_data(self, num_records=100):
"""生成示例数据"""
np.random.seed(42)
players = ['张伟', '李强', '王浩', '赵磊', '陈晨',
'刘洋', '杨帆', '孙明', '周涛', '吴刚']
positions = ['前锋', '中场', '后卫']
matches = [f'第{i}轮' for i in range(1, 20)]
for _ in range(num_records):
record = {
'球员': np.random.choice(players),
'位置': np.random.choice(positions),
'比赛': np.random.choice(matches),
'传球方式': np.random.choice(['角球传中', '边路传中', '定位球', '任意球']),
'传球区域': np.random.choice(['左路', '右路', '中路']),
'比赛时间': np.random.randint(1, 95),
'是否接触': np.random.choice([0, 1], p=[0.3, 0.7]),
'争顶成功': np.random.choice([0, 1], p=[0.4, 0.6])
}
self.data.append(record)
self.df = pd.DataFrame(self.data)
return self.df
def calculate_success_rate(self):
"""计算争顶成功率"""
if self.df is None:
return None
df = self.df.copy()
# 计算总体争顶成功率
total_stats = {
'总传中次数': len(df),
'争顶次数': df['是否接触'].sum(),
'争顶成功次数': df['争顶成功'].sum(),
'总体成功率': df['争顶成功'].mean() * 100
}
# 按球员统计
player_stats = df.groupby('球员').agg({
'是否接触': ['count', 'sum'],
'争顶成功': ['sum', 'mean']
}).round(4)
player_stats.columns = ['传中次数', '争顶次数', '争顶成功次数', '成功率']
player_stats['成功率'] = player_stats['成功率'] * 100
player_stats = player_stats.sort_values('成功率', ascending=False)
# 按位置统计
position_stats = df.groupby('位置').agg({
'是否接触': ['count', 'sum'],
'争顶成功': ['sum', 'mean']
}).round(4)
position_stats.columns = ['传中次数', '争顶次数', '争顶成功次数', '成功率']
position_stats['成功率'] = position_stats['成功率'] * 100
# 按传球方式统计
style_stats = df.groupby('传球方式').agg({
'是否接触': ['count', 'sum'],
'争顶成功': ['sum', 'mean']
}).round(4)
style_stats.columns = ['传中次数', '争顶次数', '争顶成功次数', '成功率']
style_stats['成功率'] = style_stats['成功率'] * 100
return {
'total': total_stats,
'player': player_stats,
'position': position_stats,
'style': style_stats
}
def analyze_time_distribution(self):
"""分析比赛时间段的争顶成功率"""
if self.df is None:
return None
df = self.df.copy()
df['时间段'] = pd.cut(df['比赛时间'],
bins=[0, 15, 30, 45, 60, 75, 95],
labels=['0-15', '15-30', '30-45', '45-60', '60-75', '75-90+'])
time_stats = df.groupby('时间段').agg({
'是否接触': ['count', 'sum'],
'争顶成功': ['sum', 'mean']
}).round(4)
time_stats.columns = ['传中次数', '争顶次数', '争顶成功次数', '成功率']
time_stats['成功率'] = time_stats['成功率'] * 100
return time_stats
def visualize_results(self, stats):
"""可视化统计结果"""
fig, axes = plt.subplots(2, 2, figsize=(15, 12))
# 1. 球员争顶成功率
ax1 = axes[0, 0]
player_data = stats['player'].head(10)
ax1.barh(player_data.index, player_data['成功率'], color='steelblue')
ax1.set_xlabel('成功率 (%)')
ax1.set_title('球员争顶成功率 TOP10')
ax1.set_xlim(0, 100)
for i, v in enumerate(player_data['成功率']):
ax1.text(v + 1, i, f'{v:.1f}%', va='center')
# 2. 不同位置成功率
ax2 = axes[0, 1]
position_data = stats['position']
colors = ['#ff9999', '#66b3ff', '#99ff99']
ax2.bar(position_data.index, position_data['成功率'], color=colors)
ax2.set_ylabel('成功率 (%)')
ax2.set_title('不同位置的争顶成功率')
ax2.set_ylim(0, 100)
for i, v in enumerate(position_data['成功率']):
ax2.text(i, v + 2, f'{v:.1f}%', ha='center')
# 3. 传球方式成功率
ax3 = axes[1, 0]
style_data = stats['style']
ax3.pie(style_data['争顶成功次数'], labels=style_data.index,
autopct='%1.1f%%', startangle=90)
ax3.set_title('不同传球方式的争顶成功占比')
# 4. 时间段趋势
ax4 = axes[1, 1]
time_stats = self.analyze_time_distribution()
ax4.plot(time_stats.index, time_stats['成功率'],
marker='o', linewidth=2, markersize=8, color='crimson')
ax4.set_xlabel('比赛时间段')
ax4.set_ylabel('成功率 (%)')
ax4.set_title('不同时间段的争顶成功率趋势')
ax4.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
def generate_report(self):
"""生成统计报告"""
stats = self.calculate_success_rate()
print("="*60)
print("高球传中争顶成功率分析报告")
print("="*60)
# 总体统计
total = stats['total']
print(f"\n【总体统计】")
print(f"总传中次数:{total['总传中次数']}")
print(f"争顶次数:{total['争顶次数']}")
print(f"争顶成功次数:{total['争顶成功次数']}")
print(f"总体成功率:{total['总体成功率']:.2f}%")
# 球员统计
print(f"\n【球员排名】")
player_stats = stats['player']
for player, row in player_stats.head(5).iterrows():
print(f"{player}: {row['成功率']:.1f}% "
f"(成功{int(row['争顶成功次数'])}/{int(row['争顶次数'])}次)")
# 位置统计
print(f"\n【位置统计】")
for position, row in stats['position'].iterrows():
print(f"{position}: {row['成功率']:.1f}% "
f"({int(row['争顶成功次数'])}/{int(row['争顶次数'])}次)")
# 传球方式
print(f"\n【传球方式统计】")
for style, row in stats['style'].iterrows():
print(f"{style}: {row['成功率']:.1f}% "
f"({int(row['争顶成功次数'])}/{int(row['争顶次数'])}次)")
return stats
使用示例
# 创建分析器实例
analyzer = HighBallStatAnalyzer()
# 生成示例数据
df = analyzer.generate_sample_data(200)
print("示例数据前5行:")
print(df.head())
# 计算统计结果
stats = analyzer.calculate_success_rate()
# 生成报告
analyzer.generate_report()
# 可视化结果
analyzer.visualize_results(stats)
# 分析时间段分布
time_stats = analyzer.analyze_time_distribution()
print("\n【时间段统计】")
print(time_stats)
额外功能:进阶分析
class AdvancedHighBallAnalyzer(HighBallStatAnalyzer):
"""高级高球争顶分析器"""
def analyze_combination(self):
"""分析位置和传球方式的组合效果"""
if self.df is None:
return None
combo_stats = self.df.groupby(['位置', '传球方式']).agg({
'争顶成功': ['count', 'sum', 'mean']
}).round(4)
combo_stats.columns = ['总次数', '成功次数', '成功率']
combo_stats['成功率'] = combo_stats['成功率'] * 100
return combo_stats
def find_optimal_strategy(self):
"""寻找最佳争顶策略"""
combo = self.analyze_combination()
best_combos = combo.nlargest(5, '成功率')
print("\n【最佳争顶策略】")
for idx, row in best_combos.iterrows():
print(f"{idx[0]}-{idx[1]}: 成功率{row['成功率']:.1f}%")
return best_combos
def predict_success_rate(self, player_name, position, pass_style):
"""基于历史数据预测争顶成功率"""
historical = self.df[
(self.df['球员'] == player_name) &
(self.df['位置'] == position) &
(self.df['传球方式'] == pass_style)
]
if len(historical) == 0:
return None
success_rate = historical['争顶成功'].mean() * 100
sample_size = len(historical)
return {
'预测成功率': success_rate,
'样本数': sample_size,
'置信度': min(sample_size * 10, 100) # 简单置信度评估
}
运行示例
# 使用高级分析器
advanced_analyzer = AdvancedHighBallAnalyzer()
df = advanced_analyzer.generate_sample_data(500)
# 生成完整报告
stats = advanced_analyzer.generate_report()
# 寻找最佳策略
advanced_analyzer.find_optimal_strategy()
# 预测特定球员成功率
prediction = advanced_analyzer.predict_success_rate('张伟', '前锋', '角球传中')
print(f"\n【预测】张伟在角球传中的争顶成功率:{prediction['预测成功率']:.1f}%")
print(f"样本数量:{prediction['样本数']},置信度:{prediction['置信度']}%")
这个案例提供了:
- 基础统计:总体、球员、位置、传球方式的争顶成功率
- 时间分析:比赛不同时间段的争顶成功率变化
- 可视化展示:清晰的图表呈现统计数据
- 策略分析:找出最佳争顶组合策略
- 预测功能:根据历史数据预测特定场景的成功率
您可以根据实际需求调整数据源和分析维度。
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播