Pergunta

Eu tenho uma matriz Numpy simples, para cada data, há um ponto de dados. Algo assim:

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

Existe uma maneira fácil de extrapolar os pontos de dados para o futuro: Date (2008,5,1), DATE (2008, 5, 20) etc? Eu entendo que isso pode ser feito com algoritmos matemáticos. Mas aqui estou procurando algumas frutas baixas. Na verdade, eu gosto do que Numpy.linalg.solve faz, mas não parece aplicável à extrapolação. Talvez eu esteja absolutamente errado.

Na verdade, para ser mais específico, estou construindo um gráfico de queimadura (termo xp): 'x = data e y = volume de trabalho a ser feito', então eu já fiz os sprints e quero visualizar como os futuros sprints irá se a situação atual persistir. E, finalmente, quero prever a data de lançamento. Portanto, a natureza do 'volume de trabalho a ser feita' é que sempre se abaixa nos gráficos queimados. Também quero obter a data de lançamento extrapolada: data em que o volume se tornar zero.

Isso é tudo para mostrar à equipe de desenvolvimento como as coisas vão. A precisão não é tão importante aqui :) A motivação da equipe de desenvolvimento é o principal fator. Isso significa que estou absolutamente bem com a técnica de extrapolação muito aproximada.

Foi útil?

Solução

É muito fácil para extrapolação para gerar lixo; tente isso. É claro que muitas extrapolações diferentes são possíveis; Alguns produzem lixo óbvio, outros lixo não óbvios, muitos são 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()

Adicionado: a Ticket Scipy diz: "O comportamento das classes Fitpack no Scipy.Interpolate é muito mais complexo do que os documentos levariam a acreditar" - IMHO também para outro documento de software.

Outras dicas

Uma maneira simples de fazer extrapolações é usar polinômios ou splines interpolando: existem muitas rotinas para isso em scipy.interpolate, e há muito fácil de usar (basta dar os pontos (x, y) e você obtém uma função [um chamável, com precisão]).

Agora, como foi apontado neste tópico, você não pode esperar que a extrapolação seja sempre significativa (especialmente quando você está longe de seus pontos de dados) se não tiver um modelo para seus dados. No entanto, encorajo você a brincar com as interpolações polinomiais ou splines da Scipy.Interpolate para ver se os resultados que você obtém adequados a você.

Os modelos matemáticos são o caminho a seguir neste caso. Por exemplo, se você tiver apenas três pontos de dados, pode não ter absolutamente nenhuma indicação sobre como a tendência se desenrolará (pode ser uma das duas parábolas.)

Obtenha alguns cursos de estatística e tente implementar os algoritmos. Tentar Wikibooks.

Você precisa varrer qual função você precisa de extrapolação. Do que você pode usar a regressão http://en.wikipedia.org/wiki/regression_analysis para encontrar paratmeters de função. E extrapolar isso no futuro.

Por exemplo: traduzir datas em valores x e usar o primeiro dia como x = 0 para o seu problema, os valores são aproximando (0,1.2), (400,1,8), (900,5.3)

Agora você decide que os pontos dele estão em função do tipo A+Bx+cx^2

Use o método de mínimos spers para encontrar A, B e Chttp://en.wikipedia.org/wiki/linear_least_squares(Vou fornecer uma fonte completa, mas mais tarde, beacase eu não tenho tempo para isso)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top