In [1]:
# remove the notebook root logger.\n",
import logging
logger = logging.getLogger()
logger.handlers = []

%matplotlib inline

In [2]:
import pandas as pd


csvfile_link = "https://raw.githubusercontent.com/antoinecarme/pyaf/master/data/passengers_train.csv"
air_passengers_dataframe = pd.read_csv(csvfile_link);
import datetime
air_passengers_dataframe.info()


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 144 entries, 0 to 143
Data columns (total 3 columns):
 #   Column         Non-Null Count  Dtype  
---  ------         --------------  -----  
 0   ID             144 non-null    int64  
 1   time           144 non-null    float64
 2   AirPassengers  144 non-null    int64  
dtypes: float64(1), int64(2)
memory usage: 3.5 KB

In [3]:
def create_model(iActivateCrossVal , iFolds):
    import pyaf.ForecastEngine as autof
    lEngine = autof.cForecastEngine()
    if(iActivateCrossVal):
        lEngine.mOptions.mCrossValidationOptions.mMethod = "TSCV";
        lEngine.mOptions.mCrossValidationOptions.mNbFolds = iFolds
    lEngine.train(air_passengers_dataframe[:-12] , 'time' , 'AirPassengers', 12);
    lEngine.getModelInfo();
    return lEngine

In [4]:
model_no_cross_valid = create_model(False , None)
model_with_cross_valid_5 = create_model(True , 5)
model_with_cross_valid_10 = create_model(True , 10)


