2011-04-01 144 views
11

我有蟒蛇一些數據,是unixtime,值:Python的平穩時間序列數據

[(1301672429, 274), (1301672430, 302), (1301672431, 288)...] 

持續時間一秒幾步之遙。我怎樣才能減少這些數據,所以時間戳是每秒鐘的,但是這個值是周圍10個值的平均值?

Fancier滾動平均值也不錯,但是這個數據是繪圖的,所以它主要是平滑圖形。

後續的(TSQL Rolling Average of Time Groupings後得出結論,試圖在SQL中這樣做是一種痛苦的途徑)。

回答

14

使用http://www.scipy.org/Cookbook/SignalSmooth

import numpy 
def smooth(x,window_len=11,window='hanning'): 
     if x.ndim != 1: 
       raise ValueError, "smooth only accepts 1 dimension arrays." 
     if x.size < window_len: 
       raise ValueError, "Input vector needs to be bigger than window size." 
     if window_len<3: 
       return x 
     if not window in ['flat', 'hanning', 'hamming', 'bartlett', 'blackman']: 
       raise ValueError, "Window is on of 'flat', 'hanning', 'hamming', 'bartlett', 'blackman'" 
     s=numpy.r_[2*x[0]-x[window_len-1::-1],x,2*x[-1]-x[-1:-window_len:-1]] 
     if window == 'flat': #moving average 
       w=numpy.ones(window_len,'d') 
     else: 
       w=eval('numpy.'+window+'(window_len)') 
     y=numpy.convolve(w/w.sum(),s,mode='same') 
     return y[window_len:-window_len+1] 

我得到什麼似乎是(不,我明白了良好的效果數學):

if form_results['smooth']: 
      a = numpy.array([x[1] for x in results]) 
      smoothed = smooth(a,window_len=21) 
      results = zip([x[0] for x in results], smoothed) 
+2

這似乎是合理的。如果你想要的意思是那麼你的窗戶應該'平坦'。其他開窗協議以不同的方式加權窗口中的數據點。 – JoshAdel 2011-04-01 17:00:37