[英]Pandas column based on previous row multicolumn criteria
我知道這已被問過幾次,但我無法解決它。 我非常抱歉。 我有一個 dataframe 'stock_df' ,其中 1 列具有 'RSI_14' 值。 我是新手,所以為了更容易,我用 == 0 為 3 個狀態初始化 3 列。 這個輔助欄目是為了更好地解釋這個問題:
目標是在 ' 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.