使用 SAP HANA PAL 构建单变量预测模型

学习目标

  • 应用 SAP HANA PAL 在过夜数据集上训练单变量时间序列模型。

在本课中,您将使用 SAP HANA 预测分析库 (PAL) 中的 AdditiveModelForecast 算法训练单变量时间序列预测模型。您将使用每月聚合过夜作为输入数据,并使用训练的 SAP HANA PAL 模型预测未来值。这是使用 SAP HANA 进行操作时间序列预测的基础步骤。

面向 SAP HANA 的 Python 机器学习客户端 (hana-ml) 公开所有 SAP HANA 预测分析库 (PAL) 函数以及 Python 中的自动预测库 (APL) 函数,以便基于 SAP HANA DataFrame 输入数据使用。

接下来,我们通过使用 AdditiveModelForecast 算法 [1] 在每月聚合上训练时间序列模型。

amf = AdditiveModelForecast()
amf.fit(data=hdf_overnightstays_agg)

<hana_ml.algorms.pal.tsa.additive_model_forecast.AdditiveModelForecast,网址为 0x1d9bdeefb00>

附加模型时间序列分析使用附加模型来预测时间序列数据。它处理具有强烈季节性影响的数据,并可用于改变历史趋势。

相加模型时间序列分析(也称为"先知")使用具有三个主要组件的可分解时间序列模型:趋势、季节性和假期或事件。

我们可以通过查看如下所示的图形报表来浏览经过训练的模型:

UnifiedReport(amf).build().display()

100%|&1,&3,8.57 年

时间序列报表中训练数据的图形显示。

创建用于预测的 SAP HANA 数据框架

到目前为止,我们未创建预测。为了创建预测,我们首先需要创建一个 SAP HANA DataFrame,其中包含我们希望预测的日期/月份。

因此,我们需要了解下面显示的训练数据集的最近日期。

str_lastdate = hdf_overnightstays_agg.tail(1, ref_col='MONTH').collect().iloc[0,0]
str_lastdate = str(str_lastdate)[0:10]
print(str_lastdate)

2024-05-01

接下来,根据上面显示的上一个已知日期/月份,我们创建了一个新的 SAP HANA 数据框架,其中显示接下来的 12 个月。

months_to_forecast=12

hdf_future = binomial(conn, n=1, p=1, num_random=months_to_forecast)
hdf_future = hdf_future.select('*', (f'''ADD_MONTHS(TO_DATE ('{str_lastdate}', 'YYYY-MM-DD'), ID+1)''', 'MONTH') )
hdf_future = hdf_future.select('MONTH', ('0', 'TARGET'))
hdf_future.head(20).collect()

月份

目标

0

2024-06-01

0

1

2024-07-01

0

2

2024-08-01

0

3

2024-09-01

0

4

2024-10-01

0

5

2024-11-01

0

6

2024-12-01

0

7

2025-01-01

0

8

2025-02-01

0

9

2025-03-01

0

10

2025-04-01

0

11

2025-05-01

0

请注意在代码中使用二进制:

二项式是一个函数,旨在直接在 SAP HANA 数据库中按照二项分布生成随机数。生成的两列为 ID 和 GENERATED_NUMBER。

根据赋予函数的参数,我们可以理解生成的数字始终为 1.0,这实际上不用于我们在此单元格中的目的。有用的列是 ID,它是从 0 到 11 的连续编号(与 12 个生成的随机数相关联)。

列标识很有用,因为该数字汇总为训练数据集的 last_date,因此用于计算预测日期。可以看到由"ID+1"汇总的训练数据集的 last_date 成为 MONTH 列中的值,然后用于预测。

总之,二项式的使用是创建预测时戳的中间步骤(技术步骤,而非科学步骤)。

代码和已生成数据的屏幕截图:有关详细信息,请参阅随附文本。

应用训练模型

之后,我们应用训练的时间序列模型来预测未来 12 个月的过夜。

hdf_predicted = amf.predict(data=hdf_future)
hdf_predicted.head(5).collect()

月份

YHAT

YHAT_LOWER

YHAT_UPPER

0

2024-06-01

3.892362e+06

3.818124e+06

3.963618e+06

1

2024-07-01

4.786169e+06

4.713556e+06

4.852429e+06

2

2024-08-01

4.817140e+06

4.743560e+06

4.891867e+06

3

2024-09-01

3.776572e+06

3.702854e+06

3.850597e+06

4

2024-10-01

3.535125e+06

3.459114e+06

3.610827e+06

我们在图形报表中可视化预测,如下所示。

我们清楚地观察到训练数据集中识别的重复模式。大部分过夜都在夏天,但冬季也有它的峰值。

UnifiedReport(amf).build().display()

100%|&1&3,&3,&3,8.44 秒

在时间序列报表中,以图形方式显示训练数据和预测结果

在 SAP HANA 数据框架中组合历史值和预测值

最后,我们将历史数据集和预测值合并到单个 SAP HANA DataFrame 中,如下所示。

要创建时间序列的完整连续视图,可以将历史数据与未来的预测相结合。此合并数据集可用于可视化趋势、与业务利益相关方共享或使 SAP Analytics Cloud 等系统可以访问数据。

hdf_predicted = hdf_predicted.select('MONTH',
('NULL', 'OVERNIGHTSTAYS_SUM'),
('YHAT', 'FORECAST'),
('YHAT_LOWER', 'FORECAST_LOWER'),
('YHAT_UPPER', 'FORECAST_UPPER'))
hdf_overnightstays_agg = hdf_overnightstays_agg.select('*',
('NULL', 'FORECAST'),
('NULL', 'FORECAST_LOWER'),
('NULL', 'FORECAST_UPPER'))
hdf_all = hdf_predicted.union(hdf_overnightstays_agg)
hdf_all.sort('MONTH').tail(5).collect()

月份

OVERNIGHTSTAYS_SUM

预测

FORECAST_LOWER

FORECAST_UPPER

0

2025-01-01

2.719344e+06

2.644614e+06

2.794261e+06

1

2025-02-01

3.456029e+06

3.376482e+06

3.543326e+06

2

2025-03-01

3.412205e+06

3.326795e+06

3.500738e+06

3

2025-04-01

2.878771e+06

2.786906e+06

2.965247e+06

4

2025-05-01

3.346712e+06

3.245006e+06

3.435816e+06

或者,我们可以将合并的数据集保存到 SAP HANA Cloud 中的表。例如,SAP Analytics Cloud 可以访问此类数据。

hdf_all.save('OVERNIGHTSTAYS_FORECAST_TOTAL', force=True)

<0x1d9c242e0c0 上的 <hana_ml.dataframe.DataFrame>

参考

[1]SAP HANA PAL 算法 - 附加模型预测