import pandas as pd import numpy as np from sklearn.base import BaseEstimator, TransformerMixin class FeatureExtractor(BaseEstimator, TransformerMixin): def fit(self, X, y=None): return self def transform(self, X): X_ = X.copy() X_["date"] = pd.to_datetime(X_["date"]) X_["day_of_week"] = X_["date"].dt.dayofweek X_["month"] = X_["date"].dt.month X_["day_of_year"] = X_["date"].dt.dayofyear return X_[["name", "price", "rating", "smart_score", "review_count", "day_of_week", "month", "day_of_year"]] def add_cyclical(df, col, max_val): radians = 2 * np.pi * df[col] / max_val return pd.DataFrame({ f"{col}_sin": np.sin(radians), f"{col}_cos": np.cos(radians) }) def cyclical_features(X): X_ = X.copy() dow = add_cyclical(X_, "day_of_week", 7) month = add_cyclical(X_, "month", 12) doy = add_cyclical(X_, "day_of_year", 365) X_ = X_.drop(columns=["day_of_week", "month", "day_of_year"]) return pd.concat([X_, dow, month, doy], axis=1)