我的数据框有两列,平均值为Team_A,Team_B在匹配中为目标打分。对于每一行,我想创建一个3乘3的矩阵,使用泊松分布覆盖所有可能的分数线。这是我数据的前几行,
d = {'Team_A':[2.0160, 1.3421, 2.4654, 3.0281], 'Team_B':[0.0653, 1.5641, 4.0241, 1.2375]}
df = pd.DataFrame(data=d)
所以从第一排A队应该赢得与score [2-0] (rounded to nearest integer)
的比赛。假设分数是独立的并且发生在一个区间中并使用泊松分布公式,
P(k wins in interval) = ((lambda**k) * exp(-lambda))/factorial(k)
哪里有k = [0,1,2,3]
Team A scores 0, 1, 2 and 3 goals with prob. [0.1332, 0.2685, 0.2707, 0.1819] respectively.
And, Team B scores 0, 1, 2 and 3 goals with [0.5205, 0.3399, 0.1110, 0.0242] probabilities.
下表是通过上述概率的逐元素乘法构造的。
For example the implied prob. of a 2-0 Team A win = 0.2707 * 0.5205 = 0.140899
Team_A Goals 0 1 2 3
Team_B Goals Poisson for no.of_goal/Team 0.1332 0.2685 0.2707 0.1819
0 0.5205 0.0693 0.1398 0.1409 0.0947
1 0.3399 0.0453 0.0913 0.0920 0.0618
2 0.1110 0.0148 0.0298 0.0030 0.0202
3 0.0242 0.0032 0.0065 0.0065 0.0044
题
我迷失了如何编写一个循环遍历每一行并创建一个3乘3矩阵的python函数。
我迷失了如何编写一个循环遍历每一行并创建一个3乘3矩阵的python函数。
我知道你已经处理了问题的统计部分(比如计算Poisson分布的概率),我是对的吗?
如果是这样,你可以使用itertools product来创建你的表。
假设prob_a
和prob_b
是两个分别包含A队和B队概率的阵列。矩阵以这种方式构建:
from itertools import product
import numpy as np
prod_table = np.array([(i*j) for i, j in product(prob_b, prob_a)])
prod_table.shape = (4, 4)
现在,您有一个4x4矩阵,其中包含您需要的所有值,您可以将其转换回pandas数据帧。 在此表中,Team A概率是列索引,Team B概率是行索引(应该与您的示例匹配)。所以要获得一个pandas数据帧,你可以这样做:
prob_df = pd.DataFrame(prod_table, index=prob_b, columns=prob_a)
这是你要找的桌子。
我会使用numpy进行简单的线性代数运算(例如乘以小矩阵)。
如果您已经拥有所需形状的数据框,则可以将其轻松转换为numpy.ndarray。
如果不是,您将需要创建一个零的ndarray,然后在正确的位置插入正确的元素。