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

Я думаю, что это своего рода наследие от старых версий операционных систем Microsoft, где буквы A и B были назначены для дисковода гибких дисков.

9
задан denis 25 October 2013 в 10:13
поделиться

4 ответа

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

alt text

""" 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 намного сложнее, чем можно было бы представить в документации "- imho верно и для других программных документов.

17
ответ дан 4 December 2019 в 08:33
поделиться

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

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

4
ответ дан 4 December 2019 в 08:33
поделиться

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

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

3
ответ дан 4 December 2019 в 08:33
поделиться

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

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

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

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

1
ответ дан 4 December 2019 в 08:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: