TimeSeries

TimeSeries 是 Darts 中的主要数据类。一个 TimeSeries 表示一个单变量或多变量时间序列,具有适当的时间索引。时间索引可以是 pandas.DatetimeIndex 类型(包含日期时间),或者是 pandas.RangeIndex 类型(包含整数;用于表示没有特定时间戳的顺序数据)。在某些情况下,TimeSeries 甚至可以表示 概率 序列,例如为了获得置信区间。

TimeSeries 在 Darts 中用于提供一个专门针对时间序列的一致 API:

  • TimeSeries 保证具有适当的时间索引(基于整数或日期时间):完整且按时间排序。

  • Darts 中的所有模型都消耗 TimeSeries 并生成 TimeSeries

  • TimeSeries 允许进行各种时间序列操作(如在时间戳处分割、连接等)。

  • TimeSeries 提供了用户友好的方式来表示多维和概率性序列(例如,获取边际分位数)。

使用专门的时间序列类型(而不是像Pandas DataFrame、NumPy数组等)可以避免依赖于不同模型和函数所期望的格式的约定。

多元时间序列 -vs- 多重时间序列

我们将单变量与多变量序列区分开来:

  • 多元 序列包含多个维度(即每个时间步有多个值)。

  • 单变量 序列只包含一个维度(即,每个时间步只有一个标量值)。

有时维度被称为 组件 。一个单独的 TimeSeries 对象可以是单变量(如果它只有一个组件),或者是多变量(如果它有多个组件)。在多变量序列中,所有组件共享相同的时间轴。也就是说,它们共享相同的时间戳。

Darts 中的一些模型(以及所有机器学习模型)支持多元时间序列。这意味着它们可以接受多元时间序列作为输入(无论是作为目标还是协变量),并且它们生成的预测将具有与目标相匹配的维度。

此外,一些模型可以处理 多个时间序列 ,这意味着它们可以在多个 TimeSeries 对象上进行训练,并一次性用于预测多个 TimeSeries 对象。这有时被称为面板数据。在这种情况下,不同的 TimeSeries 不需要共享相同的时间索引——例如,一些序列可能在1990年,而其他序列可能在2000年。事实上,这些序列甚至不需要具有相同的频率。处理多个序列的模型期望在输入中使用 TimeSeries 的Python Sequence``(例如,一个简单的 ``TimeSeries 列表)。

figure1

图1: 一个单一的多变量序列。在Darts中,这由一个单一的 TimeSeries 对象表示。

figure2

图2: 多时间序列。在 Darts 中,这由多个 TimeSeries 对象表示。这些序列可能共享相同的时间轴,也可能不共享,可能是一元的,也可能是多元的。

  • 多元时间序列示例: 单个患者随时间变化(一个包含2个成分的多元时间序列)的血压和心率。

  • 多系列示例: 多个患者的血压和心率;可能对不同患者在不同时间进行测量(每个患者有一个包含2个成分的多变量系列)。

我应该为我的问题使用多元序列还是多个序列?

使用多元时间序列将为模型提供捕捉维度联合的机会,而使用多个时间序列将使模型暴露于多个观测中。因此,哪种表示是正确的取决于问题,在某些情况下甚至可能事先不清楚,需要进行实验。尽管如此,如果你处于试图对随时间一起变化的几个“相关”组件进行建模的情况(例如,移动物体的坐标,或与单个实体相关的多个测量值),通常自然地将这些捕捉为单个序列中的多个组件。另一方面,如果你有多个此类测量的实例(例如,在不同的实验或观测中获得),这可能意味着你有多个时间序列。此外,如果你的值不共享相同的时间跨度,它们可能应该表示为不同的序列。

概率性与确定性序列

在Darts中,概率预测通过从底层概率模型中抽取蒙特卡洛样本来表示。这种表示方式允许 TimeSeries 表示任意联合分布(在时间和组件上),而不依赖于任何预定义的参数形式。基于此,我们定义了两种类型的时间序列:

  • 一个**概率性**(或**随机性**)序列包含多个样本。

  • 一个 确定性 序列只包含一个样本。

创建 TimeSeries

TimeSeries 对象可以使用工厂方法创建,例如:

  • TimeSeries.from_dataframe() 可以从一个包含一个或多个表示值的列的Pandas DataFrame创建 ``TimeSeries``(列对应于组件,多个列对应于多元序列)。

  • TimeSeries.from_values() 可以从一个一维、二维或三维的 NumPy 数组创建 TimeSeries。它将生成一个基于整数的时间索引(类型为 pandas.RangeIndex)。一维对应于单变量确定性序列,二维对应于多变量确定性序列,三维对应于多变量随机序列。

  • TimeSeries.from_times_and_values() 类似于 TimeSeries.from_values(),但还接受一个时间索引。

更多方法记录在 TimeSeries API 文档 中。

此外,可以使用函数 concatenate() 沿不同的轴连接系列。axis=0 对应于时间,axis=1 对应于组件,axis=2 对应于随机样本维度。例如:

from darts import concatenate

my_multivariate_series = concatenate([series1, series2, ...], axis=1)

从一些共享相同时间轴的序列中生成一个多变量序列。

实现

在幕后,TimeSeries 封装了一个三维的 xarray.DataArray 对象。其维度为 (时间, 分量, 样本),其中 分量 维度的大小大于 1 表示多元序列,而 样本 维度的大小大于 1 表示随机序列。DataArray 本身由一个三维的 NumPy 数组支持,并且在 时间 维度上有一个时间索引(可以是 pandas.DatetimeIndexpandas.RangeIndex),在 *分量*(或“列”)维度上有一个 pandas.IndexTimeSeries 旨在是不可变的,大多数操作会返回新的 TimeSeries 对象。

TimeSeries 导出数据

TimeSeries 对象提供了几种导出数据的方式,例如:

静态协变量

可选地,TimeSeries 对象可以包含静态数据(称为 静态协变量 ),某些模型可以利用这些数据。静态协变量的例子可以是:

  • 存储位置 - 例如在多元序列中每个存储(组件)的位置

  • 产品ID

  • 传感器类型

静态协变量必须由一个 pandas DataFrame 指定,其行与 TimeSeries 的组件匹配,其列表示静态协变量的维度。它们可以在使用大多数工厂方法时通过 static_covariates 参数添加到 TimeSeries 中。它们也可以使用 with_static_covariates() 方法添加到现有的 TimeSeries 中。

层次时间序列

可选地,TimeSeries 对象可以包含一个层次结构,该层次结构指定了其不同组件如何分组在一起。层次结构本身被指定为一个Python字典,将组件的名称映射到层次结构中其父组件名称的列表。

例如,以下层次结构表示两个组件 "a""b" 相加得到 "total":

hierarchy = {"a": ["total"], "b": ["total"]}

层次结构可用于事后预测协调。Darts 提供了几种协调转换器(可与 fit()/transform()一起使用) - 请参阅 相应的 API 文档

更多信息和文档

TimeSeries 类的所有属性和方法列表可以在 API 文档 中找到。此外,快速入门 包含了一些 TimeSeries 操作的示例。