我正在處理 pandas DataFrame 中的列(趨勢)。下面是我的源資料框。目前我已將其設定為 0。

我想用來填充趨勢列的邏輯如下
如果 df['Close'] > df.shift(1)['Down'] 那么 1
如果 df['Close'] < df.shift(1)['Up'] 則 -1
如果上述條件中的任何一個不滿足,則 df.shift(1)['Trend']。如果此值為 NaN,則將其設定為 1。
以上純文本代碼,
- 如果當前收盤價大于Down列的前一行值,則為 1
- 如果當前收盤價小于Up列的前一行值,則 -1
- 如果其中任何一個條件不滿足,則設定Trend列的前一行值,只要它不是 NaN。如果它的 NaN 則設定為 1
更新
資料作為文本
Close Up Down Trend
3.138 NaN NaN 0
3.141 NaN NaN 0
3.141 NaN NaN 0
3.130 NaN NaN 0
3.110 NaN NaN 0
3.130 3.026432 3.214568 0
3.142 3.044721 3.214568 0
3.140 3.047010 3.214568 0
3.146 3.059807 3.214568 0
3.153 3.064479 3.214568 0
3.173 3.080040 3.214568 0
3.145 3.080040 3.214568 0
3.132 3.080040 3.214568 0
3.131 3.080040 3.209850 0
3.141 3.080040 3.209850 0
3.098 3.080040 3.205953 0
3.070 3.080040 3.195226 0
預期產出

uj5u.com熱心網友回復:
我們可以numpy.select根據滿足的條件來選擇值。然后傳遞 to 的結果numpy.select以fillna用它填充缺失的“趨勢”值(這用于不丟失現有的“趨勢”值)。然后由于必須用先前的“趨勢”值填充 NaN 趨勢值,因此我們使用ffill1 填充剩余的 NaN 值。
import numpy as np
df['Trend'] = (df['Trend'].replace(0, np.nan)
.fillna(pd.Series(np.select([df['Close'] > df['Down'].shift(),
df['Close'] < df['Up'].shift()],
[1, -1], np.nan), index=df.index))
.ffill().fillna(1))
輸出:
Close Up Down Trend
0 3.138 NaN NaN 1.0
1 3.141 NaN NaN 1.0
2 3.141 NaN NaN 1.0
3 3.130 NaN NaN 1.0
4 3.110 NaN NaN 1.0
5 3.130 3.026432 3.214568 1.0
6 3.142 3.044721 3.214568 1.0
7 3.140 3.047010 3.214568 1.0
8 3.146 3.059807 3.214568 1.0
9 3.153 3.064479 3.214568 1.0
10 3.173 3.080040 3.214568 1.0
11 3.145 3.080040 3.214568 1.0
12 3.132 3.080040 3.214568 1.0
13 3.131 3.080040 3.209850 1.0
14 3.141 3.080040 3.209850 1.0
15 3.098 3.080040 3.205953 1.0
16 3.070 3.080040 3.195226 -1.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/439090.html
上一篇:使用PyQt5播放音頻
