我有一个随机数生成器,正在尝试根据该数字产生结果。我在三个专栏中有三个结果。 “客场胜利”,“平局”,“主场胜利”,并具有这些事件的可能性。基于随机数函数,我想模拟一列预期结果。
Prob_Away_Win Prob_Draw Prob_Home_Win Random_Value Expected_Res
0 0.14588 0.37896 0.58646 0.12457 1
1 0.11167 0.31267 0.57566 0.78643 3
2 0.23312 0.41235 0.35453 0.27642 2
3 0.44532 0.32112 0.23358 0.18754 3
4 0.83216 0.12980 0.03804 0.43823 1
5 0.21334 0.09897 0.68769 0.16721 1
例如。看第一行,随机值为0.12457,我要首先问这个值是否小于三个“概率”列中任何一个中可用的最小概率。是的,它小于“ Prob_Away_Win”,因此我希望值“ 1”反映第1列。看下一行,概率是否小于最小值?否。是否小于最小值(0.11167)+下一个最小值(0.31267)?否。因此,我希望Expected_Res选择“ 3”,因为它是剩余的最后一列。对于数据帧的下一行,我再次想问一下,随机值是否小于可用的最小值。不可以。它小于可能的最小值'Prob_Away_Win(0.23312)+下一个最小值'Prob_Home_Win'(0.35453)= 0.58765。是。因此,选择列“ 2” Pro_Home_Win。
我该如何创建一个函数来计算这个?
答案 0 :(得分:0)
使用itertools.accumulate
和itertools.takewhile
的实现:
data = ''' Prob_Away_Win Prob_Draw Prob_Home_Win Random_Value Expected_Res
0 0.14588 0.37896 0.58646 0.12457 1
1 0.11167 0.31267 0.57566 0.78643 3
2 0.23312 0.41235 0.35453 0.27642 2
3 0.44532 0.32112 0.23358 0.18754 3
4 0.83216 0.12980 0.03804 0.43823 1
5 0.21334 0.09897 0.68769 0.16721 1'''
import re
from itertools import accumulate, takewhile
tbl = []
for g in re.findall(r'\s*([\d.]+)\s*([\d.]+)\s*([\d.]+)\s*([\d.]+)\s*([\d.]+)\s*([\d.]+)', data):
l = [*map(float, g)]
tbl.append(l)
for row in tbl:
probs = sorted(enumerate(row[1:4], 1), key=lambda k: k[1])
random_value = row[4]
t = takewhile(lambda p: random_value>p[1], accumulate(probs, lambda a, b: (b[0], a[1] + b[1])))
idx = probs[sum(1 for _ in t)][0]
print('{}\t{}\t{}'.format(int(row[0]),
' '.join('{: <{}}'.format('(*)' + s if i==idx else s, 12) for i, s in enumerate(map(str, row[1:5]), 1) ),
idx))
打印:
0 (*)0.14588 0.37896 0.58646 0.12457 1
1 0.11167 0.31267 (*)0.57566 0.78643 3
2 0.23312 0.41235 (*)0.35453 0.27642 3
3 0.44532 0.32112 (*)0.23358 0.18754 3
4 (*)0.83216 0.1298 0.03804 0.43823 1
5 (*)0.21334 0.09897 0.68769 0.16721 1