移动平均线交叉的错误结果

时间:2021-01-22 15:14:04

标签: python pandas dataframe

我有一个具有以下值的数据框。我想确定日期,当低点低于 SMA8Low 时。

pH - 42752 -- 2.13 V, Tds: 0 -- 0.0 V
pH - 43968 -- 2.16 V, Tds: 17280 -- 0.0 V
pH - 42176 -- 2.18 V, Tds: 23296 -- 1.13 V
pH - 43392 -- 2.16 V, Tds: 0 -- 0.0 V
pH - 43648 -- 2.19 V, Tds: 18112 -- 0.0 V
pH - 43456 -- 2.2 V, Tds: 22720 -- 1.09 V
pH - 43200 -- 2.14 V, Tds: 0 -- 0.39 V
pH - 43456 -- 2.22 V, Tds: 640 -- 0.0 V
pH - 43072 -- 2.17 V, Tds: 21568 -- 0.09 V
pH - 43648 -- 2.18 V, Tds: 16960 -- 1.17 V
pH - 44160 -- 2.14 V, Tds: 0 -- 0.0 V
pH - 43840 -- 2.18 V, Tds: 17216 -- 0.0 V
pH - 42688 -- 2.18 V, Tds: 23744 -- 1.11 V
pH - 43520 -- 2.18 V, Tds: 1472 -- 0.6 V
pH - 43328 -- 2.22 V, Tds: 0 -- 0.02 V
pH - 43200 -- 2.15 V, Tds: 18240 -- 0.0 V
pH - 42688 -- 2.16 V, Tds: 14592 -- 1.13 V
pH - 44096 -- 2.17 V, Tds: 0 -- 0.0 V
pH - 43968 -- 2.17 V, Tds: 13376 -- 0.0 V
pH - 43200 -- 2.19 V, Tds: 22144 -- 1.09 V
pH - 43264 -- 2.21 V, Tds: 0 -- 0.0 V
pH - 43520 -- 2.17 V, Tds: 17088 -- 0.0 V
pH - 42304 -- 2.19 V, Tds: 13952 -- 1.19 V

以上代码后的Dataframe结果如下:

Dataframe

如果昨天是真的,今天是真的,那么现在新的列交叉应该只为真。

我尝试了以下代码:

  df['SMA10High'] = df.loc[:,'High'].rolling(window=10).mean()
  df['SMA8Low'] = df.loc[:,'Low'].rolling(window=8).mean()
  df['yesterday'] = df['Low'].shift(1) >= df['SMA8Low'].shift(1) #yesterdays 
  LOW >= SMA8Low
  df['today'] = df['Low'] <= df['SMA8Low']  #Todays Low <= SMA8Low
  df.dropna(inplace=True) #droping NaN values

enter image description here

但结果是错误的。只有以下日期在列交叉中应为 True: 2021-01-08 和 2021-01-22

2 个答案:

答案 0 :(得分:0)

只需向 np.where 添加另一个条件:

df['crossover'] = np.where(df['today'] & (df['yesterday'] == df['today']),True,True)

答案 1 :(得分:0)

解决办法是: df['crossover'] = np.where(df['today'] & (df['yesterday'] == df['today']),True,False)

df['SMA10High'] = df.loc[:,'High'].rolling(window=10).mean()
df['SMA8Low'] = df.loc[:,'Low'].rolling(window=8).mean()
df['yesterday'] = df['Low'].shift(1) >= df['SMA8Low'].shift(1) #yesterdays LOW >= 
SMA8Low
df['today'] = df['Low'] <= df['SMA8Low']  #Todays Low <= SMA8Low
df.dropna(inplace=True) #droping NaN values
df['crossover'] = np.where(df['today'] & (df['yesterday'] == df['today']),True,False)