时间序列 工具库学习(4) Darts模块-快速入门

1.认识Darts

Darts 是另一个 Python 包,它有助于时间序列的操作和预测。语法是“sklearn-friendly”,使用fit和predict函数来实现目标。此外,它还包含了从 ARIMA 到神经网络的各种模型。

该软件包最好的部分是它不仅支持单变量,而且还支持多变量时间序列和模型。该库还可以方便地对模型进行回溯测试,并将多个模型的预测和外部回归组合起来。

安装:

pip install darts

查看Github: https://github.com/unit8co/darts
文档: https://unit8co.github.io/darts/README.html

导库:

%load_ext autoreload
%autoreload 2
%matplotlib inlineimport pandas as pd
import numpy as np
import matplotlib.pyplot as pltfrom darts import TimeSeries
from darts.datasets import AirPassengersDataset

2.构建、操作时间序列

TimeSeries 是dart中的主要数据类。TimeSeries 表示单变量或多变量时间序列,具有适当的时间索引。时间指数可以是熊猫类型。DatetimeIndex(包含datetimes),或类型为pandas的。Int64Index(包含整数;用于表示没有特定时间戳的顺序数据)。在某些情况下,TimeSeries甚至可以表示概率序列,例如为了获得置信区间。dart中的所有模型都消耗时间序列并生成时间序列。

(1)读取和构建时间序列

TimeSeries可以使用一些工厂(内置)方法轻松地构建:

  • 从一个完整的pandas DataFrame,使用TimeSeries.from_dataframe() (docs)。
  • 使用TimeSeries.from_times_and_values()从一个时间索引和一个相应值的数组中获取。地址
  • 从NumPy值数组中,使用TimeSeries.from_values()。文档地址
  • 从Pandas Series中,使用TimeSeries.from_series()。链接
  • xarray.DataArray,使用TimeSeries.from_xarray ()。链接
  • 从CSV文件中,使用TimeSeries.from_csv()。链接

通过直接从dart中一个可用的数据集中加载航空乘客系列来获得一个TimeSeries:

%load_ext autoreload
%autoreload 2
%matplotlib inlineimport pandas as pd
import numpy as np
import matplotlib.pyplot as pltfrom darts import TimeSeries
from darts.datasets import AirPassengersDatasetseries = AirPassengersDataset().load()
series.plot()

在这里插入图片描述

(2)一些TimeSeries操作

TimeSeries 支持不同类型的操作 :

① 分裂【拆分】

可以在系列的一小部分、pandasTimestamp或整数索引值处进行拆分。

%load_ext autoreload
%autoreload 2
%matplotlib inlineimport pandas as pd
import numpy as np
import matplotlib.pyplot as pltfrom darts import TimeSeries
from darts.datasets import AirPassengersDatasetseries = AirPassengersDataset().load()series1, series2 = series.split_before(0.75)
series1.plot()
series2.plot()

在这里插入图片描述

② 切片

%load_ext autoreload
%autoreload 2
%matplotlib inlineimport pandas as pd
import numpy as np
import matplotlib.pyplot as pltfrom darts import TimeSeries
from darts.datasets import AirPassengersDatasetseries = AirPassengersDataset().load()series1, series2 = series[:-36], series[-36:]
series1.plot()
series2.plot()

在这里插入图片描述

③ 算术运算

%load_ext autoreload
%autoreload 2
%matplotlib inlineimport pandas as pd
import numpy as np
import matplotlib.pyplot as pltfrom darts import TimeSeries
from darts.datasets import AirPassengersDatasetseries = AirPassengersDataset().load()series_noise = TimeSeries.from_times_and_values(series.time_index, np.random.randn(len(series)))# 计算加减乘除
(series / 2 + 20 * series_noise - 10).plot()

在这里插入图片描述
series_noise 是一个 噪声序列:
在这里插入图片描述

④ 堆叠

连接一个新维度以产生一个新的单一多元序列。

.stack() 函数 是 堆叠函数。

%load_ext autoreload
%autoreload 2
%matplotlib inlineimport pandas as pd
import numpy as np
import matplotlib.pyplot as pltfrom darts import TimeSeries
from darts.datasets import AirPassengersDatasetseries = AirPassengersDataset().load()
series_noise = TimeSeries.from_times_and_values(series.time_index, np.random.randn(len(series)))(series / 50).stack(series_noise).plot()

在这里插入图片描述

⑤ 映射

%load_ext autoreload
%autoreload 2
%matplotlib inlineimport pandas as pd
import numpy as np
import matplotlib.pyplot as pltfrom darts import TimeSeries
from darts.datasets import AirPassengersDatasetseries = AirPassengersDataset().load()series.map(np.log).plot()

在这里插入图片描述

⑥ 时间戳和值的映射

%load_ext autoreload
%autoreload 2
%matplotlib inlineimport pandas as pd
import numpy as np
import matplotlib.pyplot as pltfrom darts import TimeSeries
from darts.datasets import AirPassengersDatasetseries = AirPassengersDataset().load()series.map(lambda ts, x: x/ts.days_in_month).plot()

在这里插入图片描述

⑦ 添加一些 datetime 属性作为额外维度(产生多变量系列)

