Расчет серии на основе смещенных значений / рекурсивный алгоритм

голоса
2

У меня есть следующие:

df['PositionLong'] = 0
df['PositionLong'] = np.where(df['Alpha'] == 1, 1, (np.where(np.logical_and(df['PositionLong'].shift(1) == 1, df['Bravo'] == 1), 1, 0)))

Эти линии в основном только взять в ФР [ «Альфа»], но не ф.р. [ «PositionLong»]. Смещаться (1) .. Он не может признать это, но я не понимаю, почему?

Он производит это:

df['Alpha']  df['Bravo']   df['PositionLong']
0               0             0
1               1             1
0               1             0
1               1             1
1               1             1

Однако то, что я хотел код, чтобы сделать это:

df['Alpha']  df['Bravo']   df['PositionLong']
0               0             0
1               1             1
0               1             1
1               1             1
1               1             1

Я считаю, что решение состоит в цикле каждая строка, но это займет очень много времени.

Не могли бы вы мне помочь?

Задан 20/10/2018 в 04:55
источник пользователем
На других языках...                            


1 ответов

голоса
2

Вы ищете рекурсивную функцию , так как предыдущее PositionLongзначение зависит Alpha, которое сам по себе используются для определения PositionLong.

Но numpy.whereрегулярная функция, поэтому df['PositionLong'].shift(1)оцениваются как ряд 0значений, так как вы инициализация серии 0.

Ручной цикл не должен быть дорогим. Вы можете использовать , numbaчтобы эффективно реализовать рекурсивный алгоритм:

from numba import njit

@njit
def rec_algo(alpha, bravo):
    res = np.empty(alpha.shape)
    res[0] = 1 if alpha[0] == 1 else 0
    for i in range(1, len(res)):
        if (alpha[i] == 1) or ((res[i-1] == 1) and bravo[i] == 1):
            res[i] = 1
        else:
            res[i] = 0
    return res

df['PositionLong'] = rec_algo(df['Alpha'].values, df['Bravo'].values).astype(int)

Результат:

print(df)

   Alpha  Bravo  PositionLong
0      0      0             0
1      1      1             1
2      0      1             1
3      1      1             1
4      1      1             1
Ответил 20/10/2018 в 14:16
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more