Pandas - динамически генерируя значения в столбце и используя их в следующих строках в реальном времени - PullRequest
2 голосов
/ 23 декабря 2019

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

Date          Score    Duration_Diff

2019-05-11     25         0
2019-05-14     30        0.1
2019-06-19     20        1.01
2019-07-23     56        1.04

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

Например: для индекса 1, поскольку у нас нет предыдущей даты, она останется прежней. Для позиции индекса 2, скажем, я умножил коэффициент e^-0.1 на 25, чтобы обновленная оценка стала (25*e^-0.1+30)/2=26.3. Теперь для позиции индекса 3 я хочу умножить временной фактор на 26,3, а не на 30 и аналогично для других следующих строк.

Код, который у меня теперь есть, рассматривает статическое значение, которое есть в предыдущей строке, ине динамически обновляемый. Я не могу придумать логику, которая рассматривает динамически обновляемые значения в режиме реального времени, поэтому мне нужна помощь, как я могу использовать их для следующей строки?

Ответы [ 2 ]

2 голосов
/ 23 декабря 2019

Предлагаю использовать numba для улучшения производительности циклов:

from numba import jit
import math

@jit(nopython=True)
def func(a):
    for i in range(1, a.shape[0]):
        a[i] = (a[i-1, 0] * math.exp(-a[i, 1]) + a[i, 0]) / 2
    return a[:, 0]

df['score'] = func(df[['score','dur']].values)
print(df)
       score   dur
0  25.000000  0.00
1  26.310468  0.10
2  14.791386  1.01
3  30.614042  1.04
0 голосов
/ 23 декабря 2019
df = pd.DataFrame({'score':[25,30,20,56],'dur':[0,0.1,1.01,1.04]})

for i in range(len(df)):
    if i!=0:
        print(df['score'][i-1])
        df['score'][i] = (df['score'][i-1]*math.exp(df['dur'][i])+df['score'][i])/2

print(df)

Выход: -

   score   dur
0     25  0.00
1     28  0.10
2     48  1.01
3     95  1.04
...