python - 用公式的结果填充整列 - 熊猫
问题描述
我正在努力用一个简单的布尔公式的输出重新填充 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 循环。有什么建议吗?
解决方案
另一种选择是使用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
)
有点难以阅读,但在大数据帧上应该更快。