Python 中的时间序列轻松实现

darts
PyPI 版本 Conda 版本 支持的版本 Docker 镜像版本 (按日期最新) GitHub 发布日期 GitHub 工作流状态 下载 下载 codecov 代码风格: black 加入聊天室 https://gitter.im/u8darts/darts

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

Darts 还提供了广泛的异常检测功能。例如,将 PyOD 模型应用于时间序列以获取异常分数非常简单,或者将任何 Darts 预测或过滤模型封装起来以获得功能齐全的异常检测模型。

文档

高级介绍

选定主题的文章

快速安装

我们建议首先使用您喜欢的工具(condavenvvirtualenv 或结合 virtualenvwrapper)为您的项目设置一个干净的 Python 3.8+ 环境。

一旦你的环境设置好,你可以使用 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()
darts forecast example

加载一个多元序列,修剪它,保留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)
darts anomaly detection example

特性

  • 预测模型: 大量预测模型的集合;从统计模型(如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 提供了三种过滤模型:KalmanFilterGaussianProcessFilterMovingAverageFilter,这些模型允许对时间序列进行过滤,并且在某些情况下可以获得底层状态/值的概率推断。

  • 数据集 darts.datasets 子模块包含了一些流行的时间序列数据集,用于快速和可重复的实验。

预测模型

以下是目前在 Darts 中实现的预测模型的分解。我们正在不断努力引入更多的模型和功能。

模型

来源

目标序列支持:

单变量/
多变量

协变量支持:

过去观测的/
未来已知的/
静态的

概率预测:

采样/
分布参数

多序列的训练与预测

基线模型
(本地预测模型)

NaiveMean

🟩 🟩

🟥 🟥 🟥

🟥 🟥

🟥

NaiveSeasonal 是一个简单的季节性模型。

🟩 🟩

🟥 🟥 🟥

🟥 🟥

🟥

NaiveDrift

🟩 🟩

🟥 🟥 🟥

🟥 🟥

🟥

NaiveMovingAverage

🟩 🟩

🟥 🟥 🟥

🟥 🟥

🟥

统计/经典模型
(LocalForecastingModel)

ARIMA

🟩 🟥

🟥 🟩 🟥

🟩 🟥

🟥

VARIMA 是一个用于时间序列预测的模型。

🟥 🟩

🟥 🟩 🟥

🟩 🟥

🟥

AutoARIMA 是一个自动ARIMA模型。

🟩 🟥

🟥 🟩 🟥

🟥 🟥

🟥

StatsForecastAutoArima (更快的 AutoARIMA)

Nixtla 的 statsforecast

🟩 🟥

🟥 🟩 🟥

🟩 🟥

🟥

指数平滑

🟩 🟥

🟥 🟥 🟥

🟩 🟥

🟥

StatsforecastAutoETS

Nixtla 的 statsforecast

🟩 🟥

🟥 🟩 🟥

🟩 🟥

🟥

StatsforecastAutoCES

Nixtla 的 statsforecast

🟩 🟥

🟥 🟥 🟥

🟥 🟥

🟥

BATSTBATS

TBATS 论文

🟩 🟥

🟥 🟥 🟥

🟩 🟥

🟥

ThetaFourTheta

Theta & 4 Theta

🟩 🟥

🟥 🟥 🟥

🟥 🟥

🟥

StatsForecastAutoTheta

Nixtla 的 statsforecast

🟩 🟥

🟥 🟥 🟥

🟩 🟥

🟥

Prophet 模型

Prophet 仓库

🟩 🟥

🟥 🟩 🟥

🟩 🟥

🟥

FFT (快速傅里叶变换)

🟩 🟥

🟥 🟥 🟥

🟥 🟥

🟥

KalmanForecaster 使用卡尔曼滤波器和N4SID进行系统识别

N4SID 论文

🟩 🟩

🟥 🟩 🟥

🟩 🟥

🟥

Croston 方法

🟩 🟥

🟥 🟩 🟥

🟥 🟥

🟥

全局基线模型
(全局预测模型)

GlobalNaiveAggregate

🟩 🟩

🟥 🟥 🟥

🟥 🟥

🟩

GlobalNaiveDrift 是一个全局基线模型,用于时间序列预测。

🟩 🟩

🟥 🟥 🟥

🟥 🟥

🟩

GlobalNaiveSeasonal

🟩 🟩

🟥 🟥 🟥

🟥 🟥

🟩

回归模型
(全局预测模型)

RegressionModel:围绕任何sklearn回归模型的通用包装器

🟩 🟩

🟩 🟩 🟩

🟥 🟥

🟩

LinearRegressionModel 线性回归模型

🟩 🟩

🟩 🟩 🟩

🟩 🟩

🟩

随机森林

🟩 🟩

🟩 🟩 🟩

🟥 🟥

🟩

LightGBMModel 是一个用于预测的模型。

🟩 🟩

🟩 🟩 🟩

🟩 🟩

🟩

XGBModel 是一个用于时间序列预测的模型。

🟩 🟩

🟩 🟩 🟩

🟩 🟩

🟩

CatBoostModel 是一个用于预测的模型。

🟩 🟩

🟩 🟩 🟩

🟩 🟩

🟩

基于PyTorch (Lightning)的模型
(全局预测模型)

RNNModel (包括 LSTM 和 GRU); 在概率版本中相当于 DeepAR

DeepAR 论文

🟩 🟩

🟥 🟩 🟥

🟩 🟩

🟩

BlockRNNModel (包括 LSTM 和 GRU)

🟩 🟩

🟩 🟥 🟥

🟩 🟩

🟩

NBEATSModel 模型

N-BEATS 论文

🟩 🟩

🟩 🟥 🟥

🟩 🟩

🟩

NHiTSModel 模型

N-HiTS 论文

🟩 🟩

🟩 🟥 🟥

🟩 🟩

🟩

TCNModel 是一个用于时间序列预测的模型。

TCN论文, DeepTCN论文, 博客文章

🟩 🟩

🟩 🟥 🟥

🟩 🟩

🟩

TransformerModel 模型

🟩 🟩

🟩 🟥 🟥

🟩 🟩

🟩

TFTModel (时序融合变压器)

TFT论文PyTorch Forecasting

🟩 🟩

🟩 🟩 🟩

🟩 🟩

🟩

DLinearModel 是一个用于时间序列预测的模型。

DLinear 论文

🟩 🟩

🟩 🟩 🟩

🟩 🟩

🟩

NLinearModel

NLinear 论文

🟩 🟩

🟩 🟩 🟩

🟩 🟩

🟩

TiDEModel

TiDE 论文

🟩 🟩

🟩 🟩 🟩

🟩 🟩

🟩

TSMixerModel 是一个时间序列预测模型。

TSMixer 论文, PyTorch 实现

🟩 🟩

🟩 🟩 🟩

🟩 🟩

🟩

集成模型
(全局预测模型): 模型支持取决于集成预测模型及其本身

NaiveEnsembleModel

🟩 🟩

🟩 🟩 🟩

🟩 🟩

🟩

RegressionEnsembleModel

🟩 🟩

🟩 🟩 🟩

🟩 🟩

🟩

社区与联系

欢迎任何人加入我们的 Gitter 房间 来提问、提出建议、讨论用例等。如果你发现了一个错误或有建议,GitHub 问题也是受欢迎的。

如果你想要告诉我们的内容不适合在Gitter或Github上讨论,欢迎随时通过电子邮件联系我们:对于与darts相关的事务,请发送邮件至 darts@unit8.co;对于其他任何咨询,请发送邮件至 info@unit8.co

贡献

开发正在进行中,我们欢迎在 GitHub 上的建议、拉取请求和问题。所有贡献者将在 变更日志页面 上得到认可。

在开始贡献(新功能或修复)之前,请 查看我们的贡献指南

引用

如果您在科学工作中使用Darts,我们非常感谢您引用以下JMLR论文。

Darts: 用户友好的现代时间序列机器学习

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}
}

索引和表格

  • 总索引

  • 模块索引

  • 搜索