Prévision dans toutes les séries chronologiques groupées

Objective

After completing this lesson, you will be able to implémentez une logique de prévision dans des séries chronologiques groupées à l'aide de SAP HANA PAL.

Prévision de séries chronologiques multiples

Dans les scénarios de prévision réels, il est courant de générer des prévisions distinctes pour plusieurs catégories, telles que les pays, les points de vente ou les lignes de produits. Cette leçon explique comment mettre à l'échelle la prévision de série temporelle dans de nombreux groupes de ce type à l'aide du paramètre group_key dans SAP HANA PAL et de la logique de boucle personnalisée.

Entraînement du modèle avec l'algorithme AdditiveModelForecast

Le client d'apprentissage automatique Python pour SAP HANA (hana-ml) expose toutes les fonctions SAP HANA Predictive Analysis Library (PAL) ainsi que les fonctions Automated Predictive Library (APL) dans Python pour une utilisation basée sur les données de saisie SAP HANA DataFrames.

Ensuite, nous entraînons des modèles individuels à l'aide du même algorithme AdditiveModelForecast [1], comme nous l'avons fait pour le scénario de modèle de série temporelle univariée.

Cependant, nous spécifions maintenant le pays de résidence comme clé de groupe, qui fournit des modèles individuels pour chaque pays.

Code Snippet
12
amf = AdditiveModelForecast(massive=True) amf.fit(data=hdf_overnightstays_agg, group_key='COUNTRYOFRESIDENCE')

<hana_ml.algorithms.pal.tsa.additive_model_preast.AdditiveModelForecast à l'adresse 0x1d9c79d7020>

Prévision basée sur une série temporelle - Individuellement par pays

Nous créons un DataFrame SAP HANA qui contient les dates/mois pour lesquels nous voulons créer une prévision.

Ensuite, nous commençons par identifier le mois le plus récent à partir de l'historique de la formation.

Code Snippet
1234
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

Maintenant, nous créons un DataFrame SAP HANA qui contient le premier jour des mois souhaités pour la prévision.

Code Snippet
123456
months_to_forecast=12 hdf_overnightstays_future = binomial(conn, n=1, p=1, num_random=months_to_forecast) hdf_overnightstays_future = hdf_overnightstays_future.select('*', (f'''ADD_MONTHS(TO_DATE ('{str_lastdate}', 'YYYY-MM-DD'), ID+1)''', 'MONTH') ) hdf_overnightstays_future = hdf_overnightstays_future.select('MONTH', ('0', 'TARGET')) hdf_overnightstays_future.head(10).collect()
 MOISCIBLE
02024-06-010
12024-07-010
22024-08-010
32024-09-010
42024-10-010
52024-11-010
62024-12-010
72025-01-010
82025-02-010
92025-03-010

Ensuite, nous créons un DataFrame SAP HANA qui contient les pays pour lesquels des prévisions doivent être fournies.

Code Snippet
123
hdf_overnightstays_countries = hdf_overnightstays.agg([('sum', 'OVERNIGHTSTAYS', 'TOTAL' )], group_by='COUNTRYOFRESIDENCE' ) \ .sort('TOTAL', desc=True).select('COUNTRYOFRESIDENCE').head(10) hdf_overnightstays_countries.collect()
 COUNTRYOFRESIDENCE
0Suisse
1Allemagne
2United States
3Royaume-Uni
4France
5Italie
6Pays-Bas
7Belgique
8Inde
9Espagne

Ensuite, nous combinons les deux DataFrames SAP HANA ci-dessus pour créer un nouveau DataFrame contenant les dates/mois futurs pour chaque pays.

Code Snippet
123
hdf_overnightstays_topredict = hdf_overnightstays_future.add_id().set_index('ID').join(hdf_overnightstays_countries.add_id('ID').set_index('ID'), how='cross' ) hdf_overnightstays_topredict = hdf_overnightstays_topredict.drop('ID') hdf_overnightstays_topredict.head(10).collect()
 MOISCIBLECOUNTRYOFRESIDENCE
001/06/20240Suisse
101/06/20240Allemagne
201/06/20240United States
301/06/20240Royaume-Uni
401/06/20240France
501/06/20240Italie
601/06/20240Pays-Bas
701/06/20240Belgique
801/06/20240Inde
901/06/20240Espagne

