将特定时期的概率数据框转换为 n 个时期至少一次的概率?

Transforming a dataframe of probabilities for specific periods to be probabilities of at least once over n periods?

我有一个数据框,它具有大量连续时间段内不同事件的概率,我想转换此 df 以显示某事在 n 个时间段内至少发生一次的概率。例如,我有这个,它是 n = 1:

event | period   | probability
A     | period 1 | 0.6
A     | period 2 | 0.7
A     | period 3 | 0.8
A     | period 4 | 0.85
A     | period 5 | 0.9

我想计算出 A 在两个时期 (n = 2) 中至少出现一次的概率,即:

A | period 1 | 1-(1-0.6)*(1-0.7)
A | period 2 | 1-(1-0.7)*(1-0.8)
A | period 3 | 1-(1-0.8)*(1-0.85)
A | period 4 | 1-(1-0.85)*(1-0.9)

而 n = 3 将是:

A | period 1 | 1-(1-0.6)*(1-0.7)*(1-0.8)
A | period 2 | 1-(1-0.7)*(1-0.8)*(1-0.85)
A | period 3 | 1-(1-0.8)*(1-0.85)*(1-0.9)

有一些 python / pandas 函数或术语可以在这里工作吗?

您可以将 groupby 与转换一起使用:

n = 2

df['new_probability'] = df.groupby('event')['probability'].transform(lambda x: x.rolling(n).agg(lambda y: 1-np.prod(1-y)).shift(-n+1))

print(df)
event   period  probability  new_probability
A  period1         0.60            0.880
A  period2         0.70            0.940
A  period3         0.80            0.970
A  period4         0.85            0.985
A  period5         0.90              NaN

对于n=3

n = 3

df['new_probability'] = df.groupby('event')['probability'].transform(lambda x: x.rolling(n).agg(lambda y: 1-np.prod(1-y)).shift(-n+1))

print(df)
event   period  probability  new_probability
A  period1         0.60            0.976
A  period2         0.70            0.991
A  period3         0.80            0.997
A  period4         0.85              NaN
A  period5         0.90              NaN