2009-10-21 13 views
8

Ich habe ein einfaches numpy-Array, für jedes Datum gibt es einen Datenpunkt. Etwas wie folgt aus:Gibt es in Python einen einfachen Weg, Datenpunkte in die Zukunft zu extrapolieren?

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

Gibt es einfache Möglichkeit, Datenpunkte in die Zukunft zu extrapolieren: Datum (2008,5,1), Datum (2008, 5, 20) etc? Ich verstehe, dass es mit mathematischen Algorithmen gemacht werden kann. Aber hier suche ich nach etwas tief hängenden Früchten. Eigentlich gefällt mir, was numpy.linalg.solve macht, aber es scheint für die Extrapolation nicht anwendbar zu sein. Vielleicht liege ich absolut falsch.

Um genauer zu sein, ich baue ein Burn-Down-Diagramm (xp Begriff): "x = Datum und y = Volumen der Arbeit zu tun", so habe ich die bereits durchgeführten Sprints und ich möchte visualisieren wie die zukünftigen Sprints gehen werden, wenn die aktuelle Situation anhält. Und schließlich möchte ich das Veröffentlichungsdatum vorhersagen. Die Art von "zu bewältigender Arbeitsmenge" ist also immer auf Burn-Down-Charts zurückzuführen. Ich möchte auch das extrapolierte Veröffentlichungsdatum erhalten: Datum, an dem das Volumen zu Null wird.

Das ist alles, um dem Entwicklerteam zu zeigen, wie es läuft. Die Genauigkeit ist hier nicht so wichtig :) Die Motivation des Entwicklerteams ist der Hauptfaktor. Das bedeutet, dass mir die approximative Extrapolationstechnik absolut recht ist.

+1

Wenn Sie für "Statistik Python" gegoogled was haben Sie gefunden? Haben Sie Fragen zu einem der statistischen Pakete, die Sie gefunden haben? –

+0

Es ist schwierig, über eine Extrapolation zu sprechen, ohne die Art der fraglichen Daten zu kennen. Das Obige kann, soweit man sehen kann, alles sein (ohne zufällige Werte auszuschließen), so dass man über irgendeinen praktischen Ansatz spekulieren könnte. Verfeinere die Frage. – Rook

+0

Sie haben absolut Recht! raffiniert. – maplpro

Antwort

16

Es ist allzu einfach für die Extrapolation, Müll zu erzeugen; Versuche dies. Viele verschiedene Extrapolationen sind natürlich möglich; einige produzieren offensichtlichen Müll, einige nicht offensichtliche Müll, viele sind schlecht definiert.

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

hinzugefügt: a Scipy ticket sagt, "Das Verhalten der Fitpack Klassen in scipy.interpolate ist viel komplexer als die Dokumentation einer würde glauben" - imho gilt für andere Software doc auch.

+0

sehr gutes Beispiel! Danke! – maplpro

+0

Interpolieren ist nicht extrapolieren, und umgekehrt. – tagoma

3

Die mathematischen Modelle sind in diesem Fall die richtige Wahl. Wenn Sie beispielsweise nur drei Datenpunkte haben, können Sie absolut keinen Hinweis darauf haben, wie der Trend sich entfaltet (könnte eine von zwei Parabeln sein).

Erhalten Sie einige Statistikkurse und versuchen Sie, die Algorithmen zu implementieren. Versuchen Sie Wikibooks.

+0

stimme absolut zu, verstehe es aber möchte klären, ich überprüfe gerade, ob durch irgendeinen Zufall die numpy.extrapolate-Funktion bereits vorhanden ist, mit Argument "Extrapolationsmethode wählen" :) Deshalb nenne ich es "tief hängende Frucht" – maplpro

1

Sie müssen angeben, über welche Funktion Sie eine Extrapolation durchführen müssen. Dann können Sie Regression http://en.wikipedia.org/wiki/Regression_analysis verwenden, um Paratmeter der Funktion zu finden. Und extrapoliere das in Zukunft.

Zum Beispiel: Daten in x-Werte übersetzen und ersten Tag verwendet als x = 0 für Ihr Problem shoul die Werte aproximatly seine (0,1.2), (400,1.8), (900,5.3)

Jetzt können Sie entscheiden, dass seine Punkte liegt auf Funktion vom Typ a + b x + c x^2

Verwenden Sie die Methode der kleinsten squers a, b und c http://en.wikipedia.org/wiki/Linear_least_squares (i volle Quelle liefert zu finden , aber später, weil ich keine Zeit dafür habe)

4

Eine einfache Möglichkeit, Extrapolationen zu machen, ist die Verwendung interpolierender Polynome oder Splines: Es gibt viele Routinen dafür in scipy.interpolate, und es sind ziemlich einfach zu verwenden (geben Sie einfach die (x, y) Punkte, und Sie erhalten eine Funktion [ ein aufrufbar, genau]).

Nun, wie in diesem Thread gezeigt, können Sie nicht erwarten, dass die Extrapolation immer aussagekräftig ist (insbesondere wenn Sie weit von Ihren Datenpunkten entfernt sind), wenn Sie kein Modell für Ihre Daten haben. Ich ermutige Sie jedoch, mit den Polynom- oder Spline-Interpolationen von scipy.interpolate zu spielen, um zu sehen, ob die Ergebnisse, die Sie erhalten, zu Ihnen passen.

+0

so, auf jeden Fall versuchen, vielen Dank! – maplpro