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

wen python案例 5

本文目录导读:

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

  1. 情况一:你有一份历史比赛数据(如 CSV 或 Excel)
  2. 情况二:你只有“胜平负”的概率数据(如欧赔、亚赔)
  3. 进阶:条件与交叉分析(核心玩法)

在Python中分析“让球胜平负”的分布,通常是指分析让球盘(Handicap)玩法中,各结果(让球胜、让球平、让球负)发生的频率或概率分布。

由于你没有提供具体的API或数据源,我将分两种常见情况来讲解:① 分析历史数据(本地文件/DataFrame)② 对比亚盘与欧赔(数据挖掘视角)


你有一份历史比赛数据(如 CSV 或 Excel)

假设你的数据结构是这样的:

主队 客队 让球数 实际让球比分(主-客) 赛果
A B -1 2-0 让球胜
C D +1 1-1 让球平
E F 0 0-2 让球负

核心步骤:

  1. 计算让球后的比分让球后主队得分 = 实际主队得分 + 让球数(让球数为负则相当于减分)。
  2. 判定赛果
    • 让球后主得分 > 客得分 →
    • 让球后主得分 == 客得分 →
    • 让球后主得分 < 客得分 →
  3. 统计分布:使用 pandasvalue_counts() 计算绝对数量和占比,并可视化。

完整代码示例:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 1. 模拟数据(假设你已经有了包含实际比分的df)
data = {
    '主队': ['A', 'C', 'E', 'G', 'I'],
    '客队': ['B', 'D', 'F', 'H', 'J'],
    '让球数': [-1, 1, 0, -2, 0],  # 负数代表主队让球
    '实际主队进球': [2, 1, 0, 3, 1],
    '实际客队进球': [0, 1, 2, 1, 1]
}
df = pd.DataFrame(data)
# 2. 计算让球后的比分
df['让球后主队总进球'] = df['实际主队进球'] + df['让球数']
df['让球后客队总进球'] = df['实际客队进球']
# 3. 判定胜负平
conditions = [
    df['让球后主队总进球'] > df['让球后客队总进球'],
    df['让球后主队总进球'] == df['让球后客队总进球'],
    df['让球后主队总进球'] < df['让球后客队总进球']
]
choices = ['让球胜', '让球平', '让球负']
df['赛果'] = np.select(conditions, choices)
print(df[['主队', '客队', '让球数', '赛果']])
# 4. 统计分布
distribution = df['赛果'].value_counts()
proportions = df['赛果'].value_counts(normalize=True) * 100
print("\n数量分布:\n", distribution)
print("\n百分比分布:\n", proportions.round(2))
# 5. 可视化(饼图或柱状图)
plt.figure(figsize=(8, 5))
colors = ['#FF6B6B', '#4ECDC4', '#45B7D1']  # 红/绿/蓝
plt.pie(distribution, labels=distribution.index, autopct='%1.1f%%', 
        colors=colors[:len(distribution)], startangle=90)'让球胜平负分布图')
plt.axis('equal')
plt.show()

你只有“胜平负”的概率数据(如欧赔、亚赔)

在足球分析中,很多时候我们遇到的是盘口(如“主让半球”),此时我们需要手动将“亚盘(让球盘)”转换为对应的“欧赔(胜平负)”概率,或者直接分析让球后的胜平负赔率

关键逻辑: 如果庄家开出“主让一球”(即主队 -1),那么对应的“让球胜平负”的赔率就变成了实际比赛结果在减去让球数之后的胜平负概率。

如何看分布?

  1. 获取每场比赛的让球数和欧赔(胜、平、负赔率)。
  2. 利用赔率反推概率概率 = 1 / 赔率,然后进行去水(归一化)处理(去除庄家抽水)。
  3. 统计这些概率的分布:统计“让球胜”概率在0-10%,10-20%...区间的分布。

代码示例(分析赔率区间的分布):

import pandas as pd
import numpy as np
# 模拟数据:每行代表一场比赛的让球盘口和对应的让球胜平负赔率
data = {
    '让球数': [-1, -0.5, 0, 0.5, 1, -1, 0],
    '让球胜赔率': [2.10, 2.30, 2.50, 2.15, 1.90, 2.20, 2.40],
    '让球平赔率': [3.40, 3.20, 3.10, 3.30, 3.50, 3.20, 3.00],
    '让球负赔率': [3.20, 2.90, 2.80, 3.10, 3.80, 3.00, 2.70]
}
df = pd.DataFrame(data)
# 1. 去水归一化,计算隐含概率
def implied_prob(row):
    # 计算返还率(去水)
    raw_probs = 1 / row[['让球胜赔率', '让球平赔率', '让球负赔率']]
    # 归一化(去除水分)
    norm_probs = raw_probs / raw_probs.sum()
    return norm_probs
df[['胜概率', '平概率', '负概率']] = df.apply(implied_prob, axis=1, result_type='expand')
print("每场比赛的概率分布:\n", df[['让球数', '胜概率', '平概率', '负概率']].round(3))
# 2. 分析“让球胜”概率的分布区间(直方图区间)
bins = [0, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 1.0]
labels = ['0-20%', '20-30%', '30-40%', '40-50%', '50-60%', '60-70%', '70-100%']
df['胜率区间'] = pd.cut(df['胜概率'], bins=bins, labels=labels, include_lowest=True)
# 各区间的频数
print("\n让球胜概率区间分布:")
print(df['胜率区间'].value_counts().sort_index())
# 或者直接查看总体描述统计
print("\n胜平负概率的整体分布描述:")
print(df[['胜概率', '平概率', '负概率']].describe())

进阶:条件与交叉分析(核心玩法)

在实际案例中,更重要的是分布与盘口的关系,你可以查看:

  1. 不同让球数下的胜平负分布(在“主让一球”的时候,胜平负的比例是多少?)。
  2. 时间序列分布(近期10轮比赛,让球胜的概率是否在上升?)。
# 假设df是你几年的历史数据
# 统计不同让球盘口下的胜率分布
pivot_table = pd.crosstab(df['让球数'], df['赛果'], normalize='index') * 100
print("不同让球数下的胜平负百分比:\n", pivot_table.round(1))

要“看分布”,核心是定义好你分析的维度

  • 如果是赛果统计:直接用 value_counts() 看占比。
  • 如果是赔率区间统计:用 pd.cut() 或者 hist() 画直方图。
  • 如果是交叉对比:用 groupbypivot_table

最实用的可视化工具seaborn.histplot()matplotlib.hist() 可以直观看到概率密度的集中或离散程度。

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