2009-10-21 262 views
8

Tengo una matriz numpy simple, para cada fecha hay un punto de datos. Algo como esto:¿Hay manera fácil en Python para extrapolar los puntos de datos al futuro?

>>> import numpy as np 
>>> from datetime import date 
>>> from datetime import date 
>>> x = np.array([(date(2008,3,5), 4800), (date(2008,3,15), 4000), (date(2008,3, 
20), 3500), (date(2008,4,5), 3000) ]) 

¿Hay manera fácil extrapolar puntos de datos para el futuro: la fecha (2008,5,1), fecha (2008, 5, 20), etc? Entiendo que se puede hacer con algoritmos matemáticos. Pero aquí estoy buscando algo de fruta baja. En realidad, me gusta lo que hace numpy.linalg.solve, pero no parece aplicable para la extrapolación. Quizás estoy absolutamente equivocado.

En realidad, para ser más específico, estoy construyendo un gráfico de quemaduras (término xp): 'x = date and y = volumen de trabajo por hacer', así que tengo los sprints ya realizados y quiero visualizar cómo funcionarán los sprints futuros si la situación actual persiste. Y finalmente quiero predecir la fecha de lanzamiento. Por lo tanto, la naturaleza del "volumen de trabajo por hacer" es que siempre baja en los gráficos de quemado. También quiero obtener la fecha de lanzamiento extrapolada: fecha en que el volumen se vuelve cero.

Esto es todo para mostrar al equipo de desarrollo cómo van las cosas. La precisión no es tan importante aquí :) La motivación del equipo de desarrollo es el factor principal. Eso significa que estoy absolutamente bien con la técnica de extrapolación muy aproximada.

+1

Cuando buscó en Google para "estadísticas de python", ¿qué encontró? ¿Alguna pregunta sobre alguno de los paquetes estadísticos que encontraste? –

+0

Es difícil hablar de extrapolación, sin conocer la naturaleza de los datos en cuestión. Lo anterior, hasta donde se puede ver, podría ser cualquier cosa (sin excluir los valores aleatorios), por lo que hablar de cualquier enfoque práctico sería solo especular. Refina la pregunta – Rook

+0

¡tienes toda la razón! refinado. – maplpro

Respuesta

16

Es muy fácil extrapolar para generar basura; prueba esto. Muchas extrapolaciones diferentes son por supuesto posibles; algunos producen basura obvia, algunos basura no obvia, muchos están mal definidos.

alt text http://i39.tinypic.com/am62wp.png

""" extrapolate y,m,d data with scipy UnivariateSpline """ 
import numpy as np 
from scipy.interpolate import UnivariateSpline 
    # pydoc scipy.interpolate.UnivariateSpline -- fitpack, unclear 
from datetime import date 
from pylab import * # ipython -pylab 

__version__ = "denis 23oct" 


def daynumber(y,m,d): 
    """ 2005,1,1 -> 0 2006,1,1 -> 365 ... """ 
    return date(y,m,d).toordinal() - date(2005,1,1).toordinal() 

days, values = np.array([ 
    (daynumber(2005,1,1), 1.2), 
    (daynumber(2005,4,1), 1.8), 
    (daynumber(2005,9,1), 5.3), 
    (daynumber(2005,10,1), 5.3) 
    ]).T 
dayswanted = np.array([ daynumber(year, month, 1) 
     for year in range(2005, 2006+1) 
     for month in range(1, 12+1)]) 

np.set_printoptions(1) # .1f 
print "days:", days 
print "values:", values 
print "dayswanted:", dayswanted 

title("extrapolation with scipy.interpolate.UnivariateSpline") 
plot(days, values, "o") 
for k in (1,2,3): # line parabola cubicspline 
    extrapolator = UnivariateSpline(days, values, k=k) 
    y = extrapolator(dayswanted) 
    label = "k=%d" % k 
    print label, y 
    plot(dayswanted, y, label=label ) # pylab 

legend(loc="lower left") 
grid(True) 
savefig("extrapolate-UnivariateSpline.png", dpi=50) 
show() 

ha añadido: a Scipy ticket dice, "El comportamiento de las clases FitPack en scipy.interpolate es mucho más compleja que la documentación nos llevaría a creer" - en mi humilde opinión verdadera de otro software doc también.

+0

¡muy buen ejemplo! ¡gracias! – maplpro

+0

La interpolación no se extrapola, y viceversa. – tagoma

3

Los modelos matemáticos son el camino a seguir en este caso. Por ejemplo, si solo tiene tres puntos de datos, no puede tener absolutamente ninguna indicación sobre cómo se desarrollará la tendencia (podría ser cualquiera de dos parábolas).

Obtenga algunos cursos de estadísticas e intente implementar los algoritmos. Pruebe Wikibooks.

+0

estoy totalmente de acuerdo, entiéndelo pero quiero aclararlo, solo estoy verificando si por casualidad hay una función numpy.extrapolate ya en su lugar, con el argumento "elegir el método de extrapolación" :) Por eso la llamo "fruta colgante" – maplpro

1

Tiene que especificar qué función necesita extrapolación. Que puede usar la regresión http://en.wikipedia.org/wiki/Regression_analysis para encontrar parámetros de la función. Y extrapola esto en el futuro.

Por ejemplo: traducen fechas en valores de x y utilizar primer día cuando x = 0 para su problema de los valores shoul ser aproximatly (0,1.2), (400,1.8), (900,5.3)

Ahora usted decide que sus puntos se encuentra en función del tipo de a + b x + c x^2

Utilice el método de los mínimos squers para encontrar a, b y c http://en.wikipedia.org/wiki/Linear_least_squares (proporcionaré fuente completo , pero más tarde, por favor, no tengo tiempo para esto)

4

Una forma simple de hacer extrapolaciones es usar polinomios de interpolación o splines: hay muchas rutinas para esto en scipy.interpolate, y son bastante fáciles de usar (solo da los puntos (x, y), y obtienes una función [ un llamable, precisamente]).

Ahora, como se señaló en este hilo, no puede esperar que la extrapolación sea siempre significativa (especialmente cuando está lejos de sus puntos de datos) si no tiene un modelo para sus datos. Sin embargo, te animo a jugar con las interpolaciones polinomiales o spline de scipy.interpolate para ver si los resultados que obtienes te convienen.

+0

así, definitivamente voy a intentar, ¡muchas gracias! – maplpro

Cuestiones relacionadas