本文目录导读:

我来创建一个统计足球比赛中角球数领先情况的Python案例,这个程序会展示如何统计和比较两支球队的角球数据。
完整案例:角球数统计系统
import random
from datetime import datetime
from collections import defaultdict
class CornerKickStats:
"""角球统计数据类"""
def __init__(self, home_team, away_team):
self.home_team = home_team
self.away_team = away_team
self.home_corners = 0
self.away_corners = 0
self.corner_events = [] # 记录角球事件
self.match_time = 0 # 比赛时间(分钟)
def add_corner(self, team, minute):
"""添加一次角球记录"""
if team == self.home_team:
self.home_corners += 1
elif team == self.away_team:
self.away_corners += 1
else:
raise ValueError("未知球队")
# 记录事件
self.corner_events.append({
'minute': minute,
'team': team,
'type': 'corner'
})
self.match_time = minute
def get_leader(self):
"""获取领先的球队"""
if self.home_corners > self.away_corners:
return self.home_team, self.home_corners - self.away_corners
elif self.away_corners > self.home_corners:
return self.away_team, self.away_corners - self.home_corners
else:
return None, 0
def get_total_corners(self):
"""获取总角球数"""
return self.home_corners + self.away_corners
def get_difference(self):
"""获取角球数差"""
return abs(self.home_corners - self.away_corners)
def display_status(self):
"""显示当前状态"""
print(f"\n{'='*50}")
print(f"比赛时间: {self.match_time}分钟")
print(f"{'='*50}")
# 计算领先情况
leader, diff = self.get_leader()
print(f"📊 角球统计:")
print(f"{'─'*30}")
print(f"🏠 {self.home_team}: {self.home_corners}个角球")
print(f"🚌 {self.away_team}: {self.away_corners}个角球")
print(f"{'─'*30}")
# 显示领先状态
if leader:
print(f"✅ {leader}队领先{diff}个角球")
else:
print(f"⚖️ 双方角球数持平")
print(f"总计: {self.get_total_corners()}个角球")
print(f"{'='*50}\n")
def simulate_match(minutes=90):
"""模拟一场比赛并统计角球"""
# 创建比赛实例
home = "曼联"
away = "利物浦"
match = CornerKickStats(home, away)
print(f"🏆 模拟比赛: {home} vs {away}")
print(f"⏱️ 比赛时长: {minutes}分钟\n")
# 模拟角球事件(随机生成)
corner_probability = 0.3 # 每分钟产生角球的概率
for minute in range(1, minutes + 1):
# 随机决定是否产生角球
if random.random() < corner_probability:
# 30%概率是主队角球,70%概率是客队角球(根据实际情况调整)
team = home if random.random() < 0.5 else away
match.add_corner(team, minute)
return match
def analyze_corner_moments(match):
"""分析角球高峰期"""
moments = defaultdict(int)
for event in match.corner_events:
# 将比赛分为三个阶段
if event['minute'] <= 30:
phase = "上半场前半段 (1-30分钟)"
elif event['minute'] <= 60:
phase = "上半场后半段至中场 (31-60分钟)"
else:
phase = "下半场及加时 (61-90+分钟)"
moments[phase] += 1
print("📈 角球发生时段分布:")
for phase, count in sorted(moments.items(), key=lambda x: x[1], reverse=True):
print(f" {phase}: {count}个角球")
def generate_report(match):
"""生成比赛报告"""
print("\n" + "="*60)
print("📋 比赛角球分析报告")
print("="*60)
# 基础统计
print(f"\n🎯 基本数据:")
print(f" 总角球数: {match.get_total_corners()}")
print(f" 角球数差: {match.get_difference()}")
# 领先情况
leader, diff = match.get_leader()
if leader:
print(f"\n🏆 角球领先:")
print(f" {leader}队领先{diff}个角球")
else:
print(f"\n⚖️ 角球数持平")
# 双方角球占比
total = match.get_total_corners()
if total > 0:
home_percent = (match.home_corners / total) * 100
away_percent = (match.away_corners / total) * 100
print(f"\n📊 占比分析:")
print(f" {match.home_team}: {home_percent:.1f}%")
print(f" {match.away_team}: {away_percent:.1f}%")
# 角球高峰期分析
print(f"\n🕐 时间分析:")
analyze_corner_moments(match)
# 最终状态
match.display_status()
def main():
"""主函数"""
print("🎮 足球角球数统计系统")
print("="*50)
# 1. 手动输入模式
choice = input("\n选择模式:\n1. 手动输入角球记录\n2. 自动模拟比赛\n请输入选择(1/2): ")
if choice == "1":
# 手动模式
home = input("请输入主队名称: ")
away = input("请输入客队名称: ")
match = CornerKickStats(home, away)
print("\n📝 输入角球记录 (输入'结束'退出):")
while True:
minute = input(f"输入角球时间(分钟)或'结束': ")
if minute.lower() == '结束':
break
try:
minute = int(minute)
team = input(f"输入球队({home}/{away}): ")
if team in [home, away]:
match.add_corner(team, minute)
match.display_status()
else:
print("❌ 无效球队名称")
except ValueError:
print("❌ 无效的分钟数,请输入数字")
else:
# 模拟模式
minutes = int(input("模拟比赛时长(默认90分钟): ") or "90")
match = simulate_match(minutes)
# 生成最终报告
generate_report(match)
if __name__ == "__main__":
main()
额外功能:可视化统计
import matplotlib.pyplot as plt
import numpy as np
def visualize_corner_stats(match):
"""可视化角球统计数据"""
# 准备数据
teams = [match.home_team, match.away_team]
corners = [match.home_corners, match.away_corners]
# 创建图表
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
# 柱状图
colors = ['#FF6B6B', '#4ECDC4']
bars = ax1.bar(teams, corners, color=colors, alpha=0.7)
ax1.set_title('角球数对比')
ax1.set_ylabel('角球数')
# 添加数值标签
for bar, count in zip(bars, corners):
ax1.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.1,
str(count), ha='center', fontweight='bold')
# 饼图
if sum(corners) > 0:
ax2.pie(corners, labels=teams, autopct='%1.1f%%',
colors=colors, startangle=90)
ax2.set_title('角球占比分布')
plt.tight_layout()
plt.show()
# 使用示例
if __name__ == "__main__":
# 创建一场模拟比赛
match = simulate_match(90)
match.display_status()
# 可视化
visualize_corner_stats(match)
使用说明
- 手动模式:实时输入角球事件,系统会即时更新领先情况
- 自动模式:模拟一场完整的比赛,生成随机的角球事件
- 统计功能:
- 实时显示双方角球数和领先差距
- 分析角球发生的高峰时段
- 计算角球占比和趋势
扩展功能建议
class AdvancedCornerStats(CornerKickStats):
"""高级角球统计功能"""
def __init__(self, home_team, away_team):
super().__init__(home_team, away_team)
self.corner_timing = [] # 存储角球时间点
def calculate_corner_rate(self):
"""计算角球率(每分钟角球数)"""
if self.match_time == 0:
return 0
return self.get_total_corners() / self.match_time
def predict_final_corners(self, current_minute, total_minutes=90):
"""预测最终角球数"""
rate = self.calculate_corner_rate()
remaining_time = total_minutes - current_minute
predicted = self.get_total_corners() + rate * remaining_time
return int(predicted)
def get_streak(self, team):
"""获取某队的连续角球数"""
streak = 0
max_streak = 0
current_team = None
for event in self.corner_events:
if event['team'] == team:
if current_team == team:
streak += 1
else:
streak = 1
max_streak = max(max_streak, streak)
else:
streak = 0
current_team = event['team']
return max_streak
这个案例提供了完整的角球统计功能,既适合学习Python编程,也能用于实际的足球数据分析场景,你可以根据自己的需求进行修改和扩展。