실제 예측 시나리오에서는 국가, 점포 또는 제품 라인과 같은 여러 범주에 대해 별도의 예측을 생성하는 것이 일반적입니다. 이 소단원에서는 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]을 사용하여 개별 모델을 훈련합니다.
그러나 이제 거주 국가를 그룹 키로 지정하여 각 국가에 대한 개별 모델을 제공합니다.
12amf = 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을 생성합니다.
다음으로 교육 이력에서 가장 최근 월을 파악하는 것으로 시작합니다.
1234str_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을 생성하여 예상합니다.
123456months_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 | 대상 | |
|---|---|---|
| 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 |
그런 다음 예측이 제공될 국가를 포함하는 SAP HANA DataFrame을 생성합니다.
123hdf_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을 생성합니다.
123hdf_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 | |
|---|---|---|---|
| 0 | 2024-06-01 | 0 | 스위스 |
| 1 | 2024-06-01 | 0 | 독일 |
| 2 | 2024-06-01 | 0 | 미국 |
| 3 | 2024-06-01 | 0 | 영국 |
| 4 | 2024-06-01 | 0 | 프랑스 |
| 5 | 2024-06-01 | 0 | 이탈리아 |
| 6 | 2024-06-01 | 0 | 네덜란드 |
| 7 | 2024-06-01 | 0 | 벨기에 |
| 8 | 2024-06-01 | 0 | 인도 |
| 9 | 2024-06-01 | 0 | 스페인 |
모델을 적용하여 예측 생성
그런 다음 훈련된 시계열 모델을 채점하여 지정된 일자의 개별 국가에 대한 예측을 생성합니다.
12hdf_overnightstays_pred = amf.predict(data=hdf_overnightstays_topredict, group_key='COUNTRYOFRESIDENCE')
hdf_overnightstays_predicted = hdf_overnightstays_pred[0]아래 그림과 같이 예측 구성요소의 세부사항, 즉 추세, 계절적 변동을 살펴볼 수 있습니다.
1hdf_overnightstays_pred[1].collect()| 그룹 ID | MONTH | 추세 | 계절 | 휴일 | EXOGENOUS | |
|---|---|---|---|---|---|---|
| 0 | 벨기에 | 2024-06-01 | 46941.398949 | {"seasonalities":3149.2922197280824} | {} | {} |
| 1 | 벨기에 | 2024-07-01 | 46645.399501 | {"seasonalities":539699.69442748901} | {} | {} |
| 2 | 벨기에 | 2024-08-01 | 46339.533404 | {"계절성":47670.95477129075} | {} | {} |
| 3 | 벨기에 | 2024-09-01 | 46033.667307 | {"계절성":-10867.900939089028} | {} | {} |
| 4 | 벨기에 | 2024-10-01 | 45737.667859 | {"계절성":-35024.826999824596} | {} | {} |
| ... | ... | ... | ... | ... | ... | ... |
| 115 | 미국 | 2025-01-01 | 256174.088611 | {"계절성":-105260.40367463966} | {} | {} |
| 116 | 미국 | 2025-02-01 | 255710.827254 | {"계절적 변동":-107113.21705733694} | {} | {} |
| 117 | 미국 | 2025-03-01 | 255292.397641 | {"계절성":-63771.189585235305} | {} | {} |
| 118 | 미국 | 2025-04-01 | 254829.136284 | {"계절성":-74262.95570659888} | {} | {} |
| 119 | 미국 | 2025-05-01 | 254380.818842 | {"계절성":35157.578049777409} | {} | {} |
120행 × 6열
정확도 평가
다음과 같이 오류가 있는지 확인합니다.
1hdf_overnightstays_pred[2].collect()GROUP_ID ERROR_TIMESTAMP ERRORCODE MESSAGE
아래 그림과 같이 독일에 대한 예측을 구체적으로 표시합니다.
12forecast_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)
이제 미국에 대한 예측을 다음과 같이 플롯합니다.
12forecast_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에 결합할 수 있습니다.
123456789hdf_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()| MONTH | COUNTRYOFRESIDENCE | OVERNIGHTSTAYS_SUM | 예측 | FORECAST_LOWER | FORECAST_UPPER | |
|---|---|---|---|---|---|---|
| 0 | 2024-06-01 | 벨기에 | 없음 | 50090.691169 | 47179.354589 | 52902.229641 |
| 1 | 2024-07-01 | 벨기에 | 없음 | 100615.093928 | 97772.912096 | 103203.241535 |
| 2 | 2024-08-01 | 벨기에 | 없음 | 94010.488175 | 91129.243296 | 96876.143447 |
| 3 | 2024-09-01 | 벨기에 | 없음 | 35165.766368 | 32295.303313 | 38081.503388 |
| 4 | 2024-10-01 | 벨기에 | 없음 | 10712.840859 | 7792.914224 | 13545.382103 |
| 5 | 2024-11-01 | 벨기에 | 없음 | 15575.706973 | 12869.710511 | 18361.714953 |
| 6 | 2024-12-01 | 벨기에 | 없음 | 43761.773402 | 40908.291509 | 46512.689291 |
| 7 | 2025-01-01 | 벨기에 | 없음 | 22965.282178 | 20305.025961 | 25710.640517 |
| 8 | 2025-02-01 | 벨기에 | 없음 | 36852.832053 | 33948.725286 | 39735.768094 |
| 9 | 2025-03-01 | 벨기에 | 없음 | 42565.990727 | 39522.284487 | 45665.217573 |
123456hdf_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()| MONTH | COUNTRYOFRESIDENCE | OVERNIGHTSTAYS_SUM | 예측 | FORECAST_LOWER | FORECAST_UPPER | |
|---|---|---|---|---|---|---|
| 0 | 2025-04-01 | 이탈리아 | 없음 | 7.301358e+04 | 6.667947e+04 | 7.887995e+04 |
| 1 | 2025-04-01 | 미국 | 없음 | 1.805662e+05 | 1.680320e+05 | 1.921834e+05 |
| 2 | 2025-04-01 | 영국 | 없음 | 9.974975e+04 | 9.186932e+04 | 1.070457e+05 |
| 3 | 2025-04-01 | 벨기에 | 없음 | 2.574547e+04 | 2.259784e+04 | 2.862533e+04 |
| 4 | 2025-04-01 | 스위스 | 없음 | 1.37866e+06 | 1.322983e+06 | 1.430933e+06 |
| 5 | 2025-04-01 | 스페인 | 없음 | 3.213217e+04 | 2.940963e+04 | 3.476349e+04 |
| 6 | 2025-04-01 | 인도 | 없음 | 6.515502e+04 | 5.293711e+04 | 7.653153e+04 |
| 7 | 2025-04-01 | 독일 | 없음 | 2.407886e+05 | 2.251664e+05 | 2.552813e+05 |
| 8 | 2025-04-01 | 프랑스 | 없음 | 1.020115e+05 | 9.917646e+04 | 1.046622e+05 |
| 9 | 2025-04-01 | 네덜란드 | 없음 | 3.838326e+04 | 3.441906e+04 | 4.207428e+04 |
| 10 | 2025-05-01 | 미국 | 없음 | 2.895384e+05 | 2.755186e+05 | 3.024338e+05 |
| 11 | 2025-05-01 | 이탈리아 | 없음 | 6.399058e+04 | 5.780458e+04 | 6.952312e+04 |
| 12 | 2025-05-01 | 영국 | 없음 | 1.080254e+05 | 9.963275e+04 | 1.155868e+05 |
| 13 | 2025-05-01 | 스위스 | 없음 | 1.502996e+06 | 1.445847e+06 | 1.553558e+06 |
| 14 | 2025-05-01 | 인도 | 없음 | 1.180078e+05 | 1.052617e+05 | 1.293825e+05 |
| 15 | 2025-05-01 | 프랑스 | 없음 | 1.204332e+05 | 1.173433e+05 | 1.233076e+05 |
| 16 | 2025-05-01 | 스페인 | 없음 | 3.689542e+04 | 3.382324e+04 | 3.987497e+04 |
| 17 | 2025-05-01 | 네덜란드 | 없음 | 5.181526e+04 | 4.768336e+04 | 5.550257e+04 |
| 18 | 2025-05-01 | 독일 | 없음 | 2.789746e+05 | 2.621818e+05 | 2.946275e+05 |
| 19 | 2025-05-01 | 벨기에 | 없음 | 1.842008e+04 | 1.533416e+04 | 2.117920e+04 |
선택적으로, 병합된 데이터세트를 SAP HANA Cloud의 테이블에 저장할 수 있습니다. 예를 들어 SAP Analytics Cloud는 이러한 데이터에 액세스할 수 있습니다.
1hdf_overnightstays_all.save('OVERNIGHTSTAYS_FORECAST_COUNTRIES', force=True)<hana_ml.dataframe.DataFrame at 0x1d9c79d69f0>
마지막으로 독일의 경우 단일 국가에 대한 전체 데이터세트(예: 과거 값 및 예측)를 플롯합니다.
1hdf_overnightstays_data = hdf_overnightstays_all.filter('''"COUNTRYOFRESIDENCE" = 'Germany' ''').collect()12345678910111213fig, 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()