Python 列的条件信号

Python 列的条件信号,python,pandas,quantitative-finance,Python,Pandas,Quantitative Finance,阅读雅虎财经为nvidia下载ohlcv, 我正在为signal buy/dontbuy创建一个列,当我试图定义哪个通过了avg>volume测试时,所有内容要么全部“买入”,要么不买入 df=pd.read_csv('NVDA.csv',dtype={'label':str}) df['Price%delta']=((df['Close']/df['Open'])*100) df['Avg_volume']=df['Volume'].rollin

阅读雅虎财经为nvidia下载ohlcv, 我正在为signal buy/dontbuy创建一个列,当我试图定义哪个通过了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'

您没有指定任何要分配
'Buy'
'Don-Buy'
的索引。改用:


您没有指定任何要分配
'Buy'
'Don-Buy'
的索引。改用:


您根本不需要for循环:

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

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

您根本不需要for循环:

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

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

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


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



你的问题是什么?使用类似于
df['Signal']=np.where(行['Volume']>行['Avg\u Volume'],'Buy','not Buy')
。避免使用for循环,因为它可以在矢量化的环境中完成way@IanQuah请注意,在每次迭代中,OP只是设置整个系列,而不是每一行。因此,他得到了所有重复的值,根据他的上一次迭代,这些值要么都是
Buy
要么是
Dont Buy
,谢谢你的建议。你的问题是什么?使用类似
df['Signal']=np.where(row['Volume']>row['Avg_Volume'],'Buy','Dont Buy')
。避免使用for循环,因为它可以在矢量化的环境中完成way@IanQuah请注意,在每次迭代中,OP只是设置整个系列,而不是每一行。因此,他得到了所有重复的值,根据他上次的迭代,要么都是
Buy
或者
Dont Buy
,谢谢我感谢你的建议它终于起作用了谢谢你知道得很好。请让我知道,我通过将答案设置为正确来为您解决它。仅供参考-此解决方案将比我发布的用于更大数据帧的矢量化解决方案慢得多。我知道@rahlf23它可以矢量化,但是,鉴于用户不知道如何正确索引数据,我发现在纠正实际代码方面给予一些帮助更合适。不要说你的答案是错误的@nixon,它肯定会为OP产生所需的输出。只是指出一点:)它终于起作用了,谢谢你nixonGood知道。请让我知道,我通过将答案设置为正确来为您解决它。仅供参考-此解决方案将比我发布的用于更大数据帧的矢量化解决方案慢得多。我知道@rahlf23它可以矢量化,但是,鉴于用户不知道如何正确索引数据,我发现在纠正实际代码方面提供一些帮助更合适。不要说你的答案是错误的@nixon,它肯定会为OP生成所需的输出。只需指出一点:)
df['Signal'] = np.where(df['Volume'] > df['Avg_volume'], 'Buy', 'Dont Buy')