import numpy as np
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.preprocessing import KBinsDiscretizer
[docs]
class IntegerKBinsDiscretizer(BaseEstimator, TransformerMixin):
"""KBinsDiscretizer qui retourne des entiers au lieu de floats"""
def __init__(self, n_bins=5, encode='ordinal', strategy='quantile'):
self.n_bins = n_bins
self.encode = encode
self.strategy = strategy
self.discretizer = KBinsDiscretizer(n_bins=n_bins, encode=encode, strategy=strategy)
[docs]
def fit(self, X, y=None):
self.discretizer.fit(X)
return self
[docs]
class RangeDiscretizer(BaseEstimator, TransformerMixin):
def __init__(self, bins):
# Store the original bins as received (could be list, array, etc.)
self.bins = bins
# Convert to numpy array for internal use
self._bins_array = np.array(bins)
self.n_bins = len(bins) + 1
[docs]
def get_params(self, deep=True):
"""Get parameters for this estimator."""
# Return the original bins (not the numpy array) for proper cloning
return {'bins': self.bins}
[docs]
def set_params(self, **params):
"""Set the parameters of this estimator."""
for key, value in params.items():
if key == 'bins':
self.bins = value
self._bins_array = np.array(value)
self.n_bins = len(value) + 1
else:
setattr(self, key, value)
return self
[docs]
def fit(self, X, y=None):
# Ensure _bins_array is properly initialized
if not hasattr(self, '_bins_array'):
self._bins_array = np.array(self.bins)
return self
[docs]
def __sklearn_clone__(self):
"""Custom cloning method for sklearn compatibility."""
return RangeDiscretizer(bins=self.bins)