时间序列调和
本地与全局时间聚合
在本地或全局层面进行时间层次聚合。
在本笔记本中,我们将解释在本地和全局层面对时间序列进行时间聚合的区别。
您可以使用 Google Colab 通过 CPU 或 GPU 运行这些实验。
1. 生成数据
在本例中,我们将生成合成序列来解释本地时间聚合和全局时间聚合的区别。我们将生成两个日频率的序列。
请注意,我们的两个时间序列的时间步数不同
然后我们定义时间聚合的规范。
2. 本地聚合(默认)
在本地聚合中,我们单独处理每个时间序列的时间戳。这意味着时间聚合只考虑每个序列的时间戳,而忽略其他序列的时间戳。
我们创建了按时间序列划分的时间聚合,因为时间聚合 month-1
对于这两个时间序列而言并不对应相同的(年,月)。这是因为 unique_id=1
的序列较短,其第一个数据点位于 2000 年 7 月,与 unique_id=0
的序列不同,后者较长,其第一个时间戳位于 2000 年 3 月。
temporal_id | unique_id | ds | y | |
---|---|---|---|---|
39 | month-1 | 0 | 2000-03-16 | 93.574676 |
87 | month-1 | 1 | 2000-07-19 | 91.506421 |
2. 全局聚合
在全局聚合中,我们会检查所有时间序列中的所有唯一时间戳,并将时间聚合基于所有时间序列中的唯一时间戳列表。我们可以通过在 aggregate_temporal
中设置 aggregation_type
属性来指定聚合类型。
我们创建了跨所有时间序列的时间聚合,因为时间聚合 month-1
对于这两个时间序列而言对应相同的(年,月)组合。由于 month-1
不存在于第二个时间序列中(因为它较短),因此聚合只有一个记录。
temporal_id | unique_id | ds | y | |
---|---|---|---|---|
39 | month-1 | 0 | 2000-03-16 | 93.574676 |
然而,对于 month-5
,我们有两个时间序列的记录,因为第二个序列的第一个数据点在该月份。
temporal_id | unique_id | ds | y | |
---|---|---|---|---|
43 | month-5 | 0 | 2000-07-14 | 95.169659 |
87 | month-5 | 1 | 2000-07-14 | 74.502584 |
因此,全局聚合确保了所有序列的时间对齐。
3. 如何选择?
- 如果所有时间序列具有相同的长度和时间戳,则
global
和local
会产生相同的结果。 - 默认行为是
local
。这意味着除非时间序列具有相同的长度和时间戳,否则无法比较它们之间的时间聚合。这种行为通常更安全,建议在时间序列不一定相关且您正在使用例如StatsForecast
构建每个序列的模型时使用。 global
行为在处理我们期望时间序列之间存在关系的情况时很有用。例如,在预测每日产品需求时,单个产品可能并不总是在所有时间步都有销售,但人们可能对所有产品的总体年度时间聚合感兴趣。global
设置更容易出错,因此请小心并仔细检查聚合结果。这通常与MLForecast
或NeuralForecast
中的模型结合使用。