Python 中的时间序列变得简单¶

Darts 是一个 Python 库,用于对时间序列进行用户友好的预测和异常检测。它包含各种模型,从 ARIMA 等经典模型到深度神经网络。所有预测模型都可以用相同的方式使用,通过 fit()
和 predict()
函数,类似于 scikit-learn。该库还使得回测模型、组合多个模型的预测以及考虑外部数据变得容易。Darts 支持单变量和多变量时间序列及模型。基于机器学习的模型可以在包含多个时间序列的潜在大型数据集上进行训练,并且一些模型为概率预测提供了丰富的支持。
Darts 还提供了广泛的异常检测功能。例如,将 PyOD 模型应用于时间序列以获取异常分数,或包装 Darts 的任何预测或滤波模型以获得完整的异常检测模型都非常容易。
文档¶
高级介绍¶
专题文章¶
快速安装¶
我们建议首先使用您喜欢的工具(conda、venv、带或不带 virtualenvwrapper 的 virtualenv)为您的项目设置一个干净的 Python 3.9+ 环境。
环境设置好后,您就可以使用 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)。请参阅下面的模型表格。
异常检测
darts.ad
模块包含异常评分器、检测器和聚合器集合,它们可以组合起来检测时间序列中的异常。很容易包装 Darts 的任何预测或滤波模型来构建一个完整的异常检测模型,该模型将预测与实际值进行比较。PyODScorer
使得在时间序列上使用 PyOD 检测器变得非常容易。多变量支持:
TimeSeries
可以是多变量的 - 即包含多个随时间变化的维度/列,而不是单一的标量值。许多模型可以处理和生成多变量序列。多序列训练(全局模型): 所有基于机器学习的模型(包括所有神经网络)都支持在多个(潜在多变量的)序列上进行训练。这也可以扩展到大型数据集。
概率支持:
TimeSeries
对象可以(可选地)表示随机时间序列;例如,这可以用于获取置信区间,并且许多模型支持不同类型的概率预测(例如估计参数分布或分位数)。一些异常检测评分器也能够利用这些预测分布。一致性预测支持: 我们的一致性预测模型允许为任何预训练的全局预测模型生成具有校准分位数区间的概率预测。
过去和未来协变量支持: Darts 中的许多模型支持将过去观测到和/或未来已知的协变量(外部数据)时间序列作为输入来生成预测。
静态协变量支持: 除了时间相关的数据外,
TimeSeries
还可以包含每个维度的静态数据,一些模型可以利用这些数据。层次调和: Darts 提供了用于执行调和的转换器。这些转换器可以使预测值以尊重底层层次结构的方式相加。
回归模型: 可以插入任何与 scikit-learn 兼容的模型,以获取作为目标序列和协变量滞后值的函数的预测。
使用样本权重进行训练: 所有全局模型都支持使用样本权重进行训练。它们可以应用于每个观测值、预测时间步和目标列。
预测起始位移: 所有全局模型都支持在位移的输出窗口上进行训练和预测。这对于例如日前市场预测,或者当协变量(或目标序列)报告延迟时非常有用。
可解释性: Darts 能够使用 Shap 值解释一些预测模型。
数据处理: 轻松应用(和还原)时间序列数据常见转换的工具(缩放、填充缺失值、差分、Box-Cox 等)
指标: 评估时间序列拟合优度的各种指标;从 R2 分数到平均绝对比例误差。
回测: 用于模拟历史预测的实用工具,使用移动时间窗口。
PyTorch Lightning 支持: 所有深度学习模型均使用 PyTorch Lightning 实现,支持自定义回调、GPU/TPU 训练和自定义训练器等功能。
滤波模型: Darts 提供了三种滤波模型:
KalmanFilter
、GaussianProcessFilter
和MovingAverageFilter
,它们允许对时间序列进行滤波,并在某些情况下获得底层状态/值的概率推断。数据集
darts.datasets
子模块包含一些流行的时间序列数据集,用于快速和可重复的实验。与多种后端的兼容性:
TimeSeries
对象可以从 pandas、polars、numpy、pyarrow、xarray 等各种后端创建和导出,从而方便地与不同的数据处理库集成。
预测模型¶
以下是 Darts 中当前实现的预测模型细分。我们正在不断努力增加更多模型和功能。
模型 |
来源 |
目标序列支持: |
协变量支持: |
概率预测: |
在多序列上训练与预测 |
---|---|---|---|---|---|
基线模型 |
|||||
✅ ✅ |
🔴 🔴 🔴 |
🔴 🔴 |
🔴 |
||
✅ ✅ |
🔴 🔴 🔴 |
🔴 🔴 |
🔴 |
||
✅ ✅ |
🔴 🔴 🔴 |
🔴 🔴 |
🔴 |
||
✅ ✅ |
🔴 🔴 🔴 |
🔴 🔴 |
🔴 |
||
统计 / 经典模型 |
|||||
✅ 🔴 |
🔴 ✅ 🔴 |
✅ 🔴 |
🔴 |
||
🔴 ✅ |
🔴 ✅ 🔴 |
✅ 🔴 |
🔴 |
||
✅ 🔴 |
🔴 🔴 🔴 |
✅ 🔴 |
🔴 |
||
✅ 🔴 |
🔴 🔴 🔴 |
🔴 🔴 |
🔴 |
||
✅ 🔴 |
🔴 ✅ 🔴 |
✅ 🔴 |
🔴 |
||
FFT(快速傅里叶变换) |
✅ 🔴 |
🔴 🔴 🔴 |
🔴 🔴 |
🔴 |
|
使用卡尔曼滤波和 N4SID 进行系统辨识的 KalmanForecaster |
✅ ✅ |
🔴 ✅ 🔴 |
✅ 🔴 |
🔴 |
|
✅ 🔴 |
🔴 ✅ 🔴 |
✅ ✅ |
🔴 |
||
Croston 方法 |
✅ 🔴 |
🔴 ✅ 🔴 |
✅ ✅ |
🔴 |
|
StatsForecastModel,任何 StatsForecast 模型的包装器 |
✅ 🔴 |
🔴 ✅ 🔴 |
✅ ✅ |
🔴 |
|
✅ 🔴 |
🔴 ✅ 🔴 |
✅ ✅ |
🔴 |
||
✅ 🔴 |
🔴 ✅ 🔴 |
✅ ✅ |
🔴 |
||
✅ 🔴 |
🔴 ✅ 🔴 |
✅ ✅ |
🔴 |
||
✅ 🔴 |
🔴 ✅ 🔴 |
✅ ✅ |
🔴 |
||
✅ 🔴 |
🔴 ✅ 🔴 |
✅ ✅ |
🔴 |
||
✅ 🔴 |
🔴 ✅ 🔴 |
✅ ✅ |
🔴 |
||
全局基线模型 |
|||||
✅ ✅ |
🔴 🔴 🔴 |
🔴 🔴 |
✅ |
||
✅ ✅ |
🔴 🔴 🔴 |
🔴 🔴 |
✅ |
||
✅ ✅ |
🔴 🔴 🔴 |
🔴 🔴 |
✅ |
||
回归模型 |
|||||
回归模型:任何类似 scikit-learn 的回归模型的包装器 |
✅ ✅ |
✅ ✅ ✅ |
🔴 🔴 |
✅ |
|
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
||
✅ ✅ |
✅ ✅ ✅ |
🔴 🔴 |
✅ |
||
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
||
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
||
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
||
基于 PyTorch (Lightning) 的模型 |
|||||
RNNModel(包括 LSTM 和 GRU);其概率版本相当于 DeepAR |
✅ ✅ |
🔴 ✅ 🔴 |
✅ ✅ |
✅ |
|
BlockRNNModel(包括 LSTM 和 GRU) |
✅ ✅ |
✅ 🔴 🔴 |
✅ ✅ |
✅ |
|
✅ ✅ |
✅ 🔴 🔴 |
✅ ✅ |
✅ |
||
✅ ✅ |
✅ 🔴 🔴 |
✅ ✅ |
✅ |
||
✅ ✅ |
✅ 🔴 🔴 |
✅ ✅ |
✅ |
||
✅ ✅ |
✅ 🔴 🔴 |
✅ ✅ |
✅ |
||
TFTModel(时态融合 Transformer) |
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
|
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
||
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
||
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
||
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
||
集成模型 |
|||||
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
||
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
||
一致性模型 |
|||||
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
||
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
社区与联系方式¶
欢迎任何人加入我们的 Gitter 聊天室提问、提出建议、讨论用例等等。如果您发现错误或有建议,也欢迎在 GitHub 上提出 Issue。
如果您想告诉我们的内容不适合在 Gitter 或 Github 上提出,请随时发送电子邮件至 darts@unit8.co 处理与 darts 相关的事项,或发送至 info@unit8.co 进行其他任何咨询。
贡献¶
开发正在进行中,我们欢迎在 GitHub 上提出建议、拉取请求 (pull requests) 和 Issue。所有贡献者都将在变更日志页面上被致谢。
在进行贡献(新特性或修复)之前,请查看我们的贡献指南。
引用¶
如果您在科学工作中使用 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}
}