干货!Python时间序列处理库Dart从入门到实战

Dart是一个Python库,用于对时间序列进行用户友好的预测和异常检测。它包含了各种各样的模型,从经典的ARIMA到深度神经网络。预测模型都可以以相同的方式使用,使用fit()和predict()函数,类似于scikit-learn。该库还使回测模型、组合多个模型的预测以及考虑外部数据变得容易。Dart支持单变量和多变量时间序列和模型。基于机器学习的模型可以在包含多个时间序列的潜在大型数据集上进行训练,其中一些模型为概率预测提供了丰富的支持。

Dart还提供了广泛的异常检测功能。例如,在时间序列上应用PyOD模型以获得异常分数,或者包装任何Dart预测或过滤模型以获得完全成熟的异常检测模型都是很简单的。

官方网址GitHub:https://github.com/unit8co/darts

文档

快速开始

此处将详细介绍该库的主要功能:

安装Darts

推荐使用虚拟环境,主要有两种安装方式

用pip进行安装

pip install darts

用conda进行安装

conda install -c conda-forge -c pytorch u8darts-all

首先是导包,一些必要的导包。

%matplotlib inline  
import pandas as pd  
import numpy as np  
import matplotlib.pyplot as plt  
from darts import TimeSeries  
from darts.datasets import AirPassengersDataset

注意:%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()

一些TimeSeries的操作

TimeSeries支持不同类型的操作——这里有几个例子。

划分

我们还可以在序列的一小部分、一个pandas时间戳或一个整数索引值上进行分割。

series1, series2 = series.split_before(0.75)  
series1.plot()  
series2.plot()

切片

series1, series2 = series[:-36], series[-36:]  
series1.plot()  
series2.plot()

算术运算

series_noise = TimeSeries.from_times_and_values(  
    series.time_index, np.random.randn(len(series))  
)  
(series / 2 + 20 * series_noise - 10).plot()

堆叠

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

(series / 50).stack(series_noise).plot()

映射

series.map(np.log).plot()

映射时间戳和值

series.map(lambda ts, x: x / ts.days_in_month).plot()

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

(series / 20).add_datetime_attribute("month").plot()

添加一些二进制假日组件:

(series / 200).add_holidays("US").plot()

差分

series.diff().plot()

填充缺失值

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")

创建训练和验证序列

接下来,我们将把TimeSeries分成训练系列和验证系列。注意:一般来说,将测试系列放在一边并且在测试过程结束之前不要碰它也是一个很好的做法。这里,为了简单起见,我们只构建一个训练和验证系列。

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

train, val = series.split_before(pd.Timestamp("19580101"))  
train.plot(label="training")  
val.plot(label="validation")

训练预测模型并预测

玩一下玩具模型

在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)")

在TimeSeries上拟合模型并做出预测是非常容易的。所有模型都有一个fit()和一个predict()函数。这类似于Scikit-learn,除了它是特定于时间序列的。fit()函数的参数是拟合模型的训练时间序列,predict()函数的参数是要预测的时间步数(在训练序列结束之后)。

检查季节性

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

from darts.utils.statistics import plot_acf, check_seasonality  
  
plot_acf(train, m=12, alpha=0.05)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值