Pregunta

Tengo una matriz simple numpy, para cada fecha no es un punto de datos. Algo como esto:

>>> 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 de puntos de datos extrapolar el futuro: la fecha (2008,5,1), fecha (2008, 5, 20), etc? Tengo entendido que se puede hacer con algoritmos matemáticos. Pero aquí estoy buscando por alguna fruta madura. De hecho, me gusta lo numpy.linalg.solve hace, pero no se ve aplicable para la extrapolación. Tal vez estoy totalmente equivocado.

En realidad, para ser más específicos Estoy construyendo un gráfico quema abajo (término XP): 'x = fecha y y = volumen de trabajo por hacer', por lo que han conseguido las pruebas de velocidad ya se ha realizado y quiero visualizar cómo las futuras carreras irán si persiste la situación actual. Y por último quiero predecir la fecha de lanzamiento. Por lo que la naturaleza del 'volumen de trabajo por hacer' es que siempre va hacia abajo en los gráficos de quemaduras hacia abajo. También quiero obtener la fecha de lanzamiento extrapolada: fecha en la que el volumen se convierte en cero

.

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

¿Fue útil?

Solución

Es muy fácil para la extrapolación para generar la basura; prueba esto. Muchos extrapolaciones diferentes supuesto, son posibles; algunos productos basura obvia, un poco de basura no evidente, muchos están mal definidos.

alt text

""" 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()

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

Otros consejos

Una forma sencilla de hacerlo es utilizar extrapolaciones interpolación de polinomios o estrías: hay muchas rutinas para esto en scipy.interpolate , y no son muy fáciles de usar (sólo dar los puntos x, y) (y se obtiene una función [a exigible, precisamente]).

Ahora, como ya ha señalado en este hilo, no se puede esperar la extrapolación de estar siempre significativa (sobre todo cuando se está lejos de los puntos de datos) si no tiene un modelo para sus datos. Sin embargo, le animo a jugar con las interpolaciones polinómicas o spline de scipy.interpolate para ver si los resultados que obtenga le conviene.

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

Obtener algunos cursos de estadística y tratar de poner en práctica los algoritmos. Prueba a Wikilibros .

Hay que swpecify sobre qué función necesita extrapolación. De lo que puede utilizar la regresión http://en.wikipedia.org/wiki/Regression_analysis para encontrar paratmeters de la función. Y extrapolar esto en el futuro.

Por ejemplo: traducir las 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 mentiras 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, beacuase no tengo tiempo para esto)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top