综合实时python案例,哪队更接近破门?

wen python案例 1

本文目录导读:

综合实时python案例,哪队更接近破门?

  1. 完整案例:足球比赛破门概率实时评估系统
  2. 核心分析逻辑说明
  3. 实际应用场景

我来设计一个综合的足球比赛实时分析案例,通过多种数据维度来判断哪队更接近破门(得分机会更大)。

完整案例:足球比赛破门概率实时评估系统

import numpy as np
import pandas as pd
from datetime import datetime, timedelta
import random
from collections import deque
class FootballMatchAnalyzer:
    """足球比赛实时破门概率分析系统"""
    def __init__(self, home_team='主队', away_team='客队'):
        self.home_team = home_team
        self.away_team = away_team
        self.match_time = 0  # 比赛时间(分钟)
        # 实时数据存储
        self.home_stats = {
            'possession': 50,  # 控球率
            'shots': 0,
            'shots_on_target': 0,
            'corners': 0,
            'fouls': 0,
            'passes': 0,
            'pass_accuracy': 0,
            'dangerous_attacks': 0,
            'expected_goals': 0.0
        }
        self.away_stats = {key: value for key, value in self.home_stats.items()}
        # 进攻压力追踪(最近5分钟)
        self.pressure_window = deque(maxlen=50)
        # 危险区域记录(罚球区内触球)
        self.dangerous_zone_touches = {'home': 0, 'away': 0}
        # 阵型/战术信息
        self.home_formation = '4-3-3'
        self.away_formation = '4-2-3-1'
        # 球员状态(简化)
        self.player_energy = {
            'home': {i: 100 for i in range(1, 12)},
            'away': {i: 100 for i in range(1, 12)}
        }
    def simulate_match_moment(self):
        """模拟比赛的一个时间段"""
        self.match_time += 0.5  # 每0.5分钟更新一次
        # 随机事件生成
        events = self._generate_random_events()
        self._update_stats(events)
        # 计算实时破门概率
        return self.calculate_goal_probability()
    def _generate_random_events(self):
        """生成随机比赛事件"""
        events = []
        # 进攻事件概率
        prob_attack = 0.4
        if random.random() < prob_attack:
            attacking_team = random.choice(['home', 'away'])
            # 根据控球率调整攻击倾向
            if attacking_team == 'home':
                attacking_strength = self.home_stats['possession'] / 100
            else:
                attacking_strength = self.away_stats['possession'] / 100
            # 生成具体的进攻事件
            event_type = random.choices(
                ['dangerous_move', 'shot_attempt', 'corner', 'goal_scoring_chance'],
                weights=[0.4, 0.3, 0.2, 0.1]
            )[0]
            events.append({
                'team': attacking_team,
                'type': event_type,
                'time': self.match_time
            })
            # 记录到压力窗口
            self.pressure_window.append({
                'team': attacking_team,
                'type': event_type,
                'time': self.match_time
            })
        # 控球率动态变化
        possession_shift = random.uniform(-3, 3)
        self.home_stats['possession'] = max(0, min(100, self.home_stats['possession'] + possession_shift))
        self.away_stats['possession'] = 100 - self.home_stats['possession']
        return events
    def _update_stats(self, events):
        """更新统计数据"""
        for event in events:
            team_key = event['team']
            event_type = event['type']
            if team_key == 'home':
                stats = self.home_stats
            else:
                stats = self.away_stats
            if event_type == 'shot_attempt':
                stats['shots'] += 1
                if random.random() < 0.4:  # 40%命中目标
                    stats['shots_on_target'] += 1
                    stats['expected_goals'] += random.uniform(0.1, 0.8)
                else:
                    stats['expected_goals'] += random.uniform(0.01, 0.15)
            elif event_type == 'corner':
                stats['corners'] += 1
                stats['expected_goals'] += random.uniform(0.02, 0.1)
            elif event_type == 'dangerous_move':
                stats['dangerous_attacks'] += 1
                stats['expected_goals'] += random.uniform(0.05, 0.2)
                # 记录禁区触球
                if random.random() < 0.5:
                    self.dangerous_zone_touches[team_key] += 1
            elif event_type == 'goal_scoring_chance':
                stats['shots'] += 1
                stats['shots_on_target'] += 1
                stats['expected_goals'] += random.uniform(0.5, 0.9)
                self.dangerous_zone_touches[team_key] += 1
        # 更新传球数据(模拟)
        passes = random.randint(15, 30)
        pass_accuracy = random.uniform(72, 92)
        self.home_stats['passes'] += passes
        self.home_stats['pass_accuracy'] = pass_accuracy
        self.away_stats['passes'] += passes - random.randint(0, 5)
        self.away_stats['pass_accuracy'] = max(0, pass_accuracy - random.uniform(0, 8))
    def calculate_goal_probability(self):
        """计算两队破门概率(综合多因素)"""
        # 因素1:预期进球值 (xG)
        home_xg = self.home_stats['expected_goals']
        away_xg = self.away_stats['expected_goals']
        # 因素2:近5分钟进攻压力
        recent_pressure_home = sum(
            1 for e in self.pressure_window 
            if e['team'] == 'home' and e['time'] > self.match_time - 5
        )
        recent_pressure_away = sum(
            1 for e in self.pressure_window 
            if e['team'] == 'away' and e['time'] > self.match_time - 5
        )
        # 因素3:危险区域触球
        danger_factor_home = min(self.dangerous_zone_touches['home'] * 0.1, 2)
        danger_factor_away = min(self.dangerous_zone_touches['away'] * 0.1, 2)
        # 因素4:控球率影响
        possession_factor_home = (self.home_stats['possession'] - 50) / 50
        possession_factor_away = (self.away_stats['possession'] - 50) / 50
        # 因素5:射门效率
        home_shot_efficiency = (
            self.home_stats['shots_on_target'] / max(self.home_stats['shots'], 1) * 1.2
        )
        away_shot_efficiency = (
            self.away_stats['shots_on_target'] / max(self.away_stats['shots'], 1) * 1.2
        )
        # 因素6:进攻组织质量
        home_organization = self._calculate_attack_quality('home')
        away_organization = self._calculate_attack_quality('away')
        # 综合评分
        home_score = (
            home_xg * 2.5 +
            recent_pressure_home * 0.8 +
            danger_factor_home * 0.5 +
            possession_factor_home * 0.3 +
            home_shot_efficiency * 0.4 +
            home_organization * 0.2
        )
        away_score = (
            away_xg * 2.5 +
            recent_pressure_away * 0.8 +
            danger_factor_away * 0.5 +
            possession_factor_away * 0.3 +
            away_shot_efficiency * 0.4 +
            away_organization * 0.2
        )
        # 归一化到概率
        total = home_score + away_score
        if total == 0:
            home_prob = 50
            away_prob = 50
        else:
            home_prob = (home_score / total) * 100
            away_prob = 100 - home_prob
        return {
            'home_probability': home_prob,
            'away_probability': away_prob,
            'home_score': home_score,
            'away_score': away_score,
            'stats': {
                'home': self.home_stats.copy(),
                'away': self.away_stats.copy()
            }
        }
    def _calculate_attack_quality(self, team):
        """计算进攻组织质量"""
        stats = self.home_stats if team == 'home' else self.away_stats
        quality = (
            stats['pass_accuracy'] / 100 * 0.5 +
            min(stats['passes'] / 100, 1) * 0.3 +
            min(stats['corners'] / 5, 1) * 0.2
        )
        return quality
    def get_visualization_data(self, result):
        """生成可视化数据"""
        stats_home = result['stats']['home']
        stats_away = result['stats']['away']
        data = {
            'time': [i for i in range(0, int(self.match_time) + 1, 5)],
            'probability_evolution': self._get_probability_history(),
            'team_stats': {
                'home': stats_home,
                'away': stats_away
            },
            'key_indicators': {
                '控球率': (stats_home['possession'], stats_away['possession']),
                '射门数': (stats_home['shots'], stats_away['shots']),
                '射正数': (stats_home['shots_on_target'], stats_away['shots_on_target']),
                '角球数': (stats_home['corners'], stats_away['corners']),
                '危险进攻': (stats_home['dangerous_attacks'], stats_away['dangerous_attacks'])
            }
        }
        return data
    def _get_probability_history(self):
        """获取概率历史(简化实现)"""
        # 实际应用中会记录每个时间段的概率
        return {
            'home': [50, 52, 55, 58, 54, 56, 60],  # 示例数据
            'away': [50, 48, 45, 42, 46, 44, 40]   # 示例数据
        }