%load_ext autoreload
%autoreload 2
%matplotlib inlineimport pandas as pd
import numpy as np
import matplotlib.pyplot as pltfrom darts import TimeSeries
from darts.datasets import AirPassengersDatasetseries = AirPassengersDataset().load()(series / 20).add_datetime_attribute('month').plot()

在这里插入图片描述

⑧ 添加一些二进制假期组件

%load_ext autoreload
%autoreload 2
%matplotlib inlineimport pandas as pd
import numpy as np
import matplotlib.pyplot as pltfrom darts import TimeSeries
from darts.datasets import AirPassengersDatasetseries = AirPassengersDataset().load()(series / 200).add_holidays('US').plot()

在这里插入图片描述

⑨ 差分

%load_ext autoreload
%autoreload 2
%matplotlib inlineimport pandas as pd
import numpy as np
import matplotlib.pyplot as pltfrom darts import TimeSeries
from darts.datasets import AirPassengersDatasetseries = AirPassengersDataset().load()series.diff().plot()

在这里插入图片描述

⑩ 填充缺失值(使用’ ’ utils ’ '模型下的函数)

缺失的值由np.nan表示。

from darts.utils.missing_values import fill_missing_valuesvalues = np.arange(50, step=0.5)
values[10:30] = np.nan
values[60:95] = np.nan
series_ = TimeSeries.from_values(values)(series_ - 10).plot(label='with missing values (shifted below)')
fill_missing_values(series_).plot(label='without missing values')

在这里插入图片描述

⑪ 创建训练和验证 序列【拆分数据集】

把TimeSeries分为训练 序列 和 验证序列。注意:一般来说,将测试序列 放在一边,直到过程结束时才碰它也是一个很好的做法。

训练序列 将是一个TimeSeries,其中包含直到1958年1月的值(不包括),验证序列将是一个TimeSeries,其中包含其余的值:

%load_ext autoreload
%autoreload 2
%matplotlib inlineimport pandas as pd
import numpy as np
import matplotlib.pyplot as pltfrom darts import TimeSeries
from darts.datasets import AirPassengersDatasetseries = AirPassengersDataset().load()train, val = series.split_before(pd.Timestamp('19580101'))
train.plot(label='training')
val.plot(label='validation')

在这里插入图片描述

3.训练预测模型并进行预测

(1)尝试简单模型

Darts 中有一组“naive” 的基线模型,这对于了解人们可以期望的最低准确度非常有用。例如,NaiveSeasonal(K)模型总是“重复 ”K时间步前出现的值。

在最简单的形式中,当K=1时,该模型总是简单地重复训练 序列的最后一个值 :


%load_ext autoreload
%autoreload 2
%matplotlib inlineimport pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from darts.models import NaiveSeasonal
from darts import TimeSeries
from darts.datasets import AirPassengersDatasetseries = AirPassengersDataset().load()train, val = series.split_before(pd.Timestamp('19580101'))naive_model = NaiveSeasonal(K=1)
naive_model.fit(train)
naive_forecast = naive_model.predict(36)series.plot(label='actual')
naive_forecast.plot(label='naive forecast (K=1)')

在这里插入图片描述
当然,K越大,那么代表着 重复训练序列的最后k个值,模型效果稍微提升:

from darts.models import NaiveSeasonalnaive_model = NaiveSeasonal(K=5)
naive_model.fit(train)
naive_forecast = naive_model.predict(36)series.plot(label='actual')
naive_forecast.plot(label='naive forecast (K=1)')

在这里插入图片描述
在TimeSeries上进行模型拟合和预测非常容易。所有模型都有一个fit()和一个predict()函数。这类似于Scikit-learn,除了它是特定于时间序列的。fit()函数的参数是用于拟合模型的训练时间序列,predict()函数的参数是用于预测的时间步长(在训练序列结束后)。

(2)检查季节性**

上面的模型可能有点太天真了。已经可以通过利用数据中的季节性来改进。数据具有年度季节性似乎很明显,可以通过查看自相关函数 (ACF) 并突出显示滞后来确认这一点m=12:

from darts.utils.statistics import plot_acf, check_seasonality
%load_ext autoreload
%autoreload 2
%matplotlib inlineimport pandas as pd
import numpy as np
import matplotlib.pyplot as pltfrom darts import TimeSeries
from darts.datasets import AirPassengersDatasetseries = AirPassengersDataset().load()train, val = series.split_before(pd.Timestamp('19580101'))
plot_acf(train, m=12, alpha=.05)

在这里插入图片描述
ACF 在 x = 12 处出现峰值,这表明存在年度季节性趋势(以红色突出显示)。蓝色区域确定统计信息对于置信水平的显着性α=0.05. 还可以对每个候选周期进行季节性统计检查m:


for m in range(2, 25):is_seasonal, period = check_seasonality(train, m=m, alpha=.05)if is_seasonal:print('There is seasonality of order {}.'.format(period))

输出:

There is seasonality of order 12.

(3) 一个相对上面的模型来说不简单的模型

NaiveSeasonal 以 12 的季节性再次尝试该模型:

%load_ext autoreload
%autoreload 2
%matplotlib inlineimport pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from darts.models import NaiveSeasonal
from darts import TimeSeries
from darts.datasets import AirPassengersDatasetseries = AirPassengersDatas


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部