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