# ==================== 分析和可视化部分 ====================
def analyze_and_visualize(match, duration_minutes=10):
    """运行分析并生成报告"""
    print(f"{'='*60}")
    print(f"{match.home_team} vs {match.away_team}")
    print(f"{'='*60}\n")
    results = []
    # 模拟比赛
    for _ in range(int(duration_minutes * 2)):  # 每0.5分钟一次
        result = match.simulate_match_moment()
        results.append(result)
    # 获取最终结果
    final = results[-1]
    # 输出详细统计
    print("📊 比赛统计数据:")
    print("-" * 50)
    stats_home = final['stats']['home']
    stats_away = final['stats']['away']
    indicators = [
        ("控球率", f"{stats_home['possession']:.1f}%", f"{stats_away['possession']:.1f}%"),
        ("射门数", str(stats_home['shots']), str(stats_away['shots'])),
        ("射正数", str(stats_home['shots_on_target']), str(stats_away['shots_on_target'])),
        ("角球数", str(stats_home['corners']), str(stats_away['corners'])),
        ("危险进攻", str(stats_home['dangerous_attacks']), str(stats_away['dangerous_attacks'])),
        ("预期进球(xG)", f"{stats_home['expected_goals']:.2f}", f"{stats_away['expected_goals']:.2f}"),
        ("传球成功率", f"{stats_home['pass_accuracy']:.1f}%", f"{stats_away['pass_accuracy']:.1f}%")
    ]
    print(f"{'指标':<15} {'主队':<15} {'客队':<15}")
    print("-" * 45)
    for indicator, home_val, away_val in indicators:
        print(f"{indicator:<15} {home_val:<15} {away_val:<15}")
    print("\n" + "="*60)
    # 破门概率判断
    home_prob = final['home_probability']
    away_prob = final['away_probability']
    print("🎯 实时破门概率分析:")
    print("-" * 50)
    print(f"主队破门概率: {home_prob:.1f}%")
    print(f"客队破门概率: {away_prob:.1f}%")
    print("-" * 50)
    # 判断哪队更接近破门
    margin = abs(home_prob - away_prob)
    print("\n🔍 分析结论:")
    if margin < 5:
        print("两支球队势均力敌,破门机会相当")
    elif home_prob > away_prob:
        print(f"{match.home_team} 更接近破门!")
        print(f"优势幅度: {margin:.1f}%")
        # 分析优势来源
        if stats_home['expected_goals'] > stats_away['expected_goals']:
            print("→ 主要优势在于创造高质量机会")
        if stats_home['shots_on_target'] > stats_away['shots_on_target']:
            print("→ 射门精准度更高")
        if stats_home['dangerous_attacks'] > stats_away['dangerous_attacks']:
            print("→ 进攻更具威胁性")
    else:
        print(f"{match.away_team} 更接近破门!")
        print(f"优势幅度: {margin:.1f}%")
        if stats_away['expected_goals'] > stats_home['expected_goals']:
            print("→ 主要优势在于创造高质量机会")
        if stats_away['shots_on_target'] > stats_home['shots_on_target']:
            print("→ 射门精准度更高")
        if stats_away['dangerous_attacks'] > stats_home['dangerous_attacks']:
            print("→ 进攻更具威胁性")
    # 建议或警告
    print("\n⚠️ 战术建议:")
    if home_prob > 55:
        print(f"→ {match.home_team}应继续保持进攻压力")
    elif away_prob > 55:
        print(f"→ {match.away_team}应继续保持进攻压力")
    else:
        print("→ 双方都在寻找机会,谨慎应对")
    # 返回可视化数据
    return match.get_visualization_data(final)
