为数据帧创建了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 |