基于移位值/递归算法的级数计算

2024-06-28 11:17:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下几点:

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']。。它不能认出它,但我不明白为什么

它产生了:

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

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

你能帮帮我吗


Tags: and代码alphadfshiftnp解决方案where
1条回答
网友
1楼 · 发布于 2024-06-28 11:17:55

您正在寻找一个递归函数,因为前面的PositionLong值依赖于Alpha,它本身用于确定PositionLong

但是numpy.where是一个正则函数,因此df['PositionLong'].shift(1)作为一系列0值进行计算,因为您使用0初始化了该系列

手动回路不需要昂贵。可以使用^{}高效地实现递归算法:

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

相关问题 更多 >