# ==================== 可视化加强版 ====================
import matplotlib.pyplot as plt
import seaborn as sns
def enhanced_visualization(visual_data):
    """增强版可视化报告"""
    # 创建图形
    fig = plt.figure(figsize=(16, 10))
    # 1. 概率演变图
    ax1 = fig.add_subplot(2, 2, 1)
    time = visual_data['time']
    probs = visual_data['probability_evolution']
    ax1.plot(time, probs['home'], 'b-', label='主队', linewidth=2)
    ax1.plot(time, probs['away'], 'r-', label='客队', linewidth=2)
    ax1.fill_between(time, probs['home'], probs['away'], alpha=0.3)
    ax1.set_title('破门概率演变趋势')
    ax1.set_xlabel('比赛时间 (分钟)')
    ax1.set_ylabel('概率 (%)')
    ax1.legend()
    ax1.grid(True, alpha=0.3)
    # 2. 关键指标对比
    ax2 = fig.add_subplot(2, 2, 2)
    indicators = visual_data['key_indicators']
    keys = list(indicators.keys())
    x = np.arange(len(keys))
    width = 0.35
    home_vals = [indicators[k][0] for k in keys]
    away_vals = [indicators[k][1] for k in keys]
    ax2.bar(x - width/2, home_vals, width, label='主队', color='lightblue')
    ax2.bar(x + width/2, away_vals, width, label='客队', color='lightcoral')
    ax2.set_xticks(x)
    ax2.set_xticklabels(keys, rotation=45, ha='right')
    ax2.set_title('关键数据指标对比')
    ax2.legend()
    # 3. 攻防强度雷达图
    ax3 = fig.add_subplot(2, 2, 3, projection='polar')
    categories = ['射门', '射正', '角球', '危险进攻', '控球', '传球']
    stats_home = visual_data['team_stats']['home']
    stats_away = visual_data['team_stats']['away']
    # 归一化数据
    def normalize(value, max_val):
        return value / max_val if max_val else 0
    home_radar = [
        normalize(stats_home['shots'], 20),
        normalize(stats_home['shots_on_target'], 10),
        normalize(stats_home['corners'], 8),
        normalize(stats_home['dangerous_attacks'], 30),
        normalize(stats_home['possession'], 100),
        normalize(stats_home['pass_accuracy'], 100)
    ]
    away_radar = [
        normalize(stats_away['shots'], 20),
        normalize(stats_away['shots_on_target'], 10),
        normalize(stats_away['corners'], 8),
        normalize(stats_away['dangerous_attacks'], 30),
        normalize(stats_away['possession'], 100),
        normalize(stats_away['pass_accuracy'], 100)
    ]
    angles = np.linspace(0, 2 * np.pi, len(categories), endpoint=False).tolist()
    home_radar += home_radar[:1]
    away_radar += away_radar[:1]
    angles += angles[:1]
    ax3.plot(angles, home_radar, 'o-', linewidth=2, label='主队', color='lightblue')
    ax3.fill(angles, home_radar, alpha=0.25, color='lightblue')
    ax3.plot(angles, away_radar, 'o-', linewidth=2, label='客队', color='lightcoral')
    ax3.fill(angles, away_radar, alpha=0.25, color='lightcoral')
    ax3.set_thetagrids(np.degrees(angles[:-1]), categories)
    ax3.set_title('攻防能力雷达图')
    ax3.legend(loc='upper right', bbox_to_anchor=(1.3, 1.0))
    # 4. 最终评估面板
    ax4 = fig.add_subplot(2, 2, 4)
    ax4.axis('off')
    home_prob = visual_data['probability_evolution']['home'][-1]
    away_prob = visual_data['probability_evolution']['away'][-1]
    evaluation_text = f"""
    📊 最终评估报告
    主队破门概率: {home_prob:.1f}%
    客队破门概率: {away_prob:.1f}%
    胜负预测:
    """
    if home_prob > 55:
        evaluation_text += f"🏆 主队明显占优"
    elif away_prob > 55:
        evaluation_text += f"🏆 客队明显占优"
    elif abs(home_prob - away_prob) < 5:
        evaluation_text += "⚖️ 势均力敌"
    else:
        evaluation_text += "📈 主队微弱优势" if home_prob > away_prob else "📈 客队微弱优势"
    ax4.text(0.1, 0.5, evaluation_text, fontsize=12, va='center',
             family='monospace', linespacing=1.5)
    plt.tight_layout()
    plt.show()
