Domanda

Ho un semplice array NumPy, per ogni data c'è un punto di dati. Qualcosa di simile a questo:

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

C'è modo semplice estrapolare punti dati per il futuro: data (2008,5,1), la data (2008, 5, 20), ecc? Capisco che può essere fatto con algoritmi matematici. Ma qui sto cercando per un po 'di frutta a basso impiccagione. In realtà mi piace quello che numpy.linalg.solve fa, ma non guardo applicabile per l'estrapolazione. Forse sono assolutamente sbagliato.

In realtà per essere più precisi Sto costruendo un grafico burn-down (xp termine): 'x = data e il volume y = del lavoro da fare', così ho preso le volate già fatto e voglio visualizzare come i futuri sprint andranno se la situazione attuale persiste. E infine voglio prevedere la data di uscita. Così la natura del 'volume di lavoro da fare' è si va sempre verso il basso sui grafici burn-down. Anche io voglio ottenere la data di uscita estrapolato: data in cui il volume diventa zero

.

Questo è tutto per mostrare al Dev Team come vanno le cose. La precisione non è così importante qui :) La motivazione del team di sviluppo è il fattore principale. Ciò significa che io sono assolutamente bene con la tecnica molto approssimativa estrapolazione.

È stato utile?

Soluzione

E 'fin troppo facile per l'estrapolazione di generare rifiuti; prova questo. Molti estrapolazioni diverse sono naturalmente possibili; alcuni producono evidenti spazzatura, alcuni rifiuti non ovvio, sono mal definiti molti.

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

Aggiunto: un biglietto SciPy dice, "Il comportamento delle classi FITPACK in scipy.interpolate è molto più complessa di quanto la documentazione porterebbe a credere" - imho vero di altri doc software troppo.

Altri suggerimenti

Un modo semplice di fare estrapolazioni è quello di utilizzare l'interpolazione polinomi o spline: ci sono molte routine per questo in scipy.interpolate , e ci sono abbastanza facili da usare (basta dare il x, y) (punti, e si ottiene una funzione [a callable, appunto]).

Ora, per quanto come stato sottolineato in questa discussione, non si può pretendere l'estrapolazione di essere sempre significativa (soprattutto quando si è lontano dai vostri punti di dati) se non si dispone di un modello per i dati. Tuttavia, vi incoraggio a giocare con le interpolazioni polinomiali o spline da scipy.interpolate per vedere se i risultati si ottiene si adattano.

I modelli matematici sono la strada da percorrere in questo caso. Per esempio, se si dispone di solo tre punti di dati, si può avere assolutamente alcuna indicazione su come la tendenza si snoderà (potrebbe essere uno qualsiasi dei due parabola.)

Ottenere alcuni corsi di statistica e cercare di implementare gli algoritmi. Prova Wikibooks .

Si deve swpecify su cui funzione è necessario estrapolazione. Di quanto si può usare la regressione http://en.wikipedia.org/wiki/Regression_analysis da trovare paratmeters di funzione. Ed estrapolare questo in futuro.

Per esempio: tradurre date in valori x e utilizzare primo giorno da x = 0 per il vostro problema dei valori Shoul essere aproximatly (0,1.2), (400,1.8), (900,5.3)

Ora si decide che i suoi punti si trova sulla funzione del tipo a + b x + c x ^ 2

Utilizzare il metodo dei minimi squers per trovare una, B e C http://en.wikipedia.org/wiki/Linear_least_squares (Fornirò sorgente completo, ma più tardi, beacuase non ho tempo per questo)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top