首页 > 解决方案 > 用公式的结果填充整列 - 熊猫

问题描述

我正在努力用一个简单的布尔公式的输出重新填充 pandas df 列。

这是我的数据示例:

      Close  RSI_14  MACD  upper_BBAND  lower_BBAND  middle_BBAND
33  1.26470     5.0   1.0     1.26601     1.26456           0.0
34  1.26495     6.0   1.0     1.26566     1.26468           0.0
35  1.26555     6.0   1.0     1.26573     1.26456           1.0
36  1.26680     7.0   1.0     1.26682     1.26386           1.0
37  1.26735     7.0   1.0     1.26781     1.26366           1.0
38  1.26725     7.0   1.0     1.26812     1.26428           1.0
39  1.26730     7.0   1.0     1.26798     1.26526           1.0
40  1.26725     7.0   1.0     1.26736     1.26656           1.0
41  1.26755     7.0   1.0     1.26745     1.26701           1.0
42  1.26745     7.0   1.0     1.26766     1.26718           1.0
43  1.26705     6.0   1.0     1.26784     1.26716           0.0
44  1.26685     6.0   1.0     1.26797     1.26695           0.0
45  1.26680     6.0   1.0     1.26797     1.26674           0.0
46  1.26765     7.0   1.0     1.26799     1.26665           1.0
47  1.26750     6.0   1.0     1.26803     1.26665           1.0
48  1.26685     6.0   1.0     1.26804     1.26658           0.0
49  1.26650     5.0   1.0     1.26807     1.26631           0.0

我想从公式中推断出二进制信号。信号应存储在 upper_BBAND 和 lower_BBAND 列中,并基于以下伪代码:

填充 upper_BBAND 列的伪代码:

For i in len(Close):
    if middle_BBAND[i] == 1 and Close[i] < upper_BBAND[i]:
        upper_BBAND[i] = 1
    elif middleBBAND[i] == 1 and Close[i] > upper_BBAND[i]:
           upper_BBAND[i] = 0

填充 lower_BBAND 列的伪代码:

For i in len(Close):
    if middle_BBAND[i] == 0 and Close[i] > lower_BBAND[i]:
         lower_BBAND[i] == 0
    elif middle_BBAND[i] == 0 and Close[i] < lower_BBAND[i]:
         lower_BBAND[i] == 1

所需的输出是这样的:

      Close  RSI_14  MACD  upper_BBAND  lower_BBAND  middle_BBAND
39  1.26730     7.0   1.0         1.0         0.0           1.0
40  1.26725     7.0   1.0         1.0         0.0           1.0
41  1.26755     7.0   1.0         0.0         0.0           1.0
42  1.26745     7.0   1.0         0.0         0.0           1.0
43  1.26705     6.0   1.0         0.0         0.0           0.0
44  1.26685     6.0   1.0         0.0         0.0           0.0
45  1.26680     6.0   1.0         0.0         1.0           0.0

我正在努力让熊猫识别这个伪 for 循环。有什么建议吗?

标签: pythonpython-3.xpandas

解决方案


另一种选择是使用DataFrame.where

df['upper_BBAND'] = df['upper_BBAND'].where(
    ~((df['middle_BBAND'] == 1.0) & (df['Close'] < df['upper_BBAND'])), 1.0
).where(
    ~((df['middle_BBAND'] == 1.0) & (df['Close'] > df['upper_BBAND'])), 0.0
)

有点难以阅读,但在大数据帧上应该更快。


推荐阅读