2011-04-01 23 views
11

tengo algunos datos en Python que es unixtime, valor:Python suave de series temporales de datos

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

Tiempo pasos constantemente por un segundo. ¿Cómo puedo reducir estos datos para que la marca de tiempo sea cada segundo, pero el valor es el promedio de los 10 valores que lo rodean?

Los promedios móviles fanáticos también serían buenos, pero estos datos están graficados, por lo que es principalmente para suavizar el gráfico.

Seguimiento de (TSQL Rolling Average of Time Groupings después de llegar a la conclusión de que intentar hacer esto en SQL es una ruta de dolor).

Respuesta

14

Usando 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] 

consigo lo que parece ser buenos resultados con (No es que yo entiendo las matemáticas):

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

que parece razonable. Si quieres la media, entonces tu ventana debe ser "plana". Los otros protocolos de ventanas ponderan los puntos de datos en la ventana de forma diferente. – JoshAdel

Cuestiones relacionadas