簡體   English   中英

Pandas 列基於上一行多列標准

[英]Pandas column based on previous row multicolumn criteria

我知道這已被問過幾次,但我無法解決它。 我非常抱歉。 我有一個 dataframe 'stock_df' ,其中 1 列具有 'RSI_14' 值。 我是新手,所以為了更容易,我用 == 0 為 3 個狀態初始化 3 列。 這個輔助欄目是為了更好地解釋這個問題:

  • 超過 70 --> 'plus70' = 1
  • 小於 30 --> 'minus30' = 1
  • 在 70 到 30 之間 --> '介於' = 1

目標是在 ' RSI_14 ' > 70 和-1當 'RSI_14' < 30(這很容易)時產生一個“信號” ,但棘手的部分是當 state 是“介於”70 和 30 之間時需要將前+1 或 -1 state 放在'Signal'中,並保持該數字直到 state 的下一個 +1 或 -1變化,並一直保持下去......這應該不難。 shift(1) 或 .diff(1),但我不明白。

這是期望的結果:結果

我試過np.where,但它是最后一個似乎不起作用的“stock_df['Signal'].shift(1)”:

stock_df['Signal'] = np.where(stock_df['RSI_14'] > 70, 1, (np.where(stock_df['RSI_14'] < 30, -1, stock_df['Signal'].shift(1))))

我認為解決方案必須在“groupby”“transform”中,但我嘗試了很多不同的方法,但我很笨拙......我真的認為是 groupby。 我在這里檢查了很多答案,但我無法解決它。 我真的很感謝你的幫助。 謝謝

我認為您不需要創建任何其他列來實現此目的。 只需使用:

condition_values = stock_df.RSI_14.values
signal = []
last = None
for item in condition_values:
    if item < 30:
        signal.append(-1)
        last = -1
    elif item > 70:
        signal.append(1)
        last = 1
    else:
        signal.append(last)

 df['signal'] = signal

將開頭的 none 更改為您喜歡的值。

以下代碼片段可以工作。 將信號值分配為等於前一行信號值(之間等於 1 時)應該可以完成工作。

for i in range(len(stock_df)):
    if stock_df['between'][i] == 1:
        if i == 0:
            stock_df['Signal'][i] = 1
        else:
            stock_df['Signal'][i] = stock_df['Signal'][i - 1]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM