2016-06-27 312 views
-1

请帮助!我有几乎相同的SMA和EMA代码结构。 SMA代码正常,但EMA代码会收到错误:“ValueError:值的长度与索引的长度不匹配。”熊猫。 ValueError:值的长度不匹配索引的长度

SMA(简单移动平均线)代码:

import pandas as pd 
import matplotlib.pyplot as plt 
window_length = 20 
df = pd.read_csv("TWII_2009-2011.csv") 
df=df.set_index('Date') ##### 
close = df['Close'] 
def simple_moving_average(window_length): 
    sma=[] 
    for i in range(len(close)): 
     if i+1 < window_length: 
      sma.append(0) 
     else: 
      sma.append(sum(close[i+1 - window_length : i+1])/window_length) 
    return sma 
df['SMA'] = simple_moving_average(window_length) 

EMA(指数移动平均线)代码:

import pandas as pd 
import matplotlib.pyplot as plt 
window_length = 20 
df = pd.read_csv("TWII_2009-2011.csv") 
df=df.set_index('Date') ##### 
close = df['Close'] 
def exponential_moving_average(window_length): 
    ema = [] 
    j=1 
    for i in range(len(close)): 
     if i+1 < window_length: 
      sma = sum(close[:window_length])/window_length 
      multiplier = 2/float(1 + window_length) 
      ema.append(sma) 
      ema.append(((close[window_length] - sma) * multiplier) + sma) 
     else: 
      tmp = ((i - ema[j]) * multiplier) + ema[j] 
      j = j + 1 
      ema.append(tmp) 
    return ema 
df['EMA'] = exponential_moving_average(window_length) 
+3

我格式化了您的代码。但在将来,请突出显示您的代码,然后按编辑功能区上的{}按钮。 –

+2

你有没有尝试过任何调试? – Evert

+1

你应该发布完整的回溯,因为这将确切地确定错误的位置。 – mhawke

回答

0

您可以附加EMA两次!在第一个'If'语句中而在SMA中只添加一次。删除一个..

for i in range(len(close)): 
      if i+1 < window_length: 
       sma = sum(close[:window_length])/window_length 
       multiplier = 2/float(1 + window_length) 
       ema.append(sma) 
       ema.append(((close[window_length] - sma) * multiplier) + sma) 
      else: 
       tmp = ((i - ema[j]) * multiplier) + ema[j] 
       j = j + 1 
       ema.append(tmp) 
     return ema 

您应该为这些计算查找pandas方法。

+0

我试过ema.append(sma)或ema.append(((close [window_length] - sma)* multiplier)+ sma)。错误消失,但输出不是ema值。不管怎么说,还是要谢谢你!我会尝试查找这些计算的熊猫方法。 – James

相关问题