From 8cf1ca9f973c0085ab75f16bcd501fc2bfe13d92 Mon Sep 17 00:00:00 2001 From: Hamid Arian Date: Thu, 11 Jun 2026 17:06:51 +0000 Subject: [PATCH] fix: MDA feature shuffle under pandas copy-on-write rng.shuffle on a DataFrame column view raises 'ValueError: array is read-only' with pandas >= 3.0 (CoW default). Shuffle a copy, assign back. Failed on CI py3.11/3.12 (which resolve pandas 3+); py3.9/3.10 got pandas 2.x and passed. --- CHANGELOG.md | 5 +++++ .../features/feature_importance/feature_importance_mda.py | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee27515..13f9664 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,11 @@ Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versioning: [S ## [Unreleased] +### Fixed +- `features.feature_importance` (MDA): feature shuffling mutated a column view + in place, which raises `ValueError: array is read-only` under pandas + copy-on-write (default since pandas 3.0). Now shuffles a copy and assigns back. + ## [1.0.9] ### Fixed diff --git a/RiskLabAI/features/feature_importance/feature_importance_mda.py b/RiskLabAI/features/feature_importance/feature_importance_mda.py index 20e63bf..0f839f0 100644 --- a/RiskLabAI/features/feature_importance/feature_importance_mda.py +++ b/RiskLabAI/features/feature_importance/feature_importance_mda.py @@ -97,7 +97,12 @@ def compute(self, x: pd.DataFrame, y: pd.Series, **kwargs: Any) -> pd.DataFrame: rng = np.random.default_rng(self.random_state + i) for feature in x.columns: x_test_shuffled = x_test.copy(deep=True) - rng.shuffle(x_test_shuffled[feature].values) # <-- USE SEEDED SHUFFLE + # Shuffle a copy and assign back: with pandas copy-on-write + # (default since pandas 3.0), column .values is a read-only + # view and in-place shuffling raises ValueError. + shuffled_values = x_test_shuffled[feature].to_numpy(copy=True) + rng.shuffle(shuffled_values) # seeded shuffle + x_test_shuffled[feature] = shuffled_values shuffled_proba = fitted_classifier.predict_proba(x_test_shuffled)