@@ -18,15 +18,22 @@ def _collect_required_features(model_wrappers: Dict[str, Any]) -> set[str]:
1818 return required_features
1919
2020
21- def _merge_common_features (loader : DataLoader , df : pd .DataFrame ) -> pd .DataFrame :
21+ def _merge_common_features (
22+ loader : DataLoader ,
23+ df : pd .DataFrame ,
24+ allow_backward_fill : bool = True ,
25+ ) -> pd .DataFrame :
2226 merged = df .copy ()
2327
2428 if not loader .macro_df .empty :
2529 merged = pd .merge (merged , loader .macro_df , on = "date" , how = "left" )
2630 if not loader .breadth_df .empty :
2731 merged = pd .merge (merged , loader .breadth_df , on = "date" , how = "left" )
2832
29- return merged .ffill ().bfill ()
33+ merged = merged .ffill ()
34+ if allow_backward_fill :
35+ merged = merged .bfill ()
36+ return merged
3037
3138
3239def load_and_preprocess_data (
@@ -36,6 +43,7 @@ def load_and_preprocess_data(
3643 pipeline_config : PipelineConfig ,
3744 data_config : DataConfig ,
3845 model_wrappers : Dict [str , Any ],
46+ allow_backward_fill : bool = True ,
3947) -> dict [str , pd .DataFrame ]:
4048 """
4149 Load price data once, then enrich each ticker only with the features required
@@ -62,7 +70,11 @@ def load_and_preprocess_data(
6270 continue
6371
6472 try :
65- df = _merge_common_features (loader , df )
73+ df = _merge_common_features (
74+ loader ,
75+ df ,
76+ allow_backward_fill = allow_backward_fill ,
77+ )
6678 df = add_technical_indicators (df )
6779 df = add_multi_timeframe_features (df )
6880 df .set_index ("date" , inplace = True )
0 commit comments