Как построить подразумеваемую проб. матрица распределения Пуассона в питоне - PullRequest
3 голосов
/ 05 марта 2019

Мой информационный фрейм имеет два столбца со средними значениями 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

Вопрос

Я заблудился в том, как написать функцию python, которая перебирает каждую строку и создает матрицу 3 на 3.

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Я заблудился, как написать функцию python, которая проходит по каждой строке и создайте матрицу 3 на 3.

Я понял, что вы уже рассмотрели статистическую часть проблемы (например, вычисление вероятностей по распределению Пуассона), я прав?

Если это так, вы можете использовать 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 - индексы строк (что должно соответствовать вашему примеру). Таким образом, чтобы получить фрейм данных для панд, вы можете сделать:

prob_df = pd.DataFrame(prod_table, index=prob_b, columns=prob_a)

И это тот стол, который вы ищете.

0 голосов
/ 06 марта 2019

Я бы использовал numpy для простых операций линейной алгебры (например, умножение маленьких матриц).

Если у вас уже есть фрейм данных в нужной форме, вы можете легко преобразовать его в numpy.ndarray.

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_numpy.html#pandas.DataFrame.to_numpy

Если вы не хотите создавать ndarray из нулей, вставьте правильные элементы в нужных местах.

...