Производить итоговые значения на основе генерации случайных чисел - PullRequest
0 голосов
/ 26 июня 2019

У меня есть генератор случайных чисел, и я пытаюсь получить результаты на основе этого числа.У меня есть три результата в трех столбцах.«В гостях», «Ничья», «Победа дома» и есть вероятность этих событий.Основываясь на функции случайных чисел, я хочу смоделировать столбец ожидаемых результатов.

       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», поскольку это был последний оставшийся столбец.Для следующей строки в Dataframe, я снова хочу спросить: случайное значение меньше наименьшего доступного значения.Нет. Это наименьшее возможное значение: «Prob_Away_Win (0,23312) + следующее наименьшее значение« Prob_Home_Win »(0,35453) = 0,58765.Да.Так что выберите столбец '2' Pro_Home_Win.

Как я могу создать функцию, которая будет вычислять это?

1 Ответ

0 голосов
/ 26 июня 2019

Реализация с 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
...