【问题标题】:Signal conditional for column [duplicate]列的信号条件[重复]
【发布时间】:2018-11-30 20:20:11
【问题描述】:

从 yahoo Finance 下载 ohlcv for nvidia 阅读, 我正在为信号购买/不购买创建一列,当我尝试定义哪些通过了 avg>volume 测试时,所有结果要么全部“购买”,要么不购买。

df=pd.read_csv('NVDA.csv',dtype={'label':str})
df['Price%delta']=((df['Close']/df['Open'])*100)                       

df['Avg_volume']=df['Volume'].rolling(7).mean()

df['Signal']=0

for index, row in df.iterrows():
    if row['Volume'] > row['Avg_volume']:
    df['Signal']='Buy'
    else:
        df['Signal']='Dont Buy'

【问题讨论】:

  • 你有什么问题?
  • 使用类似df['Signal']=np.where(row['Volume'] > row['Avg_volume'],'Buy','Dont Buy')的东西。当它可以以向量化的方式完成时,避免使用 for 循环
  • @IanQuah 请注意,在每次迭代中 OP 只是设置整个系列而不是每一行。因此,根据他的最后一次迭代,他得到了所有重复的值,这些值要么是 Buy,要么是 Dont Buy
  • 谢谢你的建议

标签: python pandas quantitative-finance


【解决方案1】:

你根本不需要 for 循环:

mask = df["Volume"] > df["Avg_volume"] 

df.loc[mask, "Signal"] = "Buy"
df.loc[~mask, "Signal"] = 'Don't buy'

【讨论】:

    【解决方案2】:

    您没有指定任何索引来分配'Buy''Don't buy'。请改用loc

    for index, row in df.iterrows(): 
        if row['Volume'] > row['Avg_volume']:
            df.loc[index, 'Signal']='Buy'
        else:
            df.loc[index, 'Signal']='Dont Buy'
    

    【讨论】:

    • 终于成功了,谢谢尼克松
    • 很高兴知道。请让我知道我通过将答案设置为正确的方式为您解决了这个问题。
    • 仅供参考 - 此解决方案将比我为更大数据帧发布的矢量化解决方案慢得多。
    • 我知道我知道@rahlf23 它可以被矢量化,但是,鉴于用户不知道如何正确索引数据,我发现更适合在更正实际代码方面提供一些帮助
    • 并不是说您的答案不正确@nixon,它肯定会为 OP 产生所需的输出。只是指出一些事情:)
    【解决方案3】:

    使用np.where()的矢量化解决方案:

    df['Signal'] = np.where(df['Volume'] > df['Avg_volume'], 'Buy', 'Dont Buy')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多