Есть ли функция python для кумулятивной вероятности - PullRequest
3 голосов
/ 09 марта 2020

У меня есть фрейм данных, который выглядит следующим образом:

Id   Day1   Day2   Day3 
1    0.35   0.32   0.29  
2    0.63   0.59   0.58
3    0.12   0.10   0.07

Эта таблица показывает вероятность определенного события, происходящего в каждый день, для каждой записи.

Я ищу функцию python, которая даст мне совокупную вероятность события, произошедшего в любой день. Вывод будет выглядеть следующим образом:

Id   Day1   Day2   Day3  Cum_Prob
1    0.35   0.32   0.29  0.686
2    0.63   0.59   0.58  0.983
3    0.12   0.10   0.07  0.263

Значения Cum_Prob в приведенной выше таблице примеров являются правильными, т.е. они представляют собой фактическую вероятность события, произошедшего в любой из 3 дней для каждого значения Id .

Я сам могу написать эту функцию на пару дней. В действительности, я имею дело с более чем 3 днями, и я считаю, что написание этой функции в течение многих дней будет чрезвычайно утомительным.

Существует ли уже существующая функция, которая может вычислять вероятность из ввод индивидуальных вероятностей? Или есть быстрый способ написать для этого udf за x дней?

Ответы [ 2 ]

3 голосов
/ 09 марта 2020

Использование:

df['Cum_Prob'] = df.iloc[:, 1:].sum(axis=1)

или

df['Cum_Prob'] = df[df.columns[df.columns.str.contains('Day')]].sum(axis=1)

РЕДАКТИРОВАТЬ

df_days = df[df.columns[df.columns.str.contains('Day')]]
cumprob=0
for i, col in df_days.items():
    cumprob = col.mul(1-cumprob) + cumprob

df['Cum_Prob']=cum_Prob

Вывод

   Id  Day1  Day2  Day3  Cum_Prob
0   1  0.35  0.32  0.29  0.686180
1   2  0.63  0.59  0.58  0.936286
2   3  0.12  0.10  0.07  0.263440

Альтернатива с уменьшение

from functools import reduce
df['Cum_Prob']=reduce(lambda cum_prob, new_prob: (1-cum_prob)*new_prob + cum_prob ,
                      df_days.values.T)

уменьшение может быть самым быстрым

%%timeit
from functools import reduce
df['Cum_Prob']=reduce(lambda cum_prob, new_prob: (1-cum_prob)*new_prob + cum_prob ,
                      df_days.values.T)
111 µs ± 2.29 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%%timeit
cumprob=0
for i, col in df_days.items():
    cumprob = col.mul(1-cumprob) + cumprob
df['Cum_Prob']=cumprob
1.44 ms ± 5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
2 голосов
/ 09 марта 2020

С небольшой математикой это просто

1 - (1-df).prod(1)
# if your `Id` is not index:
# 1 - df.filter(like='days)
# 1 - df.set_index('Id')

Вывод:

Id
1    0.686180
2    0.936286
3    0.263440
dtype: float64
...