在本笔记本中,我们将解释在本地和全局层面对时间序列进行时间聚合的区别。

您可以使用 Google Colab 通过 CPU 或 GPU 运行这些实验。

!pip install hierarchicalforecast utilsforecast

1. 生成数据

在本例中,我们将生成合成序列来解释本地时间聚合和全局时间聚合的区别。我们将生成两个日频率的序列。

from utilsforecast.data import generate_series
freq = "D"
n_series = 2
df = generate_series(n_series=n_series, 
                     freq=freq, 
                     min_length=2 * 365, 
                     max_length=4 * 365,  
                     equal_ends=True)

请注意,我们的两个时间序列的时间步数不同

df.groupby('unique_id', observed=True)["ds"].count()
unique_id
0    1414
1    1289
Name: ds, dtype: int64

然后我们定义时间聚合的规范。

spec  = {"year": 365, "quarter": 91, "month": 30, "week": 7, "day": 1}

2. 本地聚合(默认)

在本地聚合中,我们单独处理每个时间序列的时间戳。这意味着时间聚合只考虑每个序列的时间戳,而忽略其他序列的时间戳。

from hierarchicalforecast.utils import aggregate_temporal
Y_df_local, S_df_local, tags_local = aggregate_temporal(df, spec)

我们创建了按时间序列划分的时间聚合,因为时间聚合 month-1 对于这两个时间序列而言并不对应相同的(年,月)。这是因为 unique_id=1 的序列较短,其第一个数据点位于 2000 年 7 月,与 unique_id=0 的序列不同,后者较长,其第一个时间戳位于 2000 年 3 月。

Y_df_local.query("temporal_id == 'month-1'")
temporal_idunique_iddsy
39month-102000-03-1693.574676
87month-112000-07-1991.506421

2. 全局聚合

在全局聚合中,我们会检查所有时间序列中的所有唯一时间戳,并将时间聚合基于所有时间序列中的唯一时间戳列表。我们可以通过在 aggregate_temporal 中设置 aggregation_type 属性来指定聚合类型。

Y_df_global, S_df_global, tags_globval = aggregate_temporal(df, spec, aggregation_type="global")

我们创建了跨所有时间序列的时间聚合,因为时间聚合 month-1 对于这两个时间序列而言对应相同的(年,月)组合。由于 month-1 不存在于第二个时间序列中(因为它较短),因此聚合只有一个记录。

Y_df_global.query("temporal_id == 'month-1'")
temporal_idunique_iddsy
39month-102000-03-1693.574676

然而,对于 month-5,我们有两个时间序列的记录,因为第二个序列的第一个数据点在该月份。

Y_df_global.query("temporal_id == 'month-5'")
temporal_idunique_iddsy
43month-502000-07-1495.169659
87month-512000-07-1474.502584

因此,全局聚合确保了所有序列的时间对齐。

3. 如何选择?

  • 如果所有时间序列具有相同的长度和时间戳,则 globallocal 会产生相同的结果。
  • 默认行为是 local。这意味着除非时间序列具有相同的长度和时间戳,否则无法比较它们之间的时间聚合。这种行为通常更安全,建议在时间序列不一定相关且您正在使用例如 StatsForecast 构建每个序列的模型时使用。
  • global 行为在处理我们期望时间序列之间存在关系的情况时很有用。例如,在预测每日产品需求时,单个产品可能并不总是在所有时间步都有销售,但人们可能对所有产品的总体年度时间聚合感兴趣。global 设置更容易出错,因此请小心并仔细检查聚合结果。这通常与 MLForecastNeuralForecast 中的模型结合使用。