2016-06-27 311 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

相關問題