2009-10-21 11 views
8

Ho una matrice numpy semplice, per ogni data c'è un punto dati. Qualcosa di simile a questo:C'è un modo semplice in Python per estrapolare i punti dati nel 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) ]) 

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

In realtà per essere più specifico sto costruendo un grafico di burn-down (termine xp): 'x = date e y = volume di lavoro da fare', quindi ho ottenuto gli sprint già fatti e voglio visualizzare come andranno i futuri sprint se persiste la situazione attuale. E infine voglio pronosticare la data di rilascio. Quindi la natura del "volume di lavoro da fare" è sempre inferiore ai grafici di burn-down. Inoltre voglio ottenere la data di rilascio estrapolata: data in cui il volume diventa zero.

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

+1

Quando cercavi su google "statistiche python" cosa hai trovato? Hai domande su uno dei pacchetti statistici che hai trovato? –

+0

È difficile parlare di estrapolazione, senza conoscere la natura dei dati in questione. Quanto sopra, per quanto si possa vedere, potrebbe essere qualsiasi cosa (non escludendo i valori casuali), quindi parlare di qualsiasi approccio pratico sarebbe solo una speculazione. Affina la domanda. – Rook

+0

hai assolutamente ragione! raffinato. – maplpro

risposta

16

È troppo facile estrapolare generare rifiuti; prova questo. Naturalmente diverse estrapolazioni sono possibili; alcuni producono immondizia evidente, alcuni rifiuti non ovvi, molti sono mal definiti.

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

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

+0

ottimo esempio! grazie! – maplpro

+0

L'interpolazione non sta estrapolando e viceversa. – tagoma

3

I modelli matematici sono la strada da percorrere in questo caso. Ad esempio, se hai solo tre punti dati, non puoi assolutamente avere indicazioni su come si svilupperà la tendenza (potrebbe essere una qualsiasi delle due parabole.)

Ottieni alcuni corsi di statistica e prova ad implementare gli algoritmi. Prova Wikibooks.

+0

assolutamente d'accordo, capisco ma voglio chiarire, sto solo verificando se per caso ci sia la funzione numpy.extrapolate già presente, con argomento "scegli il metodo di estrapolazione" :) Ecco perché lo chiamo "low hanging fruit" – maplpro

1

Devi specificare swpecify su quale funzione hai bisogno di estrapolazione. Quindi è possibile utilizzare la regressione http://en.wikipedia.org/wiki/Regression_analysis per trovare parametri di funzionamento. E estrapolarlo 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 di trovare a, b e c http://en.wikipedia.org/wiki/Linear_least_squares (fornirò sorgente completo , ma dopo, beacuase non ho tempo per questo)

4

Un modo semplice per eseguire estrapolazioni è utilizzare polinomi o spline interpolanti: ci sono molte routine per questo in scipy.interpolate, e ci sono abbastanza facili da usare (basta dare i punti (x, y) e si ottiene una funzione [ un callable, precisamente]).

Ora, come indicato in questa discussione, non è possibile aspettarsi che l'estrapolazione sia sempre significativa (specialmente quando si è lontani dai punti dati) se non si dispone di un modello per i dati. Tuttavia, ti incoraggio a giocare con le interpolazioni polinomiali o spline da scipy.interpolate per vedere se i risultati ti si addicono.

+0

così, sicuramente ci proverò, grazie mille! – maplpro

Problemi correlati