Python案例如何看让球胜平负的分布?

wen python案例 3

本文目录导读:

Python案例如何看让球胜平负的分布?

  1. 准备示例数据
  2. 计算让球后的结果(让球胜平负)
  3. 按让球数分组统计分布
  4. 可视化分布(堆叠柱状图)
  5. 扩展:动态过滤(按联赛/时间范围)

要查看“让球胜平负”(通常指亚洲盘口或让球盘)的分布,核心是统计在特定让球数下,主队胜、平、负三种结果的出现频率,Python 可以通过 pandas 处理历史比赛数据,用 matplotlibplotly 进行可视化。

以下是一个完整的 Python 案例,分为数据准备、计算分布、可视化三个步骤。

准备示例数据

假设你有一个 CSV 文件 matches.csv,包含以下列:

  • home_team: 主队
  • away_team: 客队
  • home_score: 主队实际进球
  • away_score: 客队实际进球
  • handicap: 让球数(正数表示主队让球,如 51;负数表示主队受让,如 -0.5

示例数据(手动构造):

import pandas as pd
data = {
    'home_team': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'],
    'away_team': ['K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'],
    'home_score': [2, 1, 0, 3, 1, 2, 0, 1, 2, 0],
    'away_score': [1, 1, 0, 0, 2, 0, 2, 1, 1, 3],
    'handicap':   [0.5, -0.5, 0, 1, -1, 0.5, 0, -0.5, 1, -1]
}
df = pd.DataFrame(data)
print(df)

计算让球后的结果(让球胜平负)

核心逻辑:让球后主队净胜球 = 主队实际进球 - 客队实际进球 + 让球数(因为让球数是从主队角度出发的)。

  • 如果让球后净胜球 > 0:主胜
  • = 0:平局
  • < 0:客胜
# 计算让球后的净胜球(让球数直接加在进球差上,因为让球是主队让给客队的优势)
df['handicap_diff'] = (df['home_score'] - df['away_score']) + df['handicap']
# 定义结果分类函数
def classify_handicap_result(x):
    if x > 0:
        return 'H'  # Home Win
    elif x == 0:
        return 'D'  # Draw
    else:
        return 'A'  # Away Win
df['handicap_result'] = df['handicap_diff'].apply(classify_handicap_result)
print(df[['home_team', 'away_team', 'handicap', 'handicap_result']])

按让球数分组统计分布

假设你想看让球数为 0.5 时的胜平负分布,或者整体分布。

# 统计每种让球数下,H/D/A 的数量
distribution = df.groupby(['handicap', 'handicap_result']).size().unstack(fill_value=0)
print("分布表(行:让球数,列:结果):")
print(distribution)

可视化分布(堆叠柱状图)

使用 matplotlibplotly 更直观地展示。

import matplotlib.pyplot as plt
import numpy as np
# 准备绘图数据
handicaps = sorted(distribution.index)
results = ['H', 'D', 'A']
colors = ['green', 'gray', 'red']
# 计算比例(或者数量)
data_plot = []
for h in handicaps:
    row = distribution.loc[h]
    total = row.sum()
    # 计算百分比
    percentages = [row.get(r, 0) / total * 100 for r in results]
    data_plot.append(percentages)
# 转换为 numpy 数组方便堆叠
data_plot = np.array(data_plot)
# 画堆叠柱状图
fig, ax = plt.subplots(figsize=(10, 6))
bottom = np.zeros(len(handicaps))
for i, result in enumerate(results):
    ax.bar(handicaps, data_plot[:, i], bottom=bottom, label=result, color=colors[i])
    bottom += data_plot[:, i]
ax.set_xlabel('Handicap (让球数)')
ax.set_ylabel('Percentage (%)')
ax.set_title('让球胜平负分布 (Handicap Result Distribution)')
ax.legend(title='Result')
ax.set_xticks(handicaps)
plt.tight_layout()
plt.show()

扩展:动态过滤(按联赛/时间范围)

如果你有更多列(如 league, date),可以增加过滤:

# 只分析英超 2023年数据
df_filtered = df[(df['league'] == 'EPL') & (df['date'] >= '2023-01-01')]
# 然后重复上面的分组统计代码
  1. 让球数方向handicap 为正表示主队让球(需获胜更多才算赢);为负表示主队受让(不败即可)。
  2. 结果计算实际净胜球 + 让球数(注意:如果数据中让球数是客队让球,需做符号反转)。
  3. 可视化技巧:堆叠柱状图最适合展示各类让球下的比例分布。

如果你实际数据中让球数是“客队让球”的表示方式(-0.5 表示主队让 0.5 球,但大多数数据用正数表示主队让球),请根据数据提供方调整符号。Brasil、Soccerway 等数据源使用主队让球为正。

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