# ==================== 主程序 ====================
if __name__ == "__main__":
    # 创建比赛示例
    match = FootballMatchAnalyzer("巴塞罗那", "皇家马德里")
    # 运行分析和可视化
    visual_data = analyze_and_visualize(match, duration_minutes=50)
    # 生成增强可视化
    enhanced_visualization(visual_data)

核心分析逻辑说明

多维度评估指标

  • 预期进球值(xG):基于射门质量和机会类型
  • 进攻压力:近5分钟内的进攻次数和威胁度
  • 危险区域触球:禁区内的成功触球次数
  • 战术指标:控球率、传球成功率、角球数等

加权评分系统

home_score = (
    home_xg * 2.5 +          # 预期进球权重最高
    recent_pressure * 0.8 +  # 近期压力
    danger_factor * 0.5 +    # 危险区域
    possession_factor * 0.3 + # 控球影响
    shot_efficiency * 0.4 +  # 射门效率
    attack_quality * 0.2     # 组织质量
)

实时动态调整

  • 每0.5分钟更新一次数据
  • 基于概率窗口追踪近期状态
  • 考虑比赛节奏变化

可视化分析

  • 概率趋势图:显示破门概率变化
  • 指标对比图:直观对比关键数据
  • 雷达图:全面展示两队实力
  • 文字报告:给出明确分析和建议

实际应用场景

这个系统可以应用于:

  1. 实时比赛直播:为解说员和观众提供即时分析
  2. 战术分析:帮助教练团队调整战术
  3. 博彩预测:为盘口分析提供数据支持
  4. 球员转会评估:分析球队真实进攻能力

这个案例展示了如何综合多个实时数据维度来判断哪队更接近破门,并给出了详细的实现和可视化方案。

抱歉,评论功能暂时关闭!