2009-10-21 2 views
8

У меня есть простой массив numpy, для каждой даты есть точка данных. Что-то вроде этого:Есть ли простой способ в python экстраполировать данные в будущее?

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

Есть простой способ экстраполировать точки данных в будущее: дата (2008,5,1), дата (2008, 5, 20) и т.д.? Я понимаю, что это можно сделать с помощью математических алгоритмов. Но здесь я ищу какие-то низкие висячие фрукты. На самом деле мне нравится то, что делает numpy.linalg.solve, но оно не выглядит применимым для экстраполяции. Может быть, я абсолютно ошибаюсь.

На самом деле, чтобы быть более конкретным, я создаю схему сжигания (термин xp): 'x = дата и y = объем выполняемой работы', поэтому у меня есть уже сделанные спринты, и я хочу визуализировать как будущие спринты будут идти, если текущая ситуация сохранится. И, наконец, я хочу предсказать дату выпуска. Таким образом, характер «объема работы, который предстоит выполнить», он всегда опускается на сжигание карт. Также я хочу получить экстраполированную дату релиза: дата, когда объем становится равным нулю.

Это все, что нужно показать команде разработчиков, как все идет. Точность здесь не так важна :) Мотивация команды разработчиков - главный фактор. Это означает, что я абсолютно согласен с очень приблизительной методикой экстраполяции.

+1

Когда вы открыли для поиска «статистика python», что вы нашли? Какие-либо вопросы по любому из найденных статистических пакетов? –

+0

Трудно говорить о какой-либо экстраполяции, не зная природы данных. Выше, насколько можно видеть, может быть что угодно (не исключая случайные значения), поэтому говорить о каком-либо практическом подходе было бы просто размышлять. Уточните вопрос. – Rook

+0

Вы абсолютно правы! утонченный. – maplpro

ответ

16

Слишком легко экстраполяция для создания мусора; попробуй это. Возможно много разных экстраполяций; некоторые из них производят очевидный мусор, некоторые неочевидные мусора, многие не определены.

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

Добавлено: а Scipy ticket говорит, «Поведение классов FITPACK в scipy.interpolate является гораздо более сложным, чем документы приведет к мысли» - имхо верно в другой программный документ.

+0

Очень хороший пример! Спасибо! – maplpro

+0

Интерполяция не экстраполируется, а наоборот. – tagoma

3

Математические модели - путь в этом случае. Например, если у вас есть только три точки данных, у вас нет абсолютно никаких указаний о том, как будет развиваться тренд (может быть любая из двух парабол.)

Получите некоторые курсы статистики и попытайтесь реализовать алгоритмы. Попробуйте Wikibooks.

+0

абсолютно согласен, не понимаю, но хочу уточнить, я просто проверяю, есть ли функция numpy.extrapolate уже на месте, с аргументом «выберите метод экстраполяции» :) Вот почему я называю это «низко висящие фрукты» – maplpro

1

Вы должны указать, какую функцию вам нужна экстраполяция. Чем вы можете использовать регрессию http://en.wikipedia.org/wiki/Regression_analysis, чтобы найти параметр функции. И экстраполируйте это в будущем.

Например: перевод даты в значение х и использовать первый день, когда х = 0 для вашей задачи значения Шоуло быть aproximatly (0,1.2), (400,1.8), (900,5.3)

Теперь вы решили, что его точки лежит на функции типа а + б х + с х^2

Используйте метод наименьших squers найти, б и http://en.wikipedia.org/wiki/Linear_least_squares (я предоставит полный источник , но позже, beacuase у меня нет на это времени)

4

Простым способом выполнения экстраполяции является использование интерполирующих полиномов или сплайнов: для этого в scipy.interpolate существует множество подпрограмм, и их достаточно просто использовать (просто дайте (x, y) точки, и вы получите функцию [ вызываемый, точно]).

Теперь, как указано в этой теме, вы не можете ожидать, что экстраполяция будет всегда значимой (особенно если вы далеки от своих точек данных), если у вас нет модели для ваших данных. Тем не менее, я призываю вас сыграть с полиномиальными или сплайновыми интерполяциями из scipy.interpolate, чтобы узнать, соответствуют ли вам результаты.

+0

как это, определенно собирается попробовать, спасибо большое! – maplpro