2009-10-21 13 views
8

Mam prostą tablicę numpy, dla każdej daty jest punkt danych. Coś takiego:Czy w pytonie można łatwo ekstrapolować punkty danych do przyszłości?

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

Czy istnieje prosty sposób ekstrapolować punktów danych na przyszłość: data (2008,5,1), data (2008, 5, 20) itp? Rozumiem, że można to zrobić za pomocą algorytmów matematycznych. Ale tutaj szukam jakiegoś niskiego wiszącego owocu. Właściwie to lubię to, co robi numpy.linalg.solve, ale nie nadaje się do ekstrapolacji. Może jestem absolutnie zły.

Właściwie bardziej konkretnie buduję wykres wypalania (termin xp): "x = data i y = objętość pracy do wykonania", więc mam już wykonane sprinty i chcę wizualizować jak pójdą przyszłe sprinty, jeśli obecna sytuacja się utrzyma. I na koniec chcę przewidzieć datę premiery. Tak więc charakter "ilości pracy do zrobienia" jest zawsze obniżany na wykresach spalania. Również chcę uzyskać ekstrapolowaną datę wydania: data, kiedy objętość staje się zero.

To wszystko po to, aby pokazać zespołowi programistów, jak to wszystko wygląda. Dokładność nie jest tu tak ważna :) Głównym czynnikiem jest motywacja zespołu deweloperskiego. Oznacza to, że jestem absolutnie w porządku z bardzo przybliżoną techniką ekstrapolacji.

+1

Podczas wyszukiwania w "Pythonie statystyk" co znalazłeś? Masz pytania na temat któregokolwiek z znalezionych pakietów statystycznych? –

+0

Trudno mówić o jakiejkolwiek ekstrapolacji, nie znając charakteru danych, o których mowa. Powyższe, o ile można zobaczyć, może być dowolne (nie wyłączając wartości losowych), więc mówienie o jakiejkolwiek praktycznej metodzie byłoby po prostu spekulacją. Uściślij pytanie. – Rook

+0

masz absolutną rację! rafinowany. – maplpro

Odpowiedz

16

Zbyt łatwo ekstrapolacja generuje śmieci; Spróbuj tego. Oczywiście możliwe są różne ekstrapolacje; Niektóre produkują oczywiste śmieci, niektóre nieoczywiste śmieci, wiele z nich jest źle zdefiniowanych.

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

Dodany: a Scipy ticket mówi "Zachowanie klas FITPACK w scipy.interpolate jest dużo bardziej skomplikowana niż docs doprowadziłoby do jednego wierzyć" - imho prawdą także inny dokument programowy.

+0

bardzo dobry przykład! Dziękuję Ci! – maplpro

+0

Interpolacja nie jest ekstrapolacją, a odwrotnie. – tagoma

3

Modele matematyczne są drogą do zrobienia w tym przypadku. Na przykład, jeśli masz tylko trzy punkty danych, nie możesz mieć absolutnie żadnego wskazania, jak trend się rozwinie (może to być dowolna z dwóch paraboli.)

Weź udział w kursach statystycznych i spróbuj wdrożyć algorytmy. Wypróbuj Wikibooks.

+0

absolutnie się zgadzam, rozumiem, ale chcę wyjaśnić, sprawdzam tylko, czy przez jakiś czas istnieje już funkcja numpy.extrapolate, z argumentem "wybierz metodę ekstrapolacji" :) Dlatego nazywam ją "niskim wiszącym owocem" – maplpro

1

Należy określić, która funkcja wymaga ekstrapolacji. Niż można użyć regresji http://en.wikipedia.org/wiki/Regression_analysis, aby znaleźć paratyometry funkcji. I ekstrapoluj to w przyszłości.

Na przykład: przełożyć termin do wartości x i używać pierwszy dzień jako x = 0 dla swojego problemu wartości shoul być aproximatly (0,1.2), (400,1.8), (900,5.3)

teraz zdecydować, że jego punkty leży na funkcję typu a + b x + c x^2

pomocą metody najmniejszych squers znaleźć a, b i c http://en.wikipedia.org/wiki/Linear_least_squares (podam pełny źródłowym , ale później, beacuase, nie mam na to czasu)

4

Prostym sposobem wykonywania ekstrapolacji jest użycie interpolujących wielomianów lub splajnów: jest w tym wiele rutynowych czynności w scipy.interpolate, a są one dość łatwe w użyciu (wystarczy podać punkty (x, y), a otrzymasz funkcję [ podpowiedź, dokładnie]).

Teraz, jak wskazano w tym wątku, nie można oczekiwać, że ekstrapolacja będzie zawsze znacząca (szczególnie, gdy jesteś daleko od punktów danych), jeśli nie masz modelu dla swoich danych. Zachęcam jednak do gry z interpolacjami wielomianu lub splajnu z scipy.interpolate, aby sprawdzić, czy otrzymane wyniki są odpowiednie dla ciebie.

+0

tak, zdecydowanie spróbuję, wielkie dzięki! – maplpro

Powiązane problemy