Application du modèle pour générer des prévisions

Ensuite, nous évaluons le modèle de série temporelle entraîné pour créer des prévisions pour les pays individuels pour les dates indiquées.

Code Snippet
12
hdf_overnightstays_pred = amf.predict(data=hdf_overnightstays_topredict, group_key='COUNTRYOFRESIDENCE') hdf_overnightstays_predicted = hdf_overnightstays_pred[0]

Nous pouvons examiner les détails des composants de la prévision, c'est-à-dire la tendance, la saisonnalité, comme illustré ci-dessous :

Code Snippet
1
hdf_overnightstays_pred[1].collect()
 ID GROUPEMOISTENDANCESAISONALVACANCESEXOGÉNEUF
0Belgique01/06/202446941,398949{"saisonnalités":3149.2922197280824}{}{}
1Belgique01/07/202446645,399501{"saisonnalités":53969.69442748901}{}{}
2Belgique01/08/202446339,533404{"saisonnalités":47670.95477129075}{}{}
3Belgique01/09/202446033,667307{"saisonnalités":-10867.900939089028}{}{}
4Belgique01/10/202445737,667859{"saisonnalités":-35024.826999824596}{}{}
.....................
115United States01/01/2025256174,088611{"saisonnalités":-105260.40367463966}{}{}
116United States01/02/2025255710,827254{"saisonnalités":-107113.21705733694}{}{}
117United States01/03/2025255292,397641{"saisonnalités":-63771.189585235305}{}{}
118United States2025-04-01254829,136284{"saisonnalités":-74262.95570659888}{}{}
119United States2025-05-01254380,818842{"saisonnalités":35157.57804977409}{}{}

120 lignes × 6 colonnes

Évaluation de l'exactitude

Nous vérifions s'il existe des erreurs comme suit :

Code Snippet
1
hdf_overnightstays_pred[2].collect()

GROUP_ID ERROR_TIMESTAMP ERRORCODE MESSAGE

Nous tracons les prévisions spécifiquement pour l'Allemagne comme vu ci-dessous:

Code Snippet
12
forecast_line_plot(pred_data=hdf_overnightstays_predicted.filter(''' "GROUP_ID" = 'Germany' ''').drop('GROUP_ID').set_index('MONTH'), confidence=("YHAT_LOWER", "YHAT_UPPER"), enable_plotly=True)
Prévision pour l'Allemagne tracée dans un graphique linéaire

Maintenant, nous tracons les prévisions pour les États-Unis comme suit :

Code Snippet
12
forecast_line_plot(pred_data=hdf_overnightstays_predicted.filter(''' "GROUP_ID" = 'United States' ''').drop('GROUP_ID').set_index('MONTH'), confidence=("YHAT_LOWER", "YHAT_UPPER"), enable_plotly=True)
Prévision pour les États-Unis tracée dans un graphique linéaire

Nous pouvons combiner le jeu de données historique utilisé pour entraîner le modèle et les valeurs prévisionnelles dans un seul DataFrame SAP HANA comme indiqué ci-dessous :

Code Snippet
123456789
hdf_overnightstays_predicted = hdf_overnightstays_predicted.select( 'MONTH', ('GROUP_ID', 'COUNTRYOFRESIDENCE'), ('NULL', 'OVERNIGHTSTAYS_SUM'), ('YHAT', 'FORECAST'), ('YHAT_LOWER', 'FORECAST_LOWER'), ('YHAT_UPPER', 'FORECAST_UPPER') ) hdf_overnightstays_predicted.head(10).collect()
 MOISCOUNTRYOFRESIDENCESOMMES_HTSTAYS_OVERNIGHTSTAYSPRÉVISIONFORECAST_LOWERFORECAST_UPPER
