¿Hay manera fácil en Python a puntos de datos extrapolar el futuro?
-
22-09-2019 - |
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.
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.
""" 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)