目录
Dart是一个Python库,用于对时间序列进行用户友好的预测和异常检测。它包含了各种各样的模型,从经典的ARIMA到深度神经网络。预测模型都可以以相同的方式使用,使用fit()和predict()函数,类似于scikit-learn。该库还使回测模型、组合多个模型的预测以及考虑外部数据变得容易。Dart支持单变量和多变量时间序列和模型。基于机器学习的模型可以在包含多个时间序列的潜在大型数据集上进行训练,其中一些模型为概率预测提供了丰富的支持。
Dart还提供了广泛的异常检测功能。例如,在时间序列上应用PyOD模型以获得异常分数,或者包装任何Dart预测或过滤模型以获得完全成熟的异常检测模型都是很简单的。
官方网址GitHub:Unit8 SA · GitHubdarts
文档
快速开始
此处将详细介绍该库的主要功能:
安装Darts
推荐使用虚拟环境,主要有两种安装方式
用pip进行安装
pip install darts
- 1
用conda进行安装
conda install -c conda-forge -c pytorch u8darts-all
- 1
首先是导包,一些必要的导包。
%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from darts import TimeSeries
from darts.datasets import AirPassengersDataset
- 1
- 2
- 3
- 4
- 5
- 6
注意:%matplotlib inline (魔法函数)可以在Ipython编译器比如jupyter notebook 或者 jupyter qtconsole里直接使用,功能是可以内嵌绘图,并且省略掉plt.show()。
构建和操作TimeSeries
TimeSeries是Darts中的主要数据类。TimeSeries表示具有适当时间索引的单变量或多变量时间序列。时间索引可以是pandas类型。DatetimeIndex(包含日期时间),或pandas类型的。RangeIndex(包含整数);用于表示没有特定时间戳的顺序数据)。在某些情况下,TimeSeries甚至可以表示概率序列,例如为了获得置信区间。Darts中的所有模型都使用TimeSeries并生成TimeSeries。
读数据并创建一个TimeSeries
使用一些工厂方法可以很容易地构建TimeSeries:
使用
TimeSeries.from_dataframe() (docs)
从整个Pandas DataFrame中获取。
使用
TimeSeries.from_times_and_values() (docs)
从时间索引和相应值的数组中获取。
从NumPy数组的值,使用
TimeSeries.from_values() (docs)。
从Pandas系列中,使用
TimeSeries.from_series() (docs)。
从一个xarray。使用
TimeSeries.from_xarray() (docs)。
从CSV文件,使用
TimeSeries.from_csv() (docs)。
下面,我们通过直接从Dart中可用的一个数据集加载航空乘客系列来获得一个TimeSeries:
series = AirPassengersDataset().load()
series.plot()
- 1
- 2
一些TimeSeries的操作
TimeSeries支持不同类型的操作——这里有几个例子。
划分
我们还可以在序列的一小部分、一个pandas时间戳或一个整数索引值上进行分割。
series1, series2 = series.split_before(0.75)
series1.plot()
series2.plot()
- 1
- 2
- 3
切片
series1, series2 = series[:-36], series[-36:]
series1.plot()
series2.plot()
- 1
- 2
- 3
算术运算
series_noise = TimeSeries.from_times_and_values(
series.time_index, np.random.randn(len(series))
)
(series / 2 + 20 * series_noise - 10).plot()
- 1
- 2
- 3
- 4
堆叠
连接一个新的维度以产生一个新的单多元序列。
(series / 50).stack(series_noise).plot()
- 1
映射
series.map(np.log).plot()
- 1
映射时间戳和值
series.map(lambda ts, x: x / ts.days_in_month).plot()
- 1
添加一些datetime属性作为额外的维度(产生多变量序列):
(series / 20).add_datetime_attribute("month").plot()
- 1
添加一些二进制假日组件:
(series / 200).add_holidays("US").plot()
- 1
差分
series.diff().plot()
- 1
填充缺失值
from darts.utils.missing_values import fill_missing_values
values = 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")
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
创建训练和验证序列
接下来,我们将把TimeSeries分成训练系列和验证系列。注意:一般来说,将测试系列放在一边并且在测试过程结束之前不要碰它也是一个很好的做法。这里,为了简单起见,我们只构建一个训练和验证系列。
训练系列将是一个包含到1958年1月(不包括)的值的TimeSeries,验证系列将是一个包含其余值的TimeSeries:
train, val = series.split_before(pd.Timestamp("19580101"))
train.plot(label="training")
val.plot(label="validation")
- 1
- 2
- 3
训练预测模型并预测
玩一下玩具模型
在Darts中有一组“原始的”基线模型,这对于了解人们所期望的最低精度非常有用。例如,naivesasional (K)模型总是“重复”K个时间步之前发生的值。
在最朴素的形式中,当K=1时,该模型总是简单地重复训练序列的最后一个值:
from darts.models import NaiveSeasonal
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)")
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
在TimeSeries上拟合模型并做出预测是非常容易的。所有模型都有一个fit()和一个predict()函数。这类似于Scikit-learn,除了它是特定于时间序列的。fit()函数的参数是拟合