首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于先前行的新列的Python条件值

基于先前行的新列的Python条件值
EN

Stack Overflow用户
提问于 2020-12-04 14:38:15
回答 1查看 59关注 0票数 0

为dataframe创建了5P移动平均值和20P移动平均值,我正在尝试基于5P和20P移动平均值的值创建一个新列。

如果5P移动平均值>20P移动平均值,则新的列单元格=‘买入’如果5P移动平均值<20P移动平均值,则新的列单元格=‘卖出’

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

我正在尝试创建一个新列,它确认如果行和row+1不同,则根据订单买入/卖出。

这就是我的数据帧的样子

代码语言:javascript
运行
复制
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]}

我想要的是结果

代码语言:javascript
运行
复制
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]}

我制作了这个函数

代码语言:javascript
运行
复制
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:无法解包不可迭代的浮点对象

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-04 14:52:56

循环解决方案

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

代码语言:javascript
运行
复制
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'

输出为:

代码语言:javascript
运行
复制
|    |   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- pandasnp.nan提示,一种更快、更像席尔瓦的解决方案会更快(比6000行dataframe快500倍左右)。

代码语言:javascript
运行
复制
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'

这给出了相同的输出:

代码语言:javascript
运行
复制
|    |   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        |
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65139011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档