python案例怎么看这场比赛的观赏性?

wen python案例 1

用 Python 评估一场比赛的观赏性

这是个很有意思的问题!“观赏性”虽然主观,但可以拆解成若干可量化的维度,下面给你一套完整的思路和代码案例。

python案例怎么看这场比赛的观赏性?

先拆解“观赏性”的维度

维度 含义 可量化指标
悬念性 比分是否胶着、是否逆转 分差标准差、领先易主次数
激烈程度 攻防节奏、对抗强度 回合数、得分频率、犯规/抢断
高潮迭起 关键时刻、绝杀 末节分差、关键球数量
明星表现 巨星爆发 高分、三双、纪录
流畅度 少暂停少罚球 罚球数、暂停数、比赛时长

完整代码案例(以篮球为例)

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# ---------- 1. 模拟一场比赛的逐回合比分数据 ----------
np.random.seed(42)
quarters = 4
possessions = 100  # 每场约100回合
home_score, away_score = 0, 0
timeline = []
for q in range(quarters):
    for p in range(possessions // quarters):
        # 主队每回合得分概率略高
        home_score += np.random.choice([0, 1, 2, 3], p=[0.4, 0.1, 0.4, 0.1])
        away_score += np.random.choice([0, 1, 2, 3], p=[0.45, 0.1, 0.35, 0.1])
        timeline.append({
            'quarter': q + 1,
            'home': home_score,
            'away': away_score,
            'diff': home_score - away_score
        })
df = pd.DataFrame(timeline)
# ---------- 2. 计算观赏性指标 ----------
def watchability_score(df):
    scores = {}
    # ① 悬念性:分差越小越好看
    avg_diff = df['diff'].abs().mean()
    scores['悬念性(分差)'] = max(0, 100 - avg_diff * 5)
    # ② 领先易主次数
    lead_changes = (np.sign(df['diff']).diff() != 0).sum()
    scores['领先易主'] = min(100, lead_changes * 10)
    # ③ 末节胶着程度(25 回合)
    last = df.tail(25)
    final_diff = abs(last['diff']).mean()
    scores['末节胶着'] = max(0, 100 - final_diff * 8)
    # ④ 比分标准差(波动越大越刺激)
    volatility = df['diff'].std()
    scores['节奏波动'] = min(100, volatility * 3)
    # ⑤ 是否有逆转(diff 从 ±10 以上翻转)
    max_lead = df['diff'].max()
    min_lead = df['diff'].min()
    comeback = 1 if (max_lead > 10 and min_lead < -10) else 0
    scores['逆转剧情'] = 100 if comeback else 30
    # 综合评分(加权)
    weights = {'悬念性(分差)': 0.3, '领先易主': 0.2, '末节胶着': 0.25,
               '节奏波动': 0.15, '逆转剧情': 0.1}
    total = sum(scores[k] * weights[k] for k in weights)
    scores['综合观赏性'] = round(total, 1)
    return scores
scores = watchability_score(df)
for k, v in scores.items():
    print(f"{k}: {v:.1f}")
# ---------- 3. 可视化比分走势 ----------
plt.figure(figsize=(12, 5))
plt.plot(df.index, df['home'], label='主队', color='crimson', lw=2)
plt.plot(df.index, df['away'], label='客队', color='steelblue', lw=2)
plt.fill_between(df.index, df['home'], df['away'],
                 where=df['home'] >= df['away'], color='crimson', alpha=0.2)
plt.fill_between(df.index, df['home'], df['away'],
                 where=df['home'] < df['away'], color='steelblue', alpha=0.2)
plt.axhline(0, color='gray', ls='--', alpha=0.5)f"比分走势图 —— 综合观赏性评分:{scores['综合观赏性']}")
plt.xlabel("回合数"); plt.ylabel("得分")
plt.legend(); plt.tight_layout(); plt.show()

输出效果解读

运行后会得到类似:

悬念性(分差): 62.3
领先易主: 80.0
末节胶着: 45.6
节奏波动: 90.0
逆转剧情: 100.0
综合观赏性: 70.8
  • 高于 70 分:值得回看的经典战役
  • 50-70 分:中规中矩,有亮点
  • 低于 50 分:一边倒,观赏性一般

再配合那张“比分走势图”,你能直观看到:

  • 曲线缠绕交织 → 悬念强
  • 曲线交叉多次 → 领先易主多
  • 末尾紧贴 → 绝杀悬念

进阶思路

  1. 真实数据:用 nba_api 或爬取 ESPN/虎扑的逐回合(play-by-play)数据替换模拟数据。
  2. 加入对抗指标:犯规数、盖帽、抢断、快攻得分。
  3. 情感分析:爬取赛后社交媒体评论,用 NLP 判断“燃”“精彩”“无聊”的情绪分布。
  4. 机器学习:把历史经典比赛打标签,训练模型预测观赏性。

需要我把案例改成足球电竞,还是接真实数据源(NBA API)?告诉我具体比赛类型,我可以给对应的版本。

上一篇python案例认为上半场是否有进球产生?

下一篇当前分类已是最新一篇

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