Есть ли простой способ в python экстраполировать точки данных в будущее?

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

>>> 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 = объем работы, которую нужно выполнить», поэтому у меня есть уже выполненные спринты, и я хочу визуализировать будущие спринты. уйдет, если текущая ситуация сохранится. И напоследок хочу предсказать дату выхода. Таким образом, природа «объема работы, которую необходимо выполнить», такова, что он всегда уменьшается на диаграммах выгорания. Также я хочу получить экстраполированную дату выпуска: дату, когда объем станет равным нулю.

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


person maplpro    schedule 21.10.2009    source источник
comment
Когда вы искали статистику Python, что вы нашли? Есть вопросы по любому из найденных вами статистических пакетов?   -  person S.Lott    schedule 21.10.2009
comment
Трудно говорить о какой-либо экстраполяции, не зная природы рассматриваемых данных. Вышеупомянутое, насколько можно понять, может быть чем угодно (не исключая случайных значений), так что говорить о каком-либо практическом подходе было бы просто предположением. Уточните вопрос.   -  person Rook    schedule 23.10.2009
comment
ты абсолютно прав! изысканный.   -  person maplpro    schedule 24.10.2009


Ответы (4)


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

альтернативный текст

""" 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 говорит: "Поведение классов FITPACK в scipy.interpolate намного сложнее, чем можно было бы предположить из документов» - imho верно и для других документов по программному обеспечению.

person denis    schedule 23.10.2009
comment
Интерполяция — это не экстраполяция, и наоборот. - person tagoma; 14.06.2015

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

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

person Eric O Lebigot    schedule 21.10.2009

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

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

person ty812    schedule 21.10.2009
comment
абсолютно согласен, понимаю это, но хочу уточнить, я просто проверяю, есть ли случайно функция numpy.extrapolate, с аргументом выберите метод экстраполяции :) Вот почему я называю это низко висящими фруктами - person maplpro; 21.10.2009

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

Например: переведите даты в значения x и используйте первый день как x = 0 для вашей задачи, значения должны быть примерно (0,1,2), (400,1,8), (900,5,3)

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

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

person Luka Rahne    schedule 21.10.2009