| import numpy as np | |
| from sklearn.base import BaseEstimator, TransformerMixin | |
| class StoreAgeAdder(BaseEstimator, TransformerMixin): | |
| def __init__(self, current_year=2025): | |
| self.current_year = current_year | |
| def fit(self, X, y=None): | |
| return self | |
| def transform(self, X): | |
| X = X.copy() | |
| X['store_age'] = self.current_year - X['Store_Establishment_Year'] | |
| return X.drop(columns='Store_Establishment_Year') | |
| class OutlierCapper(BaseEstimator, TransformerMixin): | |
| def __init__(self, factor=1.5): | |
| self.factor = factor | |
| self.bounds = {} | |
| def fit(self, X, y=None): | |
| for col in X.columns: | |
| Q1 = X[col].quantile(0.25) | |
| Q3 = X[col].quantile(0.75) | |
| IQR = Q3 - Q1 | |
| lower = Q1 - self.factor * IQR | |
| upper = Q3 + self.factor * IQR | |
| self.bounds[col] = (lower, upper) | |
| return self | |
| def transform(self, X): | |
| X = X.copy() | |
| for col in X.columns: | |
| lower, upper = self.bounds[col] | |
| X[col] = np.clip(X[col], lower, upper) | |
| return X | |