@@ -121,23 +121,26 @@ def run_all_models(self, datasets: ForecastDatasets, operator_config: ForecastOp
121
121
from .model .factory import ForecastOperatorModelFactory
122
122
metrics [model ] = {}
123
123
for i in range (len (cut_offs )):
124
- backtest_historical_data = train_sets [i ]
125
- backtest_additional_data = additional_data [i ]
126
- backtest_test_data = test_sets [i ]
127
- backtest_operator_config = self .create_operator_config (operator_config , i , model ,
128
- backtest_historical_data ,
129
- backtest_additional_data ,
130
- backtest_test_data )
131
- datasets = ForecastDatasets (backtest_operator_config )
132
- ForecastOperatorModelFactory .get_model (
133
- backtest_operator_config , datasets
134
- ).generate_report ()
135
- test_metrics_filename = backtest_operator_config .spec .test_metrics_filename
136
- metrics_df = pd .read_csv (
137
- f"{ backtest_operator_config .spec .output_directory .url } /{ test_metrics_filename } " )
138
- metrics_df ["average_across_series" ] = metrics_df .drop ('metrics' , axis = 1 ).mean (axis = 1 )
139
- metrics_average_dict = dict (zip (metrics_df ['metrics' ].str .lower (), metrics_df ['average_across_series' ]))
140
- metrics [model ][i ] = metrics_average_dict [operator_config .spec .metric ]
124
+ try :
125
+ backtest_historical_data = train_sets [i ]
126
+ backtest_additional_data = additional_data [i ]
127
+ backtest_test_data = test_sets [i ]
128
+ backtest_operator_config = self .create_operator_config (operator_config , i , model ,
129
+ backtest_historical_data ,
130
+ backtest_additional_data ,
131
+ backtest_test_data )
132
+ datasets = ForecastDatasets (backtest_operator_config )
133
+ ForecastOperatorModelFactory .get_model (
134
+ backtest_operator_config , datasets
135
+ ).generate_report ()
136
+ test_metrics_filename = backtest_operator_config .spec .test_metrics_filename
137
+ metrics_df = pd .read_csv (
138
+ f"{ backtest_operator_config .spec .output_directory .url } /{ test_metrics_filename } " )
139
+ metrics_df ["average_across_series" ] = metrics_df .drop ('metrics' , axis = 1 ).mean (axis = 1 )
140
+ metrics_average_dict = dict (zip (metrics_df ['metrics' ].str .lower (), metrics_df ['average_across_series' ]))
141
+ metrics [model ][i ] = metrics_average_dict [operator_config .spec .metric ]
142
+ except :
143
+ logger .warn (f"Failed to calculate metrics for { model } and { i } backtest" )
141
144
return metrics
142
145
143
146
def find_best_model (self , datasets : ForecastDatasets , operator_config : ForecastOperatorConfig ):
@@ -147,10 +150,12 @@ def find_best_model(self, datasets: ForecastDatasets, operator_config: ForecastO
147
150
model = SupportedModels .Prophet
148
151
logger .error (f"Running { model } model as auto-select failed with the following error: { e .message } " )
149
152
return model
150
- avg_backtests_metrics = {key : sum (value .values ()) / len (value .values ()) for key , value in metrics .items ()}
151
- best_model = min (avg_backtests_metrics , key = avg_backtests_metrics .get )
153
+ nonempty_metrics = {model : metric for model , metric in metrics .items () if metric != {}}
154
+ avg_backtests_metric = {model : sum (value .values ()) / len (value .values ())
155
+ for model , value in nonempty_metrics .items ()}
156
+ best_model = min (avg_backtests_metric , key = avg_backtests_metric .get )
152
157
logger .info (f"Among models { self .models } , { best_model } model shows better performance during backtesting." )
153
- backtest_stats = pd .DataFrame (metrics ).rename_axis ('backtest' )
158
+ backtest_stats = pd .DataFrame (nonempty_metrics ).rename_axis ('backtest' )
154
159
backtest_stats .reset_index (inplace = True )
155
160
output_dir = operator_config .spec .output_directory .url
156
161
backtest_report_name = "backtest_stats.csv"
0 commit comments