2016-02-04 27 views
0

我有一個關於布林帶的問題。 在下面的代碼中,僅當我們給「1」的長度時纔會出現結果。但是,給1的長度是不合邏輯的。BollingerBand - rolling_mean - 長度號碼

dataframe = pd.DataFrame(data = speed) 
length=2  
def bbands(data, length, numsd=2):  
    ave = pd.stats.moments.rolling_mean(data,length)  
    sd = pd.stats.moments.rolling_std(data,length)  
    upband = ave + (sd*2)  
    dnband = ave - (sd*2)  
    print 'ave:', ave  
    print 'sd:', sd  
    print np.round(ave,3), np.round(upband,3), np.round(dnband,3)  

print bbands(dataframe, length=10, numsd=1)  
print speed  
dataframe['ave'], dataframe['upper'], dataframe['lower'] = bbands(dataframe, length, numsd=1)  
dataframe.plot() 

當我參加任何數字而不是「1」的長度時,「ave」的計算結果如下。 (I得到3至長度,如果我增加長度數,爲NaN的數量也增加)

[1440 rows x 1 columns]   0 
0  NaN 
1  NaN 
2 92.250 
3 92.254 
4 92.459 
5 93.639 
6 94.250 
..... 

回答

1

它出現第length - 1rolling_meanrolling_std返回NaN。這是有道理的,因爲它一次調用這些值的值爲length。您可以從生成的數據幀中篩選出NaN

ave = pd.stats.moments.rolling_mean(data,length) 
ave = ave.dropna() 

sd = pd.stats.moments.rolling_std(data,length) 
sd = sd.dropna() 
+0

我應該刪除NaN以繪製上限和下限嗎? @elsherbini – serenade