In [1]:
import numpy as np
import pandas as pd
import pyaf.ForecastEngine as autof

In [2]:
# the goal of these tests is to make pyaf as robust as possible against very small/bad datasets
# pyaf should automatically produce reasonable/naive/trivial models in these cases.
# it should not fail in any case (normal behavior expected)

def test_fake_model_1_row(iHorizon_train , iHorizon_apply):
    # one row dataset => always constant forecast
    df = pd.DataFrame([[0 , 0.54543]], columns = ['date' , 'signal'])
    lEngine = autof.cForecastEngine()
    lEngine.train(df , 'date' , 'signal', iHorizon_train);
    # print(lEngine.mSignalDecomposition.mBestModel.mTimeInfo.info())
    print(lEngine.mSignalDecomposition.mBestModel.getFormula())
    print("PERFS_MAPE_MASE", lEngine.mSignalDecomposition.mBestModel.mForecastPerf.mMAPE, 
             lEngine.mSignalDecomposition.mBestModel.mForecastPerf.mMASE, )
    
    # print(df.head())
    df1 = lEngine.forecast(df , iHorizon_apply)
    # print(df1.columns)
    Forecast_DF = df1[['date' , 'signal', 'signal' + '_Forecast', 'signal_Residue', 'signal_Forecast_Lower_Bound',
       'signal_Forecast_Upper_Bound']]
    # print(Forecast_DF.info())
    print("Forecasts\n" , Forecast_DF.tail(iHorizon_apply));

    
    
def test_fake_model_2_rows(iHorizon_train , iHorizon_apply):
    # one row dataset => always constant forecast
    df = pd.DataFrame([[0 , 0.54543] , [1 , 0.43]], columns = ['date' , 'signal'])
    lEngine = autof.cForecastEngine()
    lEngine.train(df , 'date' , 'signal', iHorizon_train);
    # print(lEngine.mSignalDecomposition.mBestModel.mTimeInfo.info())
    print(lEngine.mSignalDecomposition.mBestModel.getFormula())
    print("PERFS_MAPE_MASE", lEngine.mSignalDecomposition.mBestModel.mForecastPerf.mMAPE, 
             lEngine.mSignalDecomposition.mBestModel.mForecastPerf.mMASE, )
    # print(df.head())
    df1 = lEngine.forecast(df , iHorizon_apply)
    # print(df1.columns)
    Forecast_DF = df1[['date' , 'signal', 'signal' + '_Forecast', 'signal_Residue', 'signal_Forecast_Lower_Bound',
       'signal_Forecast_Upper_Bound']]
    # print(Forecast_DF.info())
    print("Forecasts\n" , Forecast_DF.tail(iHorizon_apply));

In [ ]:


In [3]:
test_fake_model_1_row( 2, 1)


ConstantTrend + NoCycle + NoAR
PERFS_MAPE_MASE 0.0 None
Forecasts
    date  signal  signal_Forecast  signal_Residue  signal_Forecast_Lower_Bound  \
1     1     NaN          0.54543             0.0                      0.54543   

   signal_Forecast_Upper_Bound  
1                      0.54543  

In [4]:
test_fake_model_1_row( 1, 2)


ConstantTrend + NoCycle + NoAR
PERFS_MAPE_MASE 0.0 None
Forecasts
    date  signal  signal_Forecast  signal_Residue  signal_Forecast_Lower_Bound  \
1     1     NaN          0.54543             0.0                      0.54543   
2     2     NaN          0.54543             0.0                          NaN   

   signal_Forecast_Upper_Bound  
1                      0.54543  
2                          NaN  

In [5]:
test_fake_model_1_row( 2, 10)


ConstantTrend + NoCycle + NoAR
PERFS_MAPE_MASE 0.0 None
Forecasts
     date  signal  signal_Forecast  signal_Residue  \
1      1     NaN          0.54543             0.0   
2      2     NaN          0.54543             0.0   
3      3     NaN          0.54543             0.0   
4      4     NaN          0.54543             0.0   
5      5     NaN          0.54543             0.0   
6      6     NaN          0.54543             0.0   
7      7     NaN          0.54543             0.0   
8      8     NaN          0.54543             0.0   
9      9     NaN          0.54543             0.0   
10    10     NaN          0.54543             0.0   

    signal_Forecast_Lower_Bound  signal_Forecast_Upper_Bound  
