Преобразовать ли план данных вероятностей для определенных c периодов в вероятности по крайней мере один раз за n периодов? - PullRequest
1 голос
/ 13 апреля 2020

У меня есть фрейм данных, который имеет вероятности для различных событий в течение большого количества последовательных периодов, и я хочу преобразовать этот 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

И я хочу выяснить вероятность возникновения А, по крайней мере, один раз в течение двух периодов (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 функция или термин, который бы работал здесь?

1 Ответ

1 голос
/ 13 апреля 2020

Вы можете использовать групповую трансформацию:

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
...