Как динамически создавать столбцы на основе нескольких условий - PullRequest
0 голосов
/ 06 апреля 2020

Итак, у меня возникла следующая проблема:

У меня есть кадр данных, подобный приведенному ниже, где time_diff_float - это разница во времени между каждой строкой и строкой выше в минутах. Так, например, у меня было value = 4 20 минут после value = 1.

value | time_diff_float
1       NaN
4       20
3       13
2       55
5       08
7       15

Сначала я должен проверить, составляет ли разница во времени между двумя строками <60 (один час), и создать столбец, используя формула <code>rem = value (from row above) * lambda ** time difference between 2 rows. Моя лямбда-константа имеет значение 0,97.

И затем, если разница во времени между каждой строкой и двумя вышеупомянутыми строками все еще меньше 60, я должен повторить то же самое, сравнивая каждую строку с 2 ряда выше. И затем я должен сделать то же самое, сравнивая 3 строки выше и т. Д. c.

. Для этого я написал следующий код:

df.loc[df['time_diff_float'] < 60, 'rem_1'] = df['value'].shift() * (lambda_ ** (df['time_diff_float'] - 1))
df.loc[df['time_diff_float'] + df['time_diff_float'].shift() < 60, 'rem_2'] = df['value'].shift(2) * (lambda_ ** (df['time_diff_float'] + df['time_diff_float'].shift() - 1))
df.loc[df['time_diff_float'] + df['time_diff_float'].shift() + df['time_diff_float'].shift(2) < 60, 'rem_3'] = df['value'].shift(3) * (lambda_ ** (df['time_diff_float'] + df['time_diff_float'].shift() + df['time_diff_float'].shift(2) - 1))

Мой вопрос: так как у меня есть Чтобы повторить это по крайней мере в 10 раз (даже больше) с реальными значениями, которые у меня есть, есть ли способ динамически создавать «столбцы rem»?

Заранее спасибо!

1 Ответ

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

Вы можете сохранить маску своих данных и затем обновлять ее каждый раз, когда l oop:

n = 3
for i in range(1, n):
    if (i==1):
        mask = df['time_diff_float']
        df.loc[mask, 'rem_' +str(i)] = df['value'].shift() * (lambda_ ** (mask - 1))

    else:
        mask += df['time_diff_float'].shift(i-1)
        df.loc[mask < 60, 'rem_'+str(i)] = df['value'].shift(i) * (lambda_ ** (mask - 1))
...