1                       0.54543                      0.54543  
2                       0.54543                      0.54543  
3                           NaN                          NaN  
4                           NaN                          NaN  
5                           NaN                          NaN  
6                           NaN                          NaN  
7                           NaN                          NaN  
8                           NaN                          NaN  
9                           NaN                          NaN  
10                          NaN                          NaN  

In [6]:
test_fake_model_1_row( 20, 10)


ConstantTrend + NoCycle + NoAR
PERFS_MAPE_MASE 0.0 None
Forecasts
     date  signal  signal_Forecast  signal_Residue  \
1      1     NaN          0.54543             0.0   
2      2     NaN          0.54543             0.0   
3      3     NaN          0.54543             0.0   
4      4     NaN          0.54543             0.0   
5      5     NaN          0.54543             0.0   
6      6     NaN          0.54543             0.0   
7      7     NaN          0.54543             0.0   
8      8     NaN          0.54543             0.0   
9      9     NaN          0.54543             0.0   
10    10     NaN          0.54543             0.0   

    signal_Forecast_Lower_Bound  signal_Forecast_Upper_Bound  
1                       0.54543                      0.54543  
2                       0.54543                      0.54543  
3                       0.54543                      0.54543  
4                       0.54543                      0.54543  
5                       0.54543                      0.54543  
6                       0.54543                      0.54543  
7                       0.54543                      0.54543  
8                       0.54543                      0.54543  
9                       0.54543                      0.54543  
10                      0.54543                      0.54543  

In [7]:
test_fake_model_2_rows( 1, 4)


ConstantTrend + NoCycle + NoAR
PERFS_MAPE_MASE 0.0529 0.25
Forecasts
    date  signal  signal_Forecast  signal_Residue  signal_Forecast_Lower_Bound  \
2     2     NaN         0.372285        0.000000                     0.292296   
3     3     NaN         0.314570        0.000000                          NaN   
4     4     NaN         0.256855        0.000000                          NaN   
5     5     NaN         0.199140        0.057715                          NaN   

   signal_Forecast_Upper_Bound  
2                     0.452274  
3                          NaN  
4                          NaN  
5                          NaN  

In [8]:
test_fake_model_2_rows( 6, 2)


ConstantTrend + NoCycle + NoAR
PERFS_MAPE_MASE 0.0529 0.25
Forecasts
    date  signal  signal_Forecast  signal_Residue  signal_Forecast_Lower_Bound  \
2     2     NaN         0.372285        0.000000                     0.292296   
3     3     NaN         0.314570        0.057715                     0.234581   

   signal_Forecast_Upper_Bound  
2                     0.452274  
3                     0.394559  

In [9]:
test_fake_model_2_rows( 6, 1)


ConstantTrend + NoCycle + NoAR
PERFS_MAPE_MASE 0.0529 0.25
Forecasts
    date  signal  signal_Forecast  signal_Residue  signal_Forecast_Lower_Bound  \
2     2     NaN         0.372285        0.057715                     0.292296   

   signal_Forecast_Upper_Bound  
2                     0.452274  

In [10]:
test_fake_model_2_rows( 1 , 7)


ConstantTrend + NoCycle + NoAR
PERFS_MAPE_MASE 0.0529 0.25
Forecasts
    date  signal  signal_Forecast  signal_Residue  signal_Forecast_Lower_Bound  \
2     2     NaN         0.372285        0.000000                     0.292296   
3     3     NaN         0.314570        0.000000                          NaN   
4     4     NaN         0.256855        0.000000                          NaN   
5     5     NaN         0.199140        0.000000                          NaN   
6     6     NaN         0.141425        0.000000                          NaN   
7     7     NaN         0.083710        0.000000                          NaN   
8     8     NaN         0.025995        0.057715                          NaN   

   signal_Forecast_Upper_Bound  
2                     0.452274  
3                          NaN  
4                          NaN  
5                          NaN  
6                          NaN  
7                          NaN  
8                          NaN  

In [ ]:


In [ ]: