【问题标题】:if and elif for three conditionsif 和 elif 三个条件
【发布时间】:2021-08-24 10:28:59
【问题描述】:

我正在通过 SMA 15 分析股票趋势如下:

  1. 如果收盘价领先其 MA15 并且 MA15 在过去 5 天上升,则趋势为上升趋势,即趋势信号为 1。

  2. 如果收盘价落后于 MA15 且 MA15 连续 5 天下跌,则趋势为 Downtrend,即趋势信号为 0。

  3. 如果这些规则都不满足,则称股市没有趋势。

我知道如何做第一个和第二个两个条件,但我想在没有趋势的情况下添加第三个。

## Data loading..
!pip install yfinance
import pandas as pd 
import yfinance as yf

df=yf.download('^GSPC',start='2015-11-26',end='2020-12-31',interval='1d')
# this is how I did it 

df['SMA15']=df['Adj Close'].rolling(15).mean()
df['SMA15-5']=df['SMA15'].rolling(5).mean()
df['SMA15-5dif']=df['SMA15-5'].diff()

df['Trend']=['up' if df.loc[ei,'Close']>df.loc[ei,'SMA15'] and (df.loc[ei,'SMA15-5dif']> 0 ) else 'down' for ei in df.index] ## this gave me up and down but no "no"

# I did this but was wrong 
df['Trend']=['up' if df.loc[ei,'Close']>df.loc[ei,'SMA15'] and (df.loc[ei,'SMA15-5dif']> 0 ) elif df.loc[ei,'Close']<df.loc[ei,'SMA15'] and (df.loc[ei,'SMA15-5dif']< 0 ) 'down' else 'no' for ei in df.index]

我正在寻找这样的东西 感谢您的宝贵时间

【问题讨论】:

  • 您能否提供一个与您的数据相似的虚拟 df 以供使用?
  • 你可以通过使用yf来使用问题中的df

标签: python pandas dataframe


【解决方案1】:

试试这个:

for ei in df.index:
    if df.loc[ei,'Close'] > df.loc[ei,'SMA15'] and df.loc[ei,'SMA15-5dif'] > 0:
        df.at[ei,'Trend'] = 'up'
    elif df.loc[ei,'Close'] < df.loc[ei,'SMA15'] and df.loc[ei,'SMA15-5dif'] < 0:
        df.at[ei,'Trend'] = 'down'
    else:
        df.at[ei,'Trend'] = 'no'

【讨论】:

    【解决方案2】:

    np.select 利用矢量化:

    condlist = [
        (df.loc[ei,'Close'] > df.loc[ei,'SMA15']) & (df.loc[ei,'SMA15-5dif'] > 0),
        (df.loc[ei,'Close'] < df.loc[ei,'SMA15']) & (df.loc[ei,'SMA15-5dif'] < 0)
    ]
    choicelist = [
        'up',
        'down'
    ]
    
    df.at[ei,'Trend'] = np.select(condlist, choicelist, 'no')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 2012-09-02
      • 2020-01-05
      • 2021-03-07
      相关资源
      最近更新 更多