From f2572944ba3112ffd2c6548c10f796fc17f41fbe Mon Sep 17 00:00:00 2001 From: Felix JK Date: Sat, 21 Mar 2026 13:31:37 +0100 Subject: [PATCH] Fix FutureWarning: pass include_groups=False to groupby().apply() Starting with pandas 2.2, groupby().apply() emits a FutureWarning when the grouping columns are included in the passed DataFrame. Add include_groups=False to all three call sites (two in evaluation.py, one in postprocessing.py) to silence the warning and prepare for pandas 3.0 where the default will change. Co-Authored-By: Claude Opus 4.6 --- numerblox/evaluation.py | 6 ++++-- numerblox/postprocessing.py | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/numerblox/evaluation.py b/numerblox/evaluation.py index af761e5a..7ae841db 100644 --- a/numerblox/evaluation.py +++ b/numerblox/evaluation.py @@ -148,7 +148,8 @@ def per_era_corrs( return dataf.groupby(dataf[self.era_col]).apply( lambda d: self._normalize_uniform(d[pred_col].fillna(0.5)).corr( d[target_col] - ) + ), + include_groups=False, ) def mean_std_sharpe( @@ -207,7 +208,8 @@ def max_feature_exposure( ) -> np.float64: """Maximum exposure over all features.""" max_per_era = dataf.groupby(self.era_col).apply( - lambda d: d[dataf.feature_cols].corrwith(d[pred_col]).abs().max() + lambda d: d[dataf.feature_cols].corrwith(d[pred_col]).abs().max(), + include_groups=False, ) max_feature_exposure = max_per_era.mean(skipna=True) return max_feature_exposure diff --git a/numerblox/postprocessing.py b/numerblox/postprocessing.py index 1960b3b7..285831bc 100644 --- a/numerblox/postprocessing.py +++ b/numerblox/postprocessing.py @@ -184,7 +184,8 @@ def __init__( def transform(self, dataf: NumerFrame) -> NumerFrame: feature_names = self.feature_names if self.feature_names else dataf.feature_cols neutralized_preds = dataf.groupby(dataf.meta.era_col).apply( - lambda x: self.normalize_and_neutralize(x, [self.pred_name], feature_names) + lambda x: self.normalize_and_neutralize(x, [self.pred_name], feature_names), + include_groups=False, ) dataf.loc[:, self.new_col_name] = MinMaxScaler().fit_transform( neutralized_preds