如何在python中创建时间序列数据的线性回归预测

如何在python中创建时间序列数据的线性回归预测,python,Python,我需要能够创建一个python函数,用于基于线性回归模型进行预测,该模型具有时间序列数据的置信区间: 该函数需要使用一个参数来指定要预测的距离。例如,1天、7天、30天、90天等。根据参数,需要创建具有置信带的Holt Winters预测: 我的时间序列数据如下所示: print series [{"target": "average", "datapoints": [[null, 1435688679], [34.870499801635745, 1435688694], [null, 14

我需要能够创建一个python函数,用于基于线性回归模型进行预测,该模型具有时间序列数据的置信区间:

该函数需要使用一个参数来指定要预测的距离。例如,1天、7天、30天、90天等。根据参数,需要创建具有置信带的Holt Winters预测:

我的时间序列数据如下所示:

print series

[{"target": "average", "datapoints": [[null, 1435688679], [34.870499801635745, 1435688694], [null, 1435688709], [null, 1435688724], [null, 1435688739], [null, 1435688754], [null, 1435688769], [null, 1435688784], [null, 1435688799], [null, 1435688814], [null, 1435688829], [null, 1435688844], [null, 1435688859], [null, 1435688874], [null, 1435688889], [null, 1435688904], [null, 1435688919], [null, 1435688934], [null, 1435688949], [null, 1435688964], [null, 1435688979], [38.180000209808348, 1435688994], [null, 1435689009], [null, 1435689024], [null, 1435689039], [null, 1435689054], [null, 1435689069], [null, 1435689084], [null, 1435689099], [null, 1435689114], [null, 1435689129], [null, 1435689144], [null, 1435689159], [null, 1435689174], [null, 1435689189], [null, 1435689204], [null, 1435689219], [null, 1435689234], [null, 1435689249], [null, 1435689264], [null, 1435689279], [30.79849989414215, 1435689294], [null, 1435689309], [null, 1435689324], [null, 1435689339], [null, 1435689354], [null, 1435689369], [null, 1435689384], [null, 1435689399], [null, 1435689414], [null, 1435689429], [null, 1435689444], [null, 1435689459], [null, 1435689474], [null, 1435689489], [null, 1435689504], [null, 1435689519], [null, 1435689534], [null, 1435689549], [null, 1435689564]]}]
该函数应将预测值附加到上述称为“序列”和返回序列的时间序列数据中:

[{"target": "average", "datapoints": [[null, 1435688679], [34.870499801635745, 1435688694], [null, 1435688709], [null, 1435688724], [null, 1435688739], [null, 1435688754], [null, 1435688769], [null, 1435688784], [null, 1435688799], [null, 1435688814], [null, 1435688829], [null, 1435688844], [null, 1435688859], [null, 1435688874], [null, 1435688889], [null, 1435688904], [null, 1435688919], [null, 1435688934], [null, 1435688949], [null, 1435688964], [null, 1435688979], [38.180000209808348, 1435688994], [null, 1435689009], [null, 1435689024], [null, 1435689039], [null, 1435689054], [null, 1435689069], [null, 1435689084], [null, 1435689099], [null, 1435689114], [null, 1435689129], [null, 1435689144], [null, 1435689159], [null, 1435689174], [null, 1435689189], [null, 1435689204], [null, 1435689219], [null, 1435689234], [null, 1435689249], [null, 1435689264], [null, 1435689279], [30.79849989414215, 1435689294], [null, 1435689309], [null, 1435689324], [null, 1435689339], [null, 1435689354], [null, 1435689369], [null, 1435689384], [null, 1435689399], [null, 1435689414], [null, 1435689429], [null, 1435689444], [null, 1435689459], [null, 1435689474], [null, 1435689489], [null, 1435689504], [null, 1435689519], [null, 1435689534], [null, 1435689549], [null, 1435689564]]},{"target": "Forecast", "datapoints": [[186.77999925613403, 1435520801], [178.95000147819519, 1435521131]]},{"target": "Upper", "datapoints": [[186.77999925613403, 1435520801], [178.95000147819519, 1435521131]]},{"target": "Lower", "datapoints": [[186.77999925613403, 1435520801], [178.95000147819519, 1435521131]]}]

有人在python中做过类似的事情吗?有什么想法可以开始吗?

注意:这不是一个详细的规范答案,而是对适用于您的领域的可用库(统计模型)的引用

对于python,您可以使用:

  • 西皮:
    • e、 g.(使用
      scipy.stats.linregresse
  • statsmodels:这里有
  • sklearn
    :以下是最新版本
有一些好文章:

  • 特别是它有一个关于预测的章节
  • 另一篇文章展示了如何使用
    statsmodels
    sklearn

Scikit是python的一个很好的模块

X和Y变量必须分成两个数组,如果要绘制它们(X,Y),其中一个数组的索引将与另一个数组匹配

因此,我猜在时间序列数据中,你会将X和Y值分开,如下所示:

null = None
time_series = [{"target": "average", "datapoints": [[null, 1435688679], [34.870499801635745, 1435688694], [null, 1435688709], [null, 1435688724], [null, 1435688739], [null, 1435688754], [null, 1435688769], [null, 1435688784], [null, 1435688799], [null, 1435688814], [null, 1435688829], [null, 1435688844], [null, 1435688859], [null, 1435688874], [null, 1435688889], [null, 1435688904], [null, 1435688919], [null, 1435688934], [null, 1435688949], [null, 1435688964], [null, 1435688979], [38.180000209808348, 1435688994], [null, 1435689009], [null, 1435689024], [null, 1435689039], [null, 1435689054], [null, 1435689069], [null, 1435689084], [null, 1435689099], [null, 1435689114], [null, 1435689129], [null, 1435689144], [null, 1435689159], [null, 1435689174], [null, 1435689189], [null, 1435689204], [null, 1435689219], [null, 1435689234], [null, 1435689249], [null, 1435689264], [null, 1435689279], [30.79849989414215, 1435689294], [null, 1435689309], [null, 1435689324], [null, 1435689339], [null, 1435689354], [null, 1435689369], [null, 1435689384], [null, 1435689399], [null, 1435689414], [null, 1435689429], [null, 1435689444], [null, 1435689459], [null, 1435689474], [null, 1435689489], [null, 1435689504], [null, 1435689519], [null, 1435689534], [null, 1435689549], [null, 1435689564]]}]

 # assuming the time series is the X axis value

input_X_vars = []
input_Y_vars = []

for pair in time_series[0]["datapoints"]:
    if (pair[0] != None and pair[1] != None):
        input_X_vars.append(pair[1])
        input_Y_vars.append(pair[0])



import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model

regr = linear_model.LinearRegression()
regr.fit(input_X_vars, input_Y_vars)

test_X_vars = [1435688681, 1435688685]

results = regr.predict(test_X_vars)

forecast_append = {"target": "Lower", "datapoints": results}

time_series.append(forecast_append)
 return Y[-fc:], alpha, beta, rmse

我将null设置为None,因为“null”关键字在python中被解析为一个简单的变量。

在您的问题文本中,您明确表示希望 回归输出的上限和下限,以及输出 预测。您还提到使用Holt Winters算法 特别是预测

其他回答者建议的软件包很有用,但您可能会注意到
sklearn
LinearRegression不会给出“超出”的错误界限 “盒子”,statsmodels有

因此,我建议尝试使用霍尔特温特斯。 不幸的是,它的许可证不清楚,所以我不能在这里复制它 满满的。现在,我不确定你是否真的想要霍尔特·温特斯 (季节性)预测,或霍尔特的线性指数平滑 算法。我猜这篇文章的标题是后者。因此 您可以使用链接库的
linear()
函数。这个 这项技术是为感兴趣的读者准备的

为了不提供仅链接的答案,我将描述 这里的主要特点。定义了一个函数来获取数据,即

 def linear(x, fc, alpha = None, beta = None):
x
是要拟合的数据,
fc
是所需的时间步数 为了预测,阿尔法和贝塔采用其通常的霍尔特冬季含义: 大致是一个参数,用于控制平滑到“级别”的量 分别向"趋势"靠拢。如果
alpha
beta
不是 如果指定,则使用 将RMSE降至最低

该函数通过循环使用 现有数据点,然后返回预测,如下所示:

null = None
time_series = [{"target": "average", "datapoints": [[null, 1435688679], [34.870499801635745, 1435688694], [null, 1435688709], [null, 1435688724], [null, 1435688739], [null, 1435688754], [null, 1435688769], [null, 1435688784], [null, 1435688799], [null, 1435688814], [null, 1435688829], [null, 1435688844], [null, 1435688859], [null, 1435688874], [null, 1435688889], [null, 1435688904], [null, 1435688919], [null, 1435688934], [null, 1435688949], [null, 1435688964], [null, 1435688979], [38.180000209808348, 1435688994], [null, 1435689009], [null, 1435689024], [null, 1435689039], [null, 1435689054], [null, 1435689069], [null, 1435689084], [null, 1435689099], [null, 1435689114], [null, 1435689129], [null, 1435689144], [null, 1435689159], [null, 1435689174], [null, 1435689189], [null, 1435689204], [null, 1435689219], [null, 1435689234], [null, 1435689249], [null, 1435689264], [null, 1435689279], [30.79849989414215, 1435689294], [null, 1435689309], [null, 1435689324], [null, 1435689339], [null, 1435689354], [null, 1435689369], [null, 1435689384], [null, 1435689399], [null, 1435689414], [null, 1435689429], [null, 1435689444], [null, 1435689459], [null, 1435689474], [null, 1435689489], [null, 1435689504], [null, 1435689519], [null, 1435689534], [null, 1435689549], [null, 1435689564]]}]

 # assuming the time series is the X axis value

input_X_vars = []
input_Y_vars = []

for pair in time_series[0]["datapoints"]:
    if (pair[0] != None and pair[1] != None):
        input_X_vars.append(pair[1])
        input_Y_vars.append(pair[0])



import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model

regr = linear_model.LinearRegression()
regr.fit(input_X_vars, input_Y_vars)

test_X_vars = [1435688681, 1435688685]

results = regr.predict(test_X_vars)

forecast_append = {"target": "Lower", "datapoints": results}

time_series.append(forecast_append)
 return Y[-fc:], alpha, beta, rmse
其中,
Y[-fc:]
是预测点,
alpha
beta
是预测点 实际使用的值和
rmse
是均方根误差。 不幸的是,正如你所看到的,信心没有上限或下限 间隔。顺便说一句,我们可能应该把它们称为

预测区间数学 霍尔特算法和霍尔特温特斯算法是指数平滑算法 为生成的预测寻找置信区间的技术和方法 对他们来说,这是一个棘手的问题。它们被称为方法,在霍尔特温特斯的例子中,它们是乘法的 算法,没有。但是, 声称:

可以计算长期预测的置信区间 通过考虑指数平滑模型生成的预测 作为ARIMA模型的特例。(注意:并非所有软件都能计算 这些模型的置信区间正确。)的宽度 置信区间取决于(i)模型的均方根误差,(ii) 平滑类型(简单或线性);(iii)该物业的价值 平滑常数;以及(iv)你将要经历的时期数 预测。一般来说,随着α的增大,间隔的扩展速度加快 在SES模型中更大,当线性化时,它们传播得更快 而不是使用简单的平滑

我们看到ARIMA(0,2,2)模型等价于Holt模型 具有加性误差的线性模型

预测间隔代码(即如何继续) 你在评论中指出你的观点。我 我猜您可能已经习惯了
forecast
打包在
R
中,因此期望这样的间隔。在里面 在这种情况下,您可以修改python库,以便在 同样的基础

查看,我们可以看到它返回一个对象 基于
预测(ets(…)
。在引擎盖下-这最终调用 ,它返回平均值
mu
和方差
var
(以及我不得不承认我不理解的
cj
)。 方差用于计算上界和下界

要在Python中执行类似的操作,我们需要生成一些 类似于估算每个变量方差的
class1
R函数 预测。此函数获取模型拟合和预测中发现的残差 在每个时间步将它们乘以一个因子,得到 在线性霍尔特算法的特殊情况下,因子是
alpha+k*beta
其中,
k
是预测的时间步数。一旦你有了它 在每个预测点的方差,将误差视为正常情况 分布并从正态分布中获取X%值

下面是一个如何在Python中实现这一点的想法(使用代码