基于前几行的新列的Python条件值



为数据帧创建了5P移动平均线和20P移动平均线,我正试图根据5P&20P移动平均线。

如果5Pmoving average>20P移动平均值,然后将新列单元格移动到="买入"如果5Pmoving average<20P移动平均值,然后将新列单元格移动到="出售">

我已经创建了一个专栏,上面写着买入/卖出

我试图创建一个新列,以确认行和行+1是否不同,然后根据订单购买/出售。

这就是我的数据帧的样子

CBA = {5MA: [13.11,13.44,13.56,13.45,13.10,12.45],
20MA: [12.67,12.77,12.87,13.50,13.45,12.30],
test: [BUY,BUY,BUY,SELL,SELL,BUY]}

我想要的结果

CBA = {5MA: [13.11,13.44,13.56,13.45,13.10,12.45],
20MA: [12.67,12.77,12.87,13.50,13.45,12.30],
test: [BUY,BUY,BUY,SELL,SELL,BUY],
BUY/SELL: [NaN, NaN,SELL,NaN,BUY]}

我做了这个功能

def buy_sell_strat(df): 
for i, row in df:
if df.loc[i,'test'] == 'SELL' & df.loc[i+1,'test'] == 'BUY':
return 'BUY'
elif df.loc[i,'test'] == 'BUY' & df.loc[i+1,'test'] == 'SELL':
return 'SELL'
else:
return 'NaN'
CBA['Buy/Sell'] = CBA.apply(buy_sell_strat,axis = 1)

然而,我得到错误

TypeError:无法解压缩不可迭代的浮动对象

循环解决方案

为什么不直接使用(下面是更快的解决方案(:

data = {"5MA": [13.11, 13.44, 13.56, 13.45, 13.10, 12.45],
"20MA": [12.67, 12.77, 12.87, 13.50, 13.45, 12.30],
"test": ["BUY", "BUY", "BUY", "SELL", "SELL", "BUY"]}

df = pd.DataFrame(data)
# takes 1.41 s ± 14.7 ms per loop (mean ± std. dev. of 7 runs, 3 loops each)
for i in range(df.index[-1]):
if df.loc[i, 'test'] == 'SELL' and df.loc[i+1, 'test'] == 'BUY':
df.loc[i, 'Buy/Sell'] = 'BUY'
elif df.loc[i, 'test'] == 'BUY' and df.loc[i+1, 'test'] == 'SELL':
df.loc[i, 'Buy/Sell'] = 'SELL'
else:
df.loc[i, 'Buy/Sell'] = 'NaN'

输出为:

|    |   5MA |   20MA | test   | Buy/Sell   |
|---:|------:|-------:|:-------|:-----------|
|  0 | 13.11 |  12.67 | BUY    | NaN        |
|  1 | 13.44 |  12.77 | BUY    | NaN        |
|  2 | 13.56 |  12.87 | BUY    | SELL       |
|  3 | 13.45 |  13.5  | SELL   | NaN        |
|  4 | 13.1  |  13.45 | SELL   | BUY        |
|  5 | 12.45 |  12.3  | BUY    | nan        |

快速解决方案

由于@CainãMax Couto Silva提供了np.nan提示,一种更快、更像pandas的解决方案将是(与6000行dataframe相比快约500倍(。

df['Buy/Sell'] = np.nan
# takes 3.2 ms ± 52.1 µs per loop(mean ± std. dev. of 7 runs, 100 loops each)
df.loc[(df['test'] == "SELL") & (df['test'].shift(-1) == "BUY"), 'Buy/Sell'] = 'BUY'
df.loc[(df['test'] == "BUY") & (df['test'].shift(-1) == "SELL"), 'Buy/Sell'] = 'SELL'

它给你相同的输出:

|    |   5MA |   20MA | test   | Buy/Sell   |
|---:|------:|-------:|:-------|:-----------|
|  0 | 13.11 |  12.67 | BUY    | NaN        |
|  1 | 13.44 |  12.77 | BUY    | NaN        |
|  2 | 13.56 |  12.87 | BUY    | SELL       |
|  3 | 13.45 |  13.5  | SELL   | NaN        |
|  4 | 13.1  |  13.45 | SELL   | BUY        |
|  5 | 12.45 |  12.3  | BUY    | NaN        |

最新更新