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

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

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

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

4 ответов


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

alt текст 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()

добавлено: a билет Scipy говорит, "Поведение классов FITPACK в составляющей.интерполяция намного сложнее, чем можно было бы предположить из документов" -- имхо верно для других программное обеспечение doc тоже.


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

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


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

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


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

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

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

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