INFO:pyaf.std:START_TRAINING 'AirPassengers'
INFO:pyaf.std:END_TRAINING_TIME_IN_SECONDS 'AirPassengers' 1.9826791286468506
INFO:pyaf.std:TIME_DETAIL TimeVariable='time' TimeMin=1949.0 TimeMax=1956.91666666667 TimeDelta=0.08333333333336763 Horizon=12
INFO:pyaf.std:SIGNAL_DETAIL_ORIG SignalVariable='AirPassengers' Length=132  Min=104 Max=559  Mean=262.49242424242425 StdDev=106.22114554451818
INFO:pyaf.std:SIGNAL_DETAIL_TRANSFORMED TransformedSignalVariable='_AirPassengers' Min=104 Max=559  Mean=262.49242424242425 StdDev=106.22114554451818
INFO:pyaf.std:BEST_TRANSOFORMATION_TYPE '_'
INFO:pyaf.std:BEST_DECOMPOSITION  '_AirPassengers_LinearTrend_residue_zeroCycle_residue_AR(33)' [LinearTrend + NoCycle + AR]
INFO:pyaf.std:TREND_DETAIL '_AirPassengers_LinearTrend' [LinearTrend]
INFO:pyaf.std:CYCLE_DETAIL '_AirPassengers_LinearTrend_residue_zeroCycle' [NoCycle]
INFO:pyaf.std:AUTOREG_DETAIL '_AirPassengers_LinearTrend_residue_zeroCycle_residue_AR(33)' [AR]
INFO:pyaf.std:MODEL_MAPE MAPE_Fit=0.0349 MAPE_Forecast=0.0217 MAPE_Test=0.0541
INFO:pyaf.std:MODEL_SMAPE SMAPE_Fit=0.0346 SMAPE_Forecast=0.022 SMAPE_Test=0.0558
INFO:pyaf.std:MODEL_MASE MASE_Fit=0.3563 MASE_Forecast=0.2287 MASE_Test=0.495
INFO:pyaf.std:MODEL_L1 L1_Fit=6.661608657426704 L1_Forecast=8.471185219450987 L1_Test=22.277082170777845
INFO:pyaf.std:MODEL_L2 L2_Fit=8.55391701208473 L2_Forecast=11.9717629046624 L2_Test=23.591231598021146
INFO:pyaf.std:MODEL_COMPLEXITY 40
INFO:pyaf.std:SIGNAL_TRANSFORMATION_DETAIL_START
INFO:pyaf.std:SIGNAL_TRANSFORMATION_MODEL_VALUES NoTransf None
INFO:pyaf.std:SIGNAL_TRANSFORMATION_DETAIL_END
INFO:pyaf.std:TREND_DETAIL_START
INFO:pyaf.std:LINEAR_RIDGE_TREND LinearTrend (114.90523344816313, array([197.60619977]))
INFO:pyaf.std:TREND_DETAIL_END
INFO:pyaf.std:CYCLE_MODEL_DETAIL_START
INFO:pyaf.std:ZERO_CYCLE_MODEL_VALUES _AirPassengers_LinearTrend_residue_zeroCycle 0.0 {}
INFO:pyaf.std:CYCLE_MODEL_DETAIL_END
INFO:pyaf.std:AR_MODEL_DETAIL_START
INFO:pyaf.std:AR_MODEL_COEFF 1 _AirPassengers_LinearTrend_residue_zeroCycle_residue_Lag1 0.7786311442771692
INFO:pyaf.std:AR_MODEL_COEFF 2 _AirPassengers_LinearTrend_residue_zeroCycle_residue_Lag12 0.7393757053683521
INFO:pyaf.std:AR_MODEL_COEFF 3 _AirPassengers_LinearTrend_residue_zeroCycle_residue_Lag13 -0.5331389013992002
INFO:pyaf.std:AR_MODEL_COEFF 4 _AirPassengers_LinearTrend_residue_zeroCycle_residue_Lag25 -0.2876891887152447
INFO:pyaf.std:AR_MODEL_COEFF 5 _AirPassengers_LinearTrend_residue_zeroCycle_residue_Lag24 0.24302785675797134
INFO:pyaf.std:AR_MODEL_COEFF 6 _AirPassengers_LinearTrend_residue_zeroCycle_residue_Lag33 -0.18406731004060656
INFO:pyaf.std:AR_MODEL_COEFF 7 _AirPassengers_LinearTrend_residue_zeroCycle_residue_Lag5 0.17161844385149455
INFO:pyaf.std:AR_MODEL_COEFF 8 _AirPassengers_LinearTrend_residue_zeroCycle_residue_Lag29 -0.16896686902776945
INFO:pyaf.std:AR_MODEL_COEFF 9 _AirPassengers_LinearTrend_residue_zeroCycle_residue_Lag7 -0.1681662646628635
INFO:pyaf.std:AR_MODEL_COEFF 10 _AirPassengers_LinearTrend_residue_zeroCycle_residue_Lag16 -0.16495284212980615
INFO:pyaf.std:AR_MODEL_DETAIL_END
INFO:pyaf.std:START_TRAINING 'AirPassengers'
INFO:pyaf.std:CROSS_VALIDATION_TRAINING_SIGNAL_SPLIT 'AirPassengers' (0.4, 0.2, 0.0)
INFO:pyaf.std:CROSS_VALIDATION_TRAINING_SPLIT_TIME_IN_SECONDS 'AirPassengers' (0.4, 0.2, 0.0) 1.401005506515503
INFO:pyaf.std:CROSS_VALIDATION_TRAINING_SIGNAL_SPLIT 'AirPassengers' (0.6000000000000001, 0.2, 0.0)
INFO:pyaf.std:CROSS_VALIDATION_TRAINING_SPLIT_TIME_IN_SECONDS 'AirPassengers' (0.6000000000000001, 0.2, 0.0) 1.2582004070281982
INFO:pyaf.std:CROSS_VALIDATION_TRAINING_SIGNAL_SPLIT 'AirPassengers' (0.8, 0.2, 0.0)
INFO:pyaf.std:CROSS_VALIDATION_TRAINING_SPLIT_TIME_IN_SECONDS 'AirPassengers' (0.8, 0.2, 0.0) 1.2986080646514893
INFO:pyaf.std:CROSS_VALIDATION_TRAINING_TIME_IN_SECONDS _AirPassengers 3.98103404045105
INFO:pyaf.std:END_TRAINING_TIME_IN_SECONDS 'AirPassengers' 4.462402820587158
INFO:pyaf.std:TIME_DETAIL TimeVariable='time' TimeMin=1949.0 TimeMax=1955.5 TimeDelta=0.08333333333333333 Horizon=12
INFO:pyaf.std:SIGNAL_DETAIL_ORIG SignalVariable='AirPassengers' Length=132  Min=104 Max=559  Mean=262.49242424242425 StdDev=106.22114554451818
INFO:pyaf.std:SIGNAL_DETAIL_TRANSFORMED TransformedSignalVariable='_AirPassengers' Min=104 Max=559  Mean=262.49242424242425 StdDev=106.22114554451818
INFO:pyaf.std:BEST_TRANSOFORMATION_TYPE '_'
INFO:pyaf.std:BEST_DECOMPOSITION  '_AirPassengers_Lag1Trend_residue_bestCycle_byMAPE_residue_AR(33)' [Lag1Trend + Cycle + AR]
INFO:pyaf.std:TREND_DETAIL '_AirPassengers_Lag1Trend' [Lag1Trend]
INFO:pyaf.std:CYCLE_DETAIL '_AirPassengers_Lag1Trend_residue_bestCycle_byMAPE' [Cycle]
INFO:pyaf.std:AUTOREG_DETAIL '_AirPassengers_Lag1Trend_residue_bestCycle_byMAPE_residue_AR(33)' [AR]
INFO:pyaf.std:MODEL_MAPE MAPE_Fit=0.0459 MAPE_Forecast=0.0239 MAPE_Test=None
INFO:pyaf.std:MODEL_SMAPE SMAPE_Fit=0.0455 SMAPE_Forecast=0.024 SMAPE_Test=None
INFO:pyaf.std:MODEL_MASE MASE_Fit=0.4813 MASE_Forecast=0.2764 MASE_Test=None
INFO:pyaf.std:MODEL_L1 L1_Fit=7.861995811726631 L1_Forecast=8.325665524591157 L1_Test=None
INFO:pyaf.std:MODEL_L2 L2_Fit=9.894590107165012 L2_Forecast=10.548125034812506 L2_Test=None
INFO:pyaf.std:MODEL_COMPLEXITY 59
INFO:pyaf.std:SIGNAL_TRANSFORMATION_DETAIL_START
INFO:pyaf.std:SIGNAL_TRANSFORMATION_MODEL_VALUES NoTransf None
INFO:pyaf.std:SIGNAL_TRANSFORMATION_DETAIL_END
INFO:pyaf.std:TREND_DETAIL_START
INFO:pyaf.std:LAG1_TREND Lag1Trend 112
INFO:pyaf.std:TREND_DETAIL_END
INFO:pyaf.std:CYCLE_MODEL_DETAIL_START
INFO:pyaf.std:BEST_CYCLE_LENGTH_VALUES _AirPassengers_Lag1Trend_residue_bestCycle_byMAPE 7 2.0 {0: 0.0, 1: 6.0, 2: 9.0, 3: 0.0, 4: 3.0, 5: 2.0, 6: 2.0}
INFO:pyaf.std:CYCLE_MODEL_DETAIL_END
INFO:pyaf.std:AR_MODEL_DETAIL_START
INFO:pyaf.std:AR_MODEL_COEFF 1 _AirPassengers_Lag1Trend_residue_bestCycle_byMAPE_residue_Lag12 0.6653300494288455
INFO:pyaf.std:AR_MODEL_COEFF 2 _AirPassengers_Lag1Trend_residue_bestCycle_byMAPE_residue_Lag24 0.3623553547254803
INFO:pyaf.std:AR_MODEL_COEFF 3 _AirPassengers_Lag1Trend_residue_bestCycle_byMAPE_residue_Lag33 -0.2505177021952606
INFO:pyaf.std:AR_MODEL_COEFF 4 _AirPassengers_Lag1Trend_residue_bestCycle_byMAPE_residue_Lag13 0.17907946392830243
INFO:pyaf.std:AR_MODEL_COEFF 5 _AirPassengers_Lag1Trend_residue_bestCycle_byMAPE_residue_Lag21 0.17848118276087732
INFO:pyaf.std:AR_MODEL_COEFF 6 _AirPassengers_Lag1Trend_residue_bestCycle_byMAPE_residue_Lag26 -0.17599552749018227
INFO:pyaf.std:AR_MODEL_COEFF 7 _AirPassengers_Lag1Trend_residue_bestCycle_byMAPE_residue_Lag10 -0.14413222785300456
INFO:pyaf.std:AR_MODEL_COEFF 8 _AirPassengers_Lag1Trend_residue_bestCycle_byMAPE_residue_Lag22 0.13802473697019738
INFO:pyaf.std:AR_MODEL_COEFF 9 _AirPassengers_Lag1Trend_residue_bestCycle_byMAPE_residue_Lag23 0.12418573861450735
INFO:pyaf.std:AR_MODEL_COEFF 10 _AirPassengers_Lag1Trend_residue_bestCycle_byMAPE_residue_Lag8 -0.11157065164527841
INFO:pyaf.std:AR_MODEL_DETAIL_END
INFO:pyaf.std:START_TRAINING 'AirPassengers'
INFO:pyaf.std:CROSS_VALIDATION_TRAINING_SIGNAL_SPLIT 'AirPassengers' (0.5, 0.1, 0.0)
INFO:pyaf.std:CROSS_VALIDATION_TRAINING_SPLIT_TIME_IN_SECONDS 'AirPassengers' (0.5, 0.1, 0.0) 1.2721760272979736
INFO:pyaf.std:CROSS_VALIDATION_TRAINING_SIGNAL_SPLIT 'AirPassengers' (0.6000000000000001, 0.1, 0.0)
INFO:pyaf.std:CROSS_VALIDATION_TRAINING_SPLIT_TIME_IN_SECONDS 'AirPassengers' (0.6000000000000001, 0.1, 0.0) 1.2629587650299072
INFO:pyaf.std:CROSS_VALIDATION_TRAINING_SIGNAL_SPLIT 'AirPassengers' (0.7000000000000001, 0.1, 0.0)
INFO:pyaf.std:CROSS_VALIDATION_TRAINING_SPLIT_TIME_IN_SECONDS 'AirPassengers' (0.7000000000000001, 0.1, 0.0) 1.2781033515930176
INFO:pyaf.std:CROSS_VALIDATION_TRAINING_SIGNAL_SPLIT 'AirPassengers' (0.8, 0.1, 0.0)
INFO:pyaf.std:CROSS_VALIDATION_TRAINING_SPLIT_TIME_IN_SECONDS 'AirPassengers' (0.8, 0.1, 0.0) 1.310082197189331
INFO:pyaf.std:CROSS_VALIDATION_TRAINING_SIGNAL_SPLIT 'AirPassengers' (0.9, 0.1, 0.0)
INFO:pyaf.std:CROSS_VALIDATION_TRAINING_SPLIT_TIME_IN_SECONDS 'AirPassengers' (0.9, 0.1, 0.0) 1.4220492839813232
INFO:pyaf.std:CROSS_VALIDATION_TRAINING_TIME_IN_SECONDS _AirPassengers 6.574736595153809
INFO:pyaf.std:END_TRAINING_TIME_IN_SECONDS 'AirPassengers' 6.971766948699951
INFO:pyaf.std:TIME_DETAIL TimeVariable='time' TimeMin=1949.0 TimeMax=1954.41666666667 TimeDelta=0.08333333333338347 Horizon=12
INFO:pyaf.std:SIGNAL_DETAIL_ORIG SignalVariable='AirPassengers' Length=132  Min=104 Max=559  Mean=262.49242424242425 StdDev=106.22114554451818
INFO:pyaf.std:SIGNAL_DETAIL_TRANSFORMED TransformedSignalVariable='_AirPassengers' Min=104 Max=559  Mean=262.49242424242425 StdDev=106.22114554451818
INFO:pyaf.std:BEST_TRANSOFORMATION_TYPE '_'
INFO:pyaf.std:BEST_DECOMPOSITION  '_AirPassengers_ConstantTrend_residue_zeroCycle_residue_AR(33)' [ConstantTrend + NoCycle + AR]
INFO:pyaf.std:TREND_DETAIL '_AirPassengers_ConstantTrend' [ConstantTrend]
INFO:pyaf.std:CYCLE_DETAIL '_AirPassengers_ConstantTrend_residue_zeroCycle' [NoCycle]
INFO:pyaf.std:AUTOREG_DETAIL '_AirPassengers_ConstantTrend_residue_zeroCycle_residue_AR(33)' [AR]
INFO:pyaf.std:MODEL_MAPE MAPE_Fit=0.0438 MAPE_Forecast=0.0386 MAPE_Test=None
INFO:pyaf.std:MODEL_SMAPE SMAPE_Fit=0.0437 SMAPE_Forecast=0.0391 SMAPE_Test=None
INFO:pyaf.std:MODEL_MASE MASE_Fit=0.4861 MASE_Forecast=0.4656 MASE_Test=None
INFO:pyaf.std:MODEL_L1 L1_Fit=7.164469425273997 L1_Forecast=10.78641339350587 L1_Test=None
INFO:pyaf.std:MODEL_L2 L2_Fit=8.942766451419974 L2_Forecast=12.324512306852725 L2_Test=None
INFO:pyaf.std:MODEL_COMPLEXITY 16
INFO:pyaf.std:SIGNAL_TRANSFORMATION_DETAIL_START
INFO:pyaf.std:SIGNAL_TRANSFORMATION_MODEL_VALUES NoTransf None
INFO:pyaf.std:SIGNAL_TRANSFORMATION_DETAIL_END
INFO:pyaf.std:TREND_DETAIL_START
INFO:pyaf.std:CONSTANT_TREND ConstantTrend 176.57575757575756
INFO:pyaf.std:TREND_DETAIL_END
INFO:pyaf.std:CYCLE_MODEL_DETAIL_START
INFO:pyaf.std:ZERO_CYCLE_MODEL_VALUES _AirPassengers_ConstantTrend_residue_zeroCycle 0.0 {}
INFO:pyaf.std:CYCLE_MODEL_DETAIL_END
INFO:pyaf.std:AR_MODEL_DETAIL_START
INFO:pyaf.std:AR_MODEL_COEFF 1 _AirPassengers_ConstantTrend_residue_zeroCycle_residue_Lag12 0.8345744127463647
INFO:pyaf.std:AR_MODEL_COEFF 2 _AirPassengers_ConstantTrend_residue_zeroCycle_residue_Lag1 0.7123718250165115
INFO:pyaf.std:AR_MODEL_COEFF 3 _AirPassengers_ConstantTrend_residue_zeroCycle_residue_Lag13 -0.4018787406298012
INFO:pyaf.std:AR_MODEL_COEFF 4 _AirPassengers_ConstantTrend_residue_zeroCycle_residue_Lag25 -0.3896147658999264
INFO:pyaf.std:AR_MODEL_COEFF 5 _AirPassengers_ConstantTrend_residue_zeroCycle_residue_Lag24 0.3496590723143301
INFO:pyaf.std:AR_MODEL_COEFF 6 _AirPassengers_ConstantTrend_residue_zeroCycle_residue_Lag14 -0.23552166496545232
INFO:pyaf.std:AR_MODEL_COEFF 7 _AirPassengers_ConstantTrend_residue_zeroCycle_residue_Lag15 0.1576386078241021
INFO:pyaf.std:AR_MODEL_COEFF 8 _AirPassengers_ConstantTrend_residue_zeroCycle_residue_Lag22 0.13898102966856893
INFO:pyaf.std:AR_MODEL_COEFF 9 _AirPassengers_ConstantTrend_residue_zeroCycle_residue_Lag3 -0.12616114892681568
INFO:pyaf.std:AR_MODEL_COEFF 10 _AirPassengers_ConstantTrend_residue_zeroCycle_residue_Lag2 0.1084658220359479
INFO:pyaf.std:AR_MODEL_DETAIL_END