001/06/2024BelgiqueAucune50090,69116947179,35458952902,229641
101/07/2024BelgiqueAucune100615,09392897772,912096103203,241535
201/08/2024BelgiqueAucune94010,48817591129,24329696876,143447
301/09/2024BelgiqueAucune35165,76636832295,30331338081,503388
401/10/2024BelgiqueAucune10712,8408597792,91422413545,382103
501/11/2024BelgiqueAucune15575,70697312869,71051118361,714953
601/12/2024BelgiqueAucune43761,77340240908,29150946512,689291
701/01/2025BelgiqueAucune22965,28217820305,02596125710,640517
801/02/2025BelgiqueAucune36852,83205333948,72528639735,768094
901/03/2025BelgiqueAucune42565,99072739522,28448745665,217573
Code Snippet
123456
hdf_overnightstays_agg = hdf_overnightstays_agg.select('*', ('NULL', 'FORECAST'), ('NULL', 'FORECAST_LOWER'), ('NULL', 'FORECAST_UPPER') ) hdf_overnightstays_all = hdf_overnightstays_predicted.union(hdf_overnightstays_agg) hdf_overnightstays_all.sort('MONTH').tail(20).collect()
 MOISCOUNTRYOFRESIDENCESOMMES_HTSTAYS_OVERNIGHTSTAYSPRÉVISIONFORECAST_LOWERFORECAST_UPPER
001/04/2025ItalieAucune7.301358e+046.667947e+047.887995e+04
101/04/2025United StatesAucune1.805662e+051.680320e+051.921834e+05
201/04/2025Royaume-UniAucune9.974975e+049.186932e+041.070457e+05
301/04/2025BelgiqueAucune2.574547e+042.259784e+042.862533e+04
401/04/2025SuisseAucune1.378666e+061.322983e+061,430933e+06
501/04/2025EspagneAucune3.213217e+042.940963e+043.476349e+04
601/04/2025IndeAucune6.515502e+045.293711e+047.653153e+04
701/04/2025AllemagneAucune2.407886e+052.251664e+052.552813e+05
801/04/2025FranceAucune1.020115e+059.917646e+041.046622e+05
901/04/2025Pays-BasAucune3.838326e+043.441906e+044.207428e+04
1001/05/2025United StatesAucune2.895384e+052.755186e+053.024338e+05
1101/05/2025ItalieAucune6.399058e+045.780458e+046.952312e+04
1201/05/2025Royaume-UniAucune1.080254e+059.963275e+041.155868e+05
1301/05/2025SuisseAucune1.502996e+061,445847e+061,553558e+06
1401/05/2025IndeAucune1.180078e+051.052617e+051.293825e+05
1501/05/2025FranceAucune1,204332e+051.173433e+051.233076e+05
1601/05/2025EspagneAucune3,689542e+043.382324e+043.987497e+04
1701/05/2025Pays-BasAucune5.181526e+044.768336e+045.550257e+04
1801/05/2025AllemagneAucune2.789746e+052.621818e+052.946275e+05
1901/05/2025BelgiqueAucune1.842008e+041.533416e+042.117920e+04

Le cas échéant, nous pouvons sauvegarder le jeu de données fusionné dans une table dans SAP HANA Cloud. Par exemple, SAP Analytics Cloud peut accéder à ces données.

Code Snippet
1
hdf_overnightstays_all.save('OVERNIGHTSTAYS_FORECAST_COUNTRIES', force=True)

<hana_ml.dataframe.DataFrame à l'adresse 0x1d9c79d69f0>

Enfin, nous tracons l'ensemble du jeu de données, c'est-à-dire les valeurs et prévisions historiques, pour un seul pays - dans ce cas, pour l'Allemagne.

Code Snippet
1
hdf_overnightstays_data = hdf_overnightstays_all.filter('''"COUNTRYOFRESIDENCE" = 'Germany' ''').collect()
Code Snippet
12345678910111213
fig, ax = plt.subplots() ax.fill_between(hdf_overnightstays_data['MONTH'].values, hdf_overnightstays_data['FORECAST_LOWER'].values, hdf_overnightstays_data['FORECAST_UPPER'].values, alpha=0.2) ax.plot(hdf_overnightstays_data['MONTH'].values, hdf_overnightstays_data['OVERNIGHTSTAYS_SUM'].values, '-') plt.xticks(rotation=45) plt.xlabel("MONTH") plt.ylabel("OVERNIGHTSTAYS") plt.grid() plt.show()
Graphique montrant l'ensemble du jeu de données de valeurs historiques et prévisionnelles pour un seul pays, l'Allemagne

Références