Расчет серии на основе сдвинутых значений / рекурсивный алгоритм - PullRequest
0 голосов
/ 20 октября 2018

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

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

Эти строки в основном принимают только df ['Alpha'], но не df ['PositionLong']. Shift (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

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

Можете ли вы помочь мне, пожалуйста?

1 Ответ

0 голосов
/ 20 октября 2018

Вы ищете рекурсивную функцию , поскольку предыдущее значение 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
...