用公式的结果填充整个列

2024-04-20 09:54:00 发布

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

我正在努力用一个简单的布尔公式的输出重新填充一个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

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

填充上和列的伪代码:

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

用于填充低位和列的伪代码:

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循环。。有什么建议吗?你知道吗


Tags: and代码inmiddleforcloselenif
2条回答

另一种选择是使用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
)

读起来有点难,但在大数据帧上应该更快。你知道吗

如果您刚刚在dataframe中定义了列,而没有将它们定义为自己,那么Close就不作为变量存在;您必须调用df['Close']df.Close。但是您应该使用apply,而不是执行for循环:

def set_upper(row):
    if row['middle_BBAND'] ==1:       
        if row['Close'] < row['upper_BBAND']:
            return 1
        if row['Close'] > row['upper_BBAND']:
            return 0
    return row['upper_BBAND']

df['upper_BBAND'] = df.apply(set_upper,axis=1)    

相关问题 更多 >