Python 中的时间序列轻松搞定¶
Darts 是一个用于时间序列预测和异常检测的用户友好型 Python 库。它包含多种模型,从经典的 ARIMA 到深度神经网络。所有预测模型都可以使用 fit()
和 predict()
函数以相同的方式使用,类似于 scikit-learn。该库还使得回测模型、组合多个模型的预测结果以及考虑外部数据变得容易。Darts 支持单变量和多变量时间序列和模型。基于机器学习的模型可以在包含多个时间序列的潜在大数据集上进行训练,并且一些模型提供了对概率预测的丰富支持。
Darts 还提供了广泛的异常检测功能。例如,将 PyOD 模型应用于时间序列以获取异常分数非常简单,或者将任何 Darts 预测或过滤模型包装起来以获得功能齐全的异常检测模型。
文档¶
高级介绍¶
选定主题的文章¶
快速安装¶
我们建议首先使用Python 3.8+为您的项目设置一个干净的Python环境,使用您喜欢的工具(conda,venv,virtualenv 带或不带 virtualenvwrapper)。
一旦你的环境设置好了,你可以使用 pip 安装 darts:
pip install darts
更多详情,您可以参考我们的 安装说明。
示例用法¶
从 Pandas DataFrame 创建一个 TimeSeries
对象,并将其拆分为训练/验证序列:
import pandas as pd
from darts import TimeSeries
# Read a pandas DataFrame
df = pd.read_csv("AirPassengers.csv", delimiter=",")
# Create a TimeSeries, specifying the time and value columns
series = TimeSeries.from_dataframe(df, "Month", "#Passengers")
# Set aside the last 36 months as a validation series
train, val = series[:-36], series[-36:]
拟合一个指数平滑模型,并在验证序列的持续时间内进行(概率性)预测:
from darts.models import ExponentialSmoothing
model = ExponentialSmoothing()
model.fit(train)
prediction = model.predict(len(val), num_samples=1000)
绘制中位数、第5百分位数和第95百分位数:
import matplotlib.pyplot as plt
series.plot()
prediction.plot(label="forecast", low_quantile=0.05, high_quantile=0.95)
plt.legend()
加载一个多变量序列,修剪它,保留2个分量,分割训练和验证集:
from darts.datasets import ETTh2Dataset
series = ETTh2Dataset().load()[:10000][["MUFL", "LULL"]]
train, val = series.split_before(0.6)
构建一个k-means异常评分器,在训练集上训练它,并在验证集上使用它以获得异常评分:
from darts.ad import KMeansScorer
scorer = KMeansScorer(k=2, window=5)
scorer.fit(train)
anom_score = scorer.score(val)
构建一个二进制异常检测器并在训练分数上进行训练,然后使用它在验证分数上进行二进制异常分类:
from darts.ad import QuantileDetector
detector = QuantileDetector(high_quantile=0.99)
detector.fit(scorer.score(train))
binary_anom = detector.detect(anom_score)
绘图(将部分序列进行平移和缩放,以便在同一图中显示所有内容):
import matplotlib.pyplot as plt
series.plot()
(anom_score / 2. - 100).plot(label="computed anomaly score", c="orangered", lw=3)
(binary_anom * 45 - 150).plot(label="detected binary anomaly", lw=4)
特性¶
预测模型: 包含大量预测模型;从统计模型(如ARIMA)到深度学习模型(如N-BEATS)。参见`下面的模型表 <#forecasting-models>`_。
异常检测
darts.ad
模块包含了一系列异常评分器、检测器和聚合器,这些都可以组合起来用于时间序列中的异常检测。将 Darts 的任何预测或过滤模型封装起来构建一个功能齐全的异常检测模型非常容易,该模型可以比较预测值与实际值。PyODScorer
使得在时间序列上使用 PyOD 检测器变得非常简单。多元支持:
TimeSeries
可以是多元的 - 即,包含多个随时间变化的维度/列,而不仅仅是一个单一的标量值。许多模型可以消费和生成多元序列。多序列训练(全局模型): 所有基于机器学习的模型(包括所有神经网络)都支持在多个(可能是多元的)序列上进行训练。这也可以扩展到大型数据集。
概率支持:
TimeSeries
对象可以(可选地)表示随机时间序列;这可以例如用于获取置信区间,并且许多模型支持不同风格的概率预测(例如估计参数分布或分位数)。一些异常检测评分器也能够利用这些预测分布。过去和未来协变量支持: Darts 中的许多模型支持过去观察到的和/或未来已知的协变量(外部数据)时间序列作为输入,以生成预测。
静态协变量支持: 除了时间依赖数据外,
TimeSeries
还可以包含每个维度的静态数据,这些数据可以被某些模型利用。层次协调: Darts 提供了执行协调的转换器。这些转换器可以使预测结果以一种尊重底层层次结构的方式相加。
回归模型: 可以插入任何与 scikit-learn 兼容的模型,以获得作为目标序列和协变量的滞后值函数的预测。
使用样本权重进行训练: 所有全局模型都支持使用样本权重进行训练。它们可以应用于每个观测值、预测的时间步长和目标列。
预测开始偏移: 所有全球模型都支持在偏移的输出窗口上进行训练和预测。这对于例如提前一天的市场预测,或者当协变量(或目标序列)有延迟报告时非常有用。
可解释性: Darts 能够使用 Shap 值来 解释 一些预测模型。
数据处理: 工具,用于轻松应用(及还原)时间序列数据上的常见转换(缩放、填充缺失值、差分、boxcox等)
指标: 用于评估时间序列拟合优度的各种指标;从R2分数到平均绝对缩放误差。
回测: 用于模拟历史预测的工具,使用移动时间窗口。
PyTorch Lightning 支持: 所有深度学习模型都使用 PyTorch Lightning 实现,支持自定义回调、GPU/TPU 训练和自定义训练器等功能。
过滤模型: Darts 提供了三种过滤模型:
KalmanFilter
、GaussianProcessFilter
和MovingAverageFilter
,这些模型允许对时间序列进行过滤,并且在某些情况下可以获得潜在状态/值的概率推断。数据集
darts.datasets
子模块包含了一些流行的时间序列数据集,用于快速和可重复的实验。
预测模型¶
以下是目前在 Darts 中实现的预测模型的细分。我们正在不断努力引入更多的模型和功能。
模型 |
来源 |
目标序列支持: |
协变量支持: |
概率预测: |
多序列上的训练与预测 |
---|---|---|---|---|---|
基线模型 |
|||||
🟩 🟩 |
🟥 🟥 🟥 |
🟥 🟥 |
🟥 |
||
NaiveSeasonal 是一个简单的季节性模型。 |
🟩 🟩 |
🟥 🟥 🟥 |
🟥 🟥 |
🟥 |
|
NaiveDrift 是一个简单的漂移模型。 |
🟩 🟩 |
🟥 🟥 🟥 |
🟥 🟥 |
🟥 |
|
🟩 🟩 |
🟥 🟥 🟥 |
🟥 🟥 |
🟥 |
||
统计/经典模型 |
|||||
🟩 🟥 |
🟥 🟩 🟥 |
🟩 🟥 |
🟥 |
||
VARIMA 是一个用于时间序列预测的模型。 |
🟥 🟩 |
🟥 🟩 🟥 |
🟩 🟥 |
🟥 |
|
AutoARIMA 是一个自动ARIMA模型。 |
🟩 🟥 |
🟥 🟩 🟥 |
🟥 🟥 |
🟥 |
|
StatsForecastAutoArima (更快的AutoARIMA) |
Nixtla 的 statsforecast 的统计预测 |
🟩 🟥 |
🟥 🟩 🟥 |
🟩 🟥 |
🟥 |
🟩 🟥 |
🟥 🟥 🟥 |
🟩 🟥 |
🟥 |
||
Nixtla 的 statsforecast 的统计预测 |
🟩 🟥 |
🟥 🟩 🟥 |
🟩 🟥 |
🟥 |
|
Nixtla 的 statsforecast 的统计预测 |
🟩 🟥 |
🟥 🟥 🟥 |
🟥 🟥 |
🟥 |
|
🟩 🟥 |
🟥 🟥 🟥 |
🟩 🟥 |
🟥 |
||
🟩 🟥 |
🟥 🟥 🟥 |
🟥 🟥 |
🟥 |
||
Nixtla 的 statsforecast 的统计预测 |
🟩 🟥 |
🟥 🟥 🟥 |
🟩 🟥 |
🟥 |
|
Prophet 模型 |
🟩 🟥 |
🟥 🟩 🟥 |
🟩 🟥 |
🟥 |
|
FFT (快速傅里叶变换) |
🟩 🟥 |
🟥 🟥 🟥 |
🟥 🟥 |
🟥 |
|
KalmanForecaster 使用卡尔曼滤波器和N4SID进行系统识别 |
🟩 🟩 |
🟥 🟩 🟥 |
🟩 🟥 |
🟥 |
|
Croston 方法 |
🟩 🟥 |
🟥 🟩 🟥 |
🟥 🟥 |
🟥 |
|
全局基准模型 |
|||||
🟩 🟩 |
🟥 🟥 🟥 |
🟥 🟥 |
🟩 |
||
🟩 🟩 |
🟥 🟥 🟥 |
🟥 🟥 |
🟩 |
||
🟩 🟩 |
🟥 🟥 🟥 |
🟥 🟥 |
🟩 |
||
回归模型 |
|||||
回归模型:围绕任何sklearn回归模型的通用包装器 |
🟩 🟩 |
🟩 🟩 🟩 |
🟥 🟥 |
🟩 |
|
LinearRegressionModel 是一个线性回归模型。 |
🟩 🟩 |
🟩 🟩 🟩 |
🟩 🟩 |
🟩 |
|
🟩 🟩 |
🟩 🟩 🟩 |
🟥 🟥 |
🟩 |
||
🟩 🟩 |
🟩 🟩 🟩 |
🟩 🟩 |
🟩 |
||
XGBModel 是一个用于时间序列预测的模型。 |
🟩 🟩 |
🟩 🟩 🟩 |
🟩 🟩 |
🟩 |
|
CatBoostModel 是一个用于预测的模型。 |
🟩 🟩 |
🟩 🟩 🟩 |
🟩 🟩 |
🟩 |
|
基于PyTorch (Lightning)的模型 |
|||||
RNNModel (包括 LSTM 和 GRU); 在概率版本中相当于 DeepAR |
🟩 🟩 |
🟥 🟩 🟥 |
🟩 🟩 |
🟩 |
|
BlockRNNModel (包括 LSTM 和 GRU) |
🟩 🟩 |
🟩 🟥 🟥 |
🟩 🟩 |
🟩 |
|
NBEATSModel 模型 |
🟩 🟩 |
🟩 🟥 🟥 |
🟩 🟩 |
🟩 |
|
NHiTSModel 模型 |
🟩 🟩 |
🟩 🟥 🟥 |
🟩 🟩 |
🟩 |
|
TCNModel 是一个用于时间序列预测的模型。 |
🟩 🟩 |
🟩 🟥 🟥 |
🟩 🟩 |
🟩 |
|
🟩 🟩 |
🟩 🟥 🟥 |
🟩 🟩 |
🟩 |
||
TFTModel (时间融合变压器) |
🟩 🟩 |
🟩 🟩 🟩 |
🟩 🟩 |
🟩 |
|
DLinearModel 是一个用于时间序列预测的模型。 |
🟩 🟩 |
🟩 🟩 🟩 |
🟩 🟩 |
🟩 |
|
🟩 🟩 |
🟩 🟩 🟩 |
🟩 🟩 |
🟩 |
||
🟩 🟩 |
🟩 🟩 🟩 |
🟩 🟩 |
🟩 |
||
TSMixerModel 是一个时间序列预测模型。 |
🟩 🟩 |
🟩 🟩 🟩 |
🟩 🟩 |
🟩 |
|
集成模型 |
|||||
NaiveEnsembleModel 是一个简单的集成模型。 |
🟩 🟩 |
🟩 🟩 🟩 |
🟩 🟩 |
🟩 |
|
🟩 🟩 |
🟩 🟩 🟩 |
🟩 🟩 |
🟩 |
社区与联系¶
欢迎任何人加入我们的 Gitter 房间 来提问、提出建议、讨论用例等。如果你发现了一个错误或有建议,GitHub 问题也非常欢迎。
如果您想告诉我们的事情不适合在Gitter或Github上讨论,欢迎随时通过电子邮件联系我们,对于与darts相关的事宜,请发送至 darts@unit8.co,对于其他任何咨询,请发送至 info@unit8.co。
贡献¶
开发正在进行中,我们欢迎在 GitHub 上的建议、拉取请求和问题。所有贡献者将在 变更日志页面 上得到认可。
在开始贡献(新功能或修复)之前,请查看我们的贡献指南。
引用¶
如果您在科学工作中使用 Darts,我们希望您能引用以下 JMLR 论文。
Bibtex 条目:
@article{JMLR:v23:21-1177,
author = {Julien Herzen and Francesco Lässig and Samuele Giuliano Piazzetta and Thomas Neuer and Léo Tafti and Guillaume Raille and Tomas Van Pottelbergh and Marek Pasieka and Andrzej Skrodzki and Nicolas Huguenin and Maxime Dumonal and Jan Kościsz and Dennis Bader and Frédérick Gusset and Mounir Benheddi and Camila Williamson and Michal Kosinski and Matej Petrik and Gaël Grosch},
title = {Darts: User-Friendly Modern Machine Learning for Time Series},
journal = {Journal of Machine Learning Research},
year = {2022},
volume = {23},
number = {124},
pages = {1-6},
url = {http://jmlr.org/papers/v23/21-1177.html}
}