Вычислить значение следующей строки как функцию предыдущих строк с пандами - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь реализовать следующий алгоритм для моего DataFrame:

if Tenure==0: 
   s=1 
else: 
   s = (previous value from "s") * (1-previous value from "h")

Столбец s вычисляется как функция h с начальным значением 1.

Входные данныеФрейм:

        popt    stopt    popcum    h        s
Tenure                  
 0.0    2383    508.0   5067890 0.000100    1
 1.0    18358   17310.0 5065507 0.003417    0
 2.0    16742   15103.0 5047149 0.002992    0
 3.0    13298   11361.0 5030407 0.002258    0
 4.0    9566    9522.0  5017109 0.001898    0


result3["s"]=result3.apply(funkcyjka)

Чтобы пропустить первое условие, я только что отредактировал первый ряд, потому что это единственный с Tenure = 0

Вот что я придумал:

def funkcyjka(res):
    x=0
    lol=(res["s"].iloc[x])*(1-(res["h"].iloc[x]))
    x+=1
    return lol

Но он не делает то, что я ожидаю. Как я могу реализовать эту функцию в моем Dataframe?

1 Ответ

0 голосов
/ 10 мая 2018

Если вы проследите это на бумаге, это то, что фактически вычисляется для каждой строки s:

1
1 * (1 - h0)
(1 - h0) * (1 - h1)
(1 - h0) * (1 - h1) * (1 - h2)
...

Итак, вам понадобится shift + cumprod здесь:

df['s'] = (1 - df['h'].shift()).fillna(1).cumprod()
df
         popt    stopt   popcum         h         s
Tenure                                             
0.0      2383    508.0  5067890  0.000100  1.000000
1.0     18358  17310.0  5065507  0.003417  0.999900
2.0     16742  15103.0  5047149  0.002992  0.996483
3.0     13298  11361.0  5030407  0.002258  0.993502
4.0      9566   9522.0  5017109  0.001898  0.991259
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...