有没有累积概率的python函数
Is there a python function for cumulative probability
我有一个如下所示的数据框:
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
此 table 显示每条记录在每一天发生特定事件的概率。
我要搜索的是一个 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
上述示例 table 中的 Cum_Prob
值是正确的,即对于每个 Id
值,它们是事件在 3 天中的任何一天发生的实际概率。
这个函数我可以自己写几天。实际上,我处理的时间超过 3 天,我相信手写这个函数很多天会非常乏味。
是否有一个预先存在的函数可以根据单个概率的输入计算概率?或者有没有一种快速的方法可以在 x 天内为此编写一个 udf?
使用:
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
替代 reduce
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)
稍微算一下,这就是
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
我有一个如下所示的数据框:
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
此 table 显示每条记录在每一天发生特定事件的概率。
我要搜索的是一个 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
上述示例 table 中的 Cum_Prob
值是正确的,即对于每个 Id
值,它们是事件在 3 天中的任何一天发生的实际概率。
这个函数我可以自己写几天。实际上,我处理的时间超过 3 天,我相信手写这个函数很多天会非常乏味。
是否有一个预先存在的函数可以根据单个概率的输入计算概率?或者有没有一种快速的方法可以在 x 天内为此编写一个 udf?
使用:
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
替代 reduce
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)
稍微算一下,这就是
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