我有以下内容:
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