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

Darts 是一个 Python 库,用于对时间序列进行用户友好的预测和异常检测。它包含各种模型,从 ARIMA 等经典模型到深度神经网络。所有预测模型都可以使用相同的方式进行使用,通过 fit()
和 predict()
函数,类似于 scikit-learn。该库还使回测模型、结合多个模型的预测以及考虑外部数据变得容易。Darts 支持单变量和多变量时间序列及模型。基于 ML 的模型可以在包含多个时间序列的潜在大型数据集上进行训练,并且一些模型为概率预测提供了丰富的支持。
Darts 还提供了广泛的异常检测能力。例如,将 PyOD 模型应用于时间序列以获得异常分数,或者包装 Darts 的任何预测或过滤模型以获得成熟的异常检测模型都是很简单的。
文档¶
高层次介绍¶
精选主题文章¶
快速安装¶
我们建议您首先使用您喜欢的工具(conda, venv, virtualenv 带或不带 virtualenvwrapper)为您的项目设置一个干净的 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 值解释一些预测模型。
数据处理:易于对时间序列数据应用(和恢复)常见转换的工具(缩放、填充缺失值、差分、boxcox 等)
度量:用于评估时间序列拟合优度的各种度量;从 R2 分数到平均绝对比例误差。
回测:使用移动时间窗口模拟历史预测的实用工具。
PyTorch Lightning 支持:所有深度学习模型都使用 PyTorch Lightning 实现,支持自定义回调、GPU/TPU 训练和自定义训练器等。
过滤模型:Darts 提供了三种过滤模型:
KalmanFilter
、GaussianProcessFilter
和MovingAverageFilter
,它们允许过滤时间序列,并在某些情况下获得底层状态/值的概率推断。数据集
darts.datasets
子模块包含一些流行的时间序列数据集,用于快速和可复现的实验。兼容多种后端:
TimeSeries
对象可以从 pandas、polars、numpy、pyarrow、xarray 等各种后端创建并导出,从而便于与不同的数据处理库无缝集成。
预测模型¶
以下是当前 Darts 中实现的预测模型的分解。我们正在不断努力引入更多模型和功能。
模型 |
来源 |
目标序列支持: |
协变量支持: |
概率预测: |
在多个序列上进行训练和预测 |
---|---|---|---|---|---|
基线模型 |
|||||
✅ ✅ |
🔴 🔴 🔴 |
🔴 🔴 |
🔴 |
||
✅ ✅ |
🔴 🔴 🔴 |
🔴 🔴 |
🔴 |
||
✅ ✅ |
🔴 🔴 🔴 |
🔴 🔴 |
🔴 |
||
✅ ✅ |
🔴 🔴 🔴 |
🔴 🔴 |
🔴 |
||
统计/经典模型 |
|||||
✅ 🔴 |
🔴 ✅ 🔴 |
✅ 🔴 |
🔴 |
||
🔴 ✅ |
🔴 ✅ 🔴 |
✅ 🔴 |
🔴 |
||
✅ 🔴 |
🔴 🔴 🔴 |
✅ 🔴 |
🔴 |
||
✅ 🔴 |
🔴 🔴 🔴 |
🔴 🔴 |
🔴 |
||
✅ 🔴 |
🔴 ✅ 🔴 |
✅ 🔴 |
🔴 |
||
FFT(快速傅里叶变换) |
✅ 🔴 |
🔴 🔴 🔴 |
🔴 🔴 |
🔴 |
|
KalmanForecaster 使用卡尔曼滤波器和 N4SID 进行系统辨识 |
✅ ✅ |
🔴 ✅ 🔴 |
✅ 🔴 |
🔴 |
|
✅ 🔴 |
🔴 ✅ 🔴 |
✅ ✅ |
🔴 |
||
Croston 方法 |
✅ 🔴 |
🔴 ✅ 🔴 |
✅ ✅ |
🔴 |
|
StatsForecastModel,任何 StatsForecast 模型的封装 |
✅ 🔴 |
🔴 ✅ 🔴 |
✅ ✅ |
🔴 |
|
✅ 🔴 |
🔴 ✅ 🔴 |
✅ ✅ |
🔴 |
||
✅ 🔴 |
🔴 ✅ 🔴 |
✅ ✅ |
🔴 |
||
✅ 🔴 |
🔴 ✅ 🔴 |
✅ ✅ |
🔴 |
||
✅ 🔴 |
🔴 ✅ 🔴 |
✅ ✅ |
🔴 |
||
✅ 🔴 |
🔴 ✅ 🔴 |
✅ ✅ |
🔴 |
||
✅ 🔴 |
🔴 ✅ 🔴 |
✅ ✅ |
🔴 |
||
全局基线模型 |
|||||
✅ ✅ |
🔴 🔴 🔴 |
🔴 🔴 |
✅ |
||
✅ ✅ |
🔴 🔴 🔴 |
🔴 🔴 |
✅ |
||
✅ ✅ |
🔴 🔴 🔴 |
🔴 🔴 |
✅ |
||
回归模型 |
|||||
回归模型 (RegressionModel): 任何类似 scikit-learn 回归模型的封装 |
✅ ✅ |
✅ ✅ ✅ |
🔴 🔴 |
✅ |
|
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
||
✅ ✅ |
✅ ✅ ✅ |
🔴 🔴 |
✅ |
||
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
||
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
||
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
||
基于 PyTorch (Lightning) 的模型 |
|||||
RNNModel(包括 LSTM 和 GRU);在其概率版本中相当于 DeepAR |
✅ ✅ |
🔴 ✅ 🔴 |
✅ ✅ |
✅ |
|
BlockRNNModel(包括 LSTM 和 GRU) |
✅ ✅ |
✅ 🔴 🔴 |
✅ ✅ |
✅ |
|
✅ ✅ |
✅ 🔴 🔴 |
✅ ✅ |
✅ |
||
✅ ✅ |
✅ 🔴 🔴 |
✅ ✅ |
✅ |
||
✅ ✅ |
✅ 🔴 🔴 |
✅ ✅ |
✅ |
||
✅ ✅ |
✅ 🔴 🔴 |
✅ ✅ |
✅ |
||
TFTModel(时序融合 Transformer) |
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
|
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
||
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
||
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
||
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
||
集成模型 |
|||||
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
||
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
||
保形模型 |
|||||
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
||
✅ ✅ |
✅ ✅ ✅ |
✅ ✅ |
✅ |
社区与联系¶
欢迎任何人加入我们的 Gitter 聊天室 提问、提出建议、讨论用例等。如果您发现错误或有建议,也欢迎提交 GitHub issues。
如果您想告诉我们的内容不适合 Gitter 或 Github,请随时发送电子邮件至 darts@unit8.co 处理 darts 相关事宜,或发送至 info@unit8.co 处理其他任何咨询。
贡献¶
开发正在进行中,欢迎在 GitHub 上提出建议、拉取请求和提交 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}
}