Skip to main content
 首页 » 编程设计

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

2024年09月03日8dudu

我有以下内容:

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