그룹화된 시계열의 예측

Objective

After completing this lesson, you will be able to SAP HANA PAL을 사용하여 그룹화된 시계열에서 예측 로직을 구현합니다.

다중 시계열 예측

실제 예측 시나리오에서는 국가, 점포 또는 제품 라인과 같은 여러 범주에 대해 별도의 예측을 생성하는 것이 일반적입니다. 이 소단원에서는 SAP HANA PAL의 group_key 매개변수와 사용자 정의 루프 로직을 사용하여 이러한 여러 그룹에서 시계열 예측을 조정하는 방법을 설명합니다.

AdditionModelForecast 알고리즘으로 모델 훈련

SAP HANA용 Python 기계 학습 클라이언트(hana-ml)는 SAP HANA DataFrames 입력 데이터를 기반으로 사용할 수 있도록 Python에서 모든 SAP HANA Predictive Analysis Library(PAL) 함수와 Automated Predictive Library(APL) 함수를 표시합니다.

다음으로, 단일 변량 시계열 모델 시나리오와 동일한 AdditiveModelForecast 알고리즘 [1]을 사용하여 개별 모델을 훈련합니다.

그러나 이제 거주 국가를 그룹 키로 지정하여 각 국가에 대한 개별 모델을 제공합니다.

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

<hana_ml.algorithms.pal.tsa.addantive_model_forecast.AdditiveModelForecast - 0x1d9c79d7020>

시계열 예측 - 국가별

예측을 생성할 일자/월이 포함된 SAP HANA DataFrame을 생성합니다.

다음으로 교육 이력에서 가장 최근 월을 파악하는 것으로 시작합니다.

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

이제 원하는 월의 첫 번째 일자가 포함된 SAP HANA DataFrame을 생성하여 예상합니다.

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()
 MONTH대상
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

그런 다음 예측이 제공될 국가를 포함하는 SAP HANA DataFrame을 생성합니다.

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
0스위스
1독일
2미국
3영국
4프랑스
5이탈리아
6네덜란드
7벨기에
8인도
9스페인

다음 두 개의 SAP HANA DataFrame을 결합하여 각 국가의 미래 일자/월이 포함된 새로운 DataFrame을 생성합니다.

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()
 MONTH대상COUNTRYOFRESIDENCE
02024-06-010스위스
12024-06-010독일
22024-06-010미국
32024-06-010영국
42024-06-010프랑스
52024-06-010이탈리아
62024-06-010네덜란드
72024-06-010벨기에
82024-06-010인도
92024-06-010스페인

모델을 적용하여 예측 생성

그런 다음 훈련된 시계열 모델을 채점하여 지정된 일자의 개별 국가에 대한 예측을 생성합니다.

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

아래 그림과 같이 예측 구성요소의 세부사항, 즉 추세, 계절적 변동을 살펴볼 수 있습니다.

Code Snippet
1
hdf_overnightstays_pred[1].collect()
 그룹 IDMONTH추세계절휴일EXOGENOUS
0벨기에2024-06-0146941.398949{"seasonalities":3149.2922197280824}{}{}
1벨기에2024-07-0146645.399501{"seasonalities":539699.69442748901}{}{}
2벨기에2024-08-0146339.533404{"계절성":47670.95477129075}{}{}
3벨기에2024-09-0146033.667307{"계절성":-10867.900939089028}{}{}
4벨기에2024-10-0145737.667859{"계절성":-35024.826999824596}{}{}
.....................
115미국2025-01-01256174.088611{"계절성":-105260.40367463966}{}{}
116미국2025-02-01255710.827254{"계절적 변동":-107113.21705733694}{}{}
117미국2025-03-01255292.397641{"계절성":-63771.189585235305}{}{}
118미국2025-04-01254829.136284{"계절성":-74262.95570659888}{}{}
119미국2025-05-01254380.818842{"계절성":35157.578049777409}{}{}

120행 × 6열

정확도 평가

다음과 같이 오류가 있는지 확인합니다.

Code Snippet
1
hdf_overnightstays_pred[2].collect()

GROUP_ID ERROR_TIMESTAMP ERRORCODE MESSAGE

아래 그림과 같이 독일에 대한 예측을 구체적으로 표시합니다.

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)
독일에 대한 예측이 선 그래프에 표시됨

이제 미국에 대한 예측을 다음과 같이 플롯합니다.

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)
미국용 예측이 선 그래프에 표시됨

아래와 같이 모델 훈련에 사용된 과거 데이터세트와 예측 값을 하나의 SAP HANA DataFrame에 결합할 수 있습니다.

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()
 MONTHCOUNTRYOFRESIDENCEOVERNIGHTSTAYS_SUM예측FORECAST_LOWERFORECAST_UPPER
02024-06-01벨기에없음50090.69116947179.35458952902.229641
12024-07-01벨기에없음100615.09392897772.912096103203.241535
22024-08-01벨기에없음94010.48817591129.24329696876.143447
32024-09-01벨기에없음35165.76636832295.30331338081.503388
42024-10-01벨기에없음10712.8408597792.91422413545.382103
52024-11-01벨기에없음15575.70697312869.71051118361.714953
62024-12-01벨기에없음43761.77340240908.29150946512.689291
72025-01-01벨기에없음22965.28217820305.02596125710.640517
82025-02-01벨기에없음36852.83205333948.72528639735.768094
92025-03-01벨기에없음42565.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()
 MONTHCOUNTRYOFRESIDENCEOVERNIGHTSTAYS_SUM예측FORECAST_LOWERFORECAST_UPPER
02025-04-01이탈리아없음7.301358e+046.667947e+047.887995e+04
12025-04-01미국없음1.805662e+051.680320e+051.921834e+05
22025-04-01영국없음9.974975e+049.186932e+041.070457e+05
32025-04-01벨기에없음2.574547e+042.259784e+042.862533e+04
42025-04-01스위스없음1.37866e+061.322983e+061.430933e+06
52025-04-01스페인없음3.213217e+042.940963e+043.476349e+04
62025-04-01인도없음6.515502e+045.293711e+047.653153e+04
72025-04-01독일없음2.407886e+052.251664e+052.552813e+05
82025-04-01프랑스없음1.020115e+059.917646e+041.046622e+05
92025-04-01네덜란드없음3.838326e+043.441906e+044.207428e+04
102025-05-01미국없음2.895384e+052.755186e+053.024338e+05
112025-05-01이탈리아없음6.399058e+045.780458e+046.952312e+04
122025-05-01영국없음1.080254e+059.963275e+041.155868e+05
132025-05-01스위스없음1.502996e+061.445847e+061.553558e+06
142025-05-01인도없음1.180078e+051.052617e+051.293825e+05
152025-05-01프랑스없음1.204332e+051.173433e+051.233076e+05
162025-05-01스페인없음3.689542e+043.382324e+043.987497e+04
172025-05-01네덜란드없음5.181526e+044.768336e+045.550257e+04
182025-05-01독일없음2.789746e+052.621818e+052.946275e+05
192025-05-01벨기에없음1.842008e+041.533416e+042.117920e+04

선택적으로, 병합된 데이터세트를 SAP HANA Cloud의 테이블에 저장할 수 있습니다. 예를 들어 SAP Analytics Cloud는 이러한 데이터에 액세스할 수 있습니다.

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

<hana_ml.dataframe.DataFrame at 0x1d9c79d69f0>

마지막으로 독일의 경우 단일 국가에 대한 전체 데이터세트(예: 과거 값 및 예측)를 플롯합니다.

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()
단일 국가인 독일에 대해 과거 값과 예측 값의 전체 데이터세트를 보여주는 그래프

참조