基于移位值/递归算法的序列计算



>我有以下内容:

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

我相信解决方案是循环每一行,但这需要很长时间。

你能帮我吗?

您正在寻找一个递归函数,因为前一个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

最新更新