66from .base import Exporter
77from ..results .report import EvaluationReport
88
9+ _MERGE_KEYS = ["run_date" , "target_date" , "hour" , "horizon" ]
10+
911
1012class CsvExporter (Exporter ):
1113 def __init__ (self , path : str , extra_columns : Optional [List [str ]] = None ):
@@ -25,21 +27,25 @@ def export(self, report: EvaluationReport) -> None:
2527
2628 self .path .parent .mkdir (parents = True , exist_ok = True )
2729
28- sort_keys = ["target_date" , "hour" , "horizon" ]
2930 base_cols = ["run_date" , "target_date" , "hour" , "horizon" , "day_in_test" , "actual" ]
30-
3131 base_df : Optional [pd .DataFrame ] = None
32- model_names : List [str ] = []
3332
3433 for model_name , model_df in report .iter_details ():
35- model_df = model_df .sort_values (by = sort_keys ).reset_index (drop = True )
36- if base_df is None :
37- base_df = model_df [base_cols ].copy ()
38- base_df [f"{ model_name } _prediction" ] = model_df ["prediction" ].values
39- base_df [f"{ model_name } _error" ] = (
40- model_df ["prediction" ].values - base_df ["actual" ].values
34+ model_df = model_df .rename (columns = {
35+ "prediction" : f"{ model_name } _prediction" ,
36+ })
37+ model_df [f"{ model_name } _error" ] = (
38+ model_df [f"{ model_name } _prediction" ] - model_df ["actual" ]
4139 )
42- model_names .append (model_name )
40+ keep = _MERGE_KEYS + [f"{ model_name } _prediction" , f"{ model_name } _error" ]
41+ if base_df is None :
42+ base_df = model_df [base_cols + [f"{ model_name } _prediction" , f"{ model_name } _error" ]].copy ()
43+ else :
44+ base_df = base_df .merge (
45+ model_df [keep ],
46+ on = _MERGE_KEYS ,
47+ how = "outer" ,
48+ )
4349 del model_df
4450
4551 if base_df is None :
@@ -48,6 +54,7 @@ def export(self, report: EvaluationReport) -> None:
4854 if self .extra_columns and report .source_data is not None :
4955 base_df = self ._join_extra_columns (base_df , report .source_data )
5056
57+ sort_keys = ["target_date" , "hour" , "horizon" ]
5158 base_df = base_df .sort_values (by = sort_keys ).reset_index (drop = True )
5259 base_df .to_csv (self .path , index = False )
5360
0 commit comments