In dieser Lektion trainieren Sie ein univariates Zeitreihen-Prognosemodell mit dem Algorithmus AdditiveModelForecast aus der Predictive Analysis Library (PAL) von SAP HANA. Sie verwenden monatlich aggregierte Übernachtungen als Eingabedaten und prognostizieren zukünftige Werte mithilfe eines trainierten SAP-HANA-PAL-Modells. Dies ist ein Grundschritt bei der Verwendung von SAP HANA für operative Zeitreihenvorhersagen.
Der Python-Machine-Learning-Client für SAP HANA (hana-ml) stellt alle Funktionen der SAP HANA Predictive Analysis Library (PAL) sowie die Automated-Predictive-Library-Funktionen (APL-Funktionen) in Python für die Verwendung basierend auf den Eingabedaten von SAP HANA DataFrames bereit.
Als Nächstes trainieren wir ein Zeitreihenmodell für die monatlichen Aggregate mit dem Algorithmus AdditiveModelForecast [1].
12amf = AdditiveModelForecast()
amf.fit(data=hdf_overnightstays_agg)<hana_ml.algorithms.pal.tsa.additive_model_prognoast.AdditiveModelForecast unter 0x1d9bdeefb00>
Die Zeitreihenanalyse des additiven Modells verwendet ein additives Modell, um Zeitreihendaten zu prognostizieren. Sie verarbeitet Daten mit starken saisonalen Effekten und ist robust, um den historischen Trend zu verschieben.
Die additive Modellzeitreihenanalyse – auch „Prophet" genannt – verwendet ein zerlegbares Zeitreihenmodell mit drei Hauptkomponenten: Trend, Saisonalität und Feiertage oder Ereignisse.
Wir können das trainierte Modell untersuchen, indem wir einen grafischen Bericht wie folgt anzeigen:
1UnifiedReport(amf).build().display()100%|███████████| 6/6 [00:51<00:00, 8.57s/it]

SAP-HANA-DataFrame für Prognosen anlegen
Bisher haben wir keine Vorhersage erstellt. Um eine Prognose anzulegen, müssen Sie zunächst einen SAP-HANA-DataFrame anlegen, der die Termine/Monate enthält, für die Sie Prognosen wünschen.
Daher müssen wir das neueste Datum des Trainingsdatensets ermitteln, das unten angezeigt wird.
123str_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
Als Nächstes legen wir basierend auf dem letzten bekannten Datum/Monat oben einen neuen SAP-HANA-DataFrame an, der die folgenden 12 Monate anzeigt.
123456months_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()| MONTH | ZIEL | |
|---|---|---|
| 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 |
Beachten Sie die Verwendung von Binomial im Quelltext:
Binomial ist eine Funktion zur Generierung von Zufallszahlen nach einer Binomialverteilung direkt in der SAP-HANA-Datenbank. Die beiden generierten Spalten sind ID und GENERATED_NUMBER.
Anhand der Parameter der Funktion können wir erkennen, dass die generierte Zahl immer 1,0 ist, was in dieser Zelle praktisch nicht für unsere Zwecke verwendet wird. Die nützliche Spalte ist ID, bei der es sich um eine fortlaufende Zahl von 0 bis 11 handelt (die den 12 generierten Zufallszahlen zugeordnet ist).
Die Spalten-ID ist nützlich, da diese Zahl zum letzten Datum des Trainingsdatensets addiert wird, um die Daten für die Prognose zu berechnen. Sie sehen, dass das letzte Datum des Trainingsdatensets, summiert mit „ID+1", zum Wert in der Spalte MONTH wird, der dann für die Prognose verwendet wird.
Zusammenfassend lässt sich sagen, dass die Verwendung von Binomial ein Zwischenschritt (technisch statt wissenschaftlich) ist, um die Zeitstempel für die Prognose anzulegen.

Anwenden des trainierten Modells
Anschließend wenden wir das trainierte Zeitreihenmodell an, um die Übernachtungen für die folgenden 12 Monate vorherzusagen.
12hdf_predicted = amf.predict(data=hdf_future)
hdf_predicted.head(5).collect()| MONTH | YHAT | YHAT_LOWER | YHAT_UPPER | |
|---|---|---|---|---|
| 0 | 01.06.2024 | 3.892362e+06 | 3.818124e+06 | 3.963618e+06 |
| 1 | 01.07.2024 | 4.786169e+06 | 4.713556e+06 | 4.852429e+06 |
| 2 | 01.08.2024 | 4.817140e+06 | 4.743560e+06 | 4.891867e+06 |
| 3 | 01.09.2024 | 3.776572e+06 | 3.702854e+06 | 3.850597e+06 |
| 4 | 01.10.2024 | 3.535125e+06 | 3.459114e+06 | 3.610827e+06 |
Die Prognose wird im grafischen Bericht wie unten dargestellt visualisiert.
Wir beobachten eindeutig ein sich wiederholendes Muster, das im Trainingsdatenset identifiziert wird. Die meisten Übernachtungen sind im Sommer, aber auch die Wintersaison hat ihre Gipfel.
1UnifiedReport(amf).build().display()100%|███████████| 6/6 [00:50<00:00, 8.44s/it]

Historischen und prognostizierten Wert im SAP-HANA-DataFrame kombinieren
Abschließend führen wir das historische Datenset und die prognostizierten Werte wie unten gezeigt in einem einzigen SAP-HANA-DataFrame zusammen.
Um eine vollständige und kontinuierliche Sicht auf die Zeitreihen zu erstellen, ist es hilfreich, historische Daten mit zukünftigen Prognosen zu kombinieren. Dieses zusammengeführte Datenset kann verwendet werden, um Trends zu visualisieren, mit geschäftlichen Stakeholdern zu teilen oder die Daten für Systeme wie SAP Analytics Cloud zugänglich zu machen.
1234567891011hdf_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()| MONTH | OVERNIGHTSTAYS_SUM | PROGNOSE | FORECAST_LOWER | FORECAST_UPPER | |
|---|---|---|---|---|---|
| 0 | 01.01.2025 | Keine | 2.719344e+06 | 2.644614e+06 | 2.794261e+06 |
| 1 | 01.02.2025 | Keine | 3.456029e+06 | 3.376482e+06 | 3.543326e+06 |
| 2 | 01.03.2025 | Keine | 3.412205e+06 | 3.326795e+06 | 3.500738e+06 |
| 3 | 01.04.2025 | Keine | 2.878771e+06 | 2.786906e+06 | 2.965247e+06 |
| 4 | 01.05.2025 | Keine | 3.346712e+06 | 3.245006e+06 | 3.435816e+06 |
Optional können wir das zusammengeführte Datenset in einer Tabelle in SAP HANA Cloud sichern. Beispielsweise könnte SAP Analytics Cloud auf solche Daten zugreifen.
1hdf_all.save('OVERNIGHTSTAYS_FORECAST_TOTAL', force=True)<hana_ml.dataframe.DataFrame unter 0x1d9c242e0c0>