Frage

Ich habe eine einfache numpy Array, für jeden Tag gibt es einen Datenpunkt. So etwas wie folgt aus:

>>> 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, zu extrapolieren Datenpunkte in die Zukunft: Datum (2008,5,1), Datum (2008, 5, 20) etc? Ich verstehe, es kann mit mathematischen Algorithmen erfolgen. Aber hier bin ich suche für einige niedrig hängenden Früchte. Eigentlich mag ich, was numpy.linalg.solve ist, aber es sieht nicht anwendbar für die Extrapolation. Vielleicht bin ich absolut falsch.

Eigentlich genauer zu sein Ich baue ein Burn-Down-Diagramm (xp term): ‚x = Datum und y = Volumen der Arbeit zu tun‘, so dass ich die bereits getan Sprint bekommen habe und ich mag zu visualisieren, wie die Zukunft Sprint gehen, wenn die aktuelle Situation fortbesteht. Und schließlich möchte ich das Release-Datum vorherzusagen. So ist die Natur des ‚Arbeitsvolumen zu tun‘ ist es kommt immer auf Burn-Down-Charts. Auch möchte ich die hochgerechneten Veröffentlichungstermin erhalten: Datum, wenn die Lautstärke zu Null

.

Das ist alles für DEV-Team zeigt, wie die Dinge gehen. Die Genauigkeit ist nicht so wichtig, hier :) Die Motivation von Dev Team ist der wichtigste Faktor. Das heißt ich ist absolut in Ordnung mit der sehr ungefähren Extrapolationstechnik.

War es hilfreich?

Lösung

Es ist nur allzu leicht für die Extrapolation Müll zu erzeugen; Versuche dies. Viele verschiedene Fortschreibungen sind natürlich möglich; einige Produkte offensichtlich Müll, einige nicht offensichtliche Müll, viele schlecht definiert.

""" 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: ein Scipy Ticket sagt, „Das Verhalten der Fitpack Klassen in scipy.interpolate ist viel komplexer als die docs würde man führen zu glauben“- imho gilt für andere Software-doc zu.

Andere Tipps

Ein einfacher Weg, Fortschreibungen zu tun ist, Polynome oder Splines verwendet werden interpoliert: Es gibt viele Routinen für diesen in scipy.interpolate , und es gibt ganz einfach zu bedienen (nur geben, die (x, y) Punkte, und Sie eine Funktion erhalten [a aufrufbar, genau]).

Nun, wie in diesem Thread hingewiesen wurde, können Sie die Extrapolation nicht erwarten, immer sinnvoll zu sein (vor allem, wenn Sie weit von Ihren Datenpunkten), wenn Sie nicht ein Modell für Ihre Daten. Aber ich ermutige Sie, mit den Polynom oder Spline-Interpolation von scipy.interpolate zu spielen, ob die Ergebnisse zu sehen bekommen Sie zusagt.

Die mathematischen Modelle sind der Weg in diesem Fall zu gehen. Zum Beispiel, wenn Sie nur drei Datenpunkte haben, können Sie haben absolut keinen Hinweis darauf, wie wird sich entfalten sich der Trend (könnte jeder von zwei Parabel sein.)

Statistiken Kurse und versuchen, die Algorithmen zu implementieren. Versuchen Sie Wikibooks .

Sie haben über swpecify, die Sie Extrapolation müssen funktionieren. Als Sie Regression verwenden http://en.wikipedia.org/wiki/Regression_analysis zu finden paratmeters der Funktion. Und extrapoliert dies in Zukunft.

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

Jetzt entscheiden Sie, dass seine Punkte liegen auf Funktion vom Typ a + b x + c x ^ 2

Verwenden Sie die Methode der kleinsten squers a, b und c finden http://en.wikipedia.org/wiki/Linear_least_squares (I wird die volle Quelle zur Verfügung stellen, aber später, beacuase Ich habe keine Zeit dafür haben)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top