In [5]:
model_no_cross_valid_forecast = model_no_cross_valid.forecast(air_passengers_dataframe, 12);
model_with_cross_valid_10_forecast = model_with_cross_valid_10.forecast(air_passengers_dataframe, 12);
model_with_cross_valid_5_forecast = model_with_cross_valid_5.forecast(air_passengers_dataframe, 12);


INFO:pyaf.std:START_FORECASTING 'AirPassengers'
INFO:pyaf.std:END_FORECAST_TIME_IN_SECONDS  'AirPassengers' 0.426379919052124
INFO:pyaf.std:START_FORECASTING 'AirPassengers'
INFO:pyaf.std:END_FORECAST_TIME_IN_SECONDS  'AirPassengers' 0.3487234115600586
INFO:pyaf.std:START_FORECASTING 'AirPassengers'
INFO:pyaf.std:END_FORECAST_TIME_IN_SECONDS  'AirPassengers' 0.4129486083984375

In [6]:
model_no_cross_valid_forecast.plot.line('time', ['AirPassengers' , 'AirPassengers_Forecast', 
                                             'AirPassengers_Forecast_Lower_Bound', 
                                             'AirPassengers_Forecast_Upper_Bound'], grid = True, figsize=(12, 8))
model_with_cross_valid_10_forecast.plot.line('time', ['AirPassengers' , 'AirPassengers_Forecast', 
                                             'AirPassengers_Forecast_Lower_Bound', 
                                             'AirPassengers_Forecast_Upper_Bound'], grid = True, figsize=(12, 8))
model_with_cross_valid_5_forecast.plot.line('time', ['AirPassengers' , 'AirPassengers_Forecast', 
                                             'AirPassengers_Forecast_Lower_Bound', 
                                             'AirPassengers_Forecast_Upper_Bound'], grid = True, figsize=(12, 8))


Out[6]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f18e4fe3fa0>

In [ ]: