11from typing import Final
22
33import numpy as np
4+ import pandas as pd
45from sklearn .preprocessing import StandardScaler
56from sklearn .base import BaseEstimator , TransformerMixin
67
@@ -31,9 +32,10 @@ def __init__(
3132 before log-transformation
3233 log_base: base of the log-transformation
3334 """
34- self ._shift : Final [float ] = shift
35- self ._standard_scaler : StandardScaler = StandardScaler ()
36- self ._log_base : float | int = log_base
35+ self .shift : Final [float ] = shift
36+ self .log_base : float | int = log_base
37+
38+ self .feature_names_in_ = None
3739
3840 @staticmethod
3941 def _validate_shift (shift : float ) -> None :
@@ -42,16 +44,34 @@ def _validate_shift(shift: float) -> None:
4244 f"Received value { shift = } " )
4345
4446 def _log_transform (self , X ):
45- return np .emath .logn (n = self ._log_base , x = X + self ._shift )
47+ return np .emath .logn (n = self .log_base , x = X + self .shift )
4648
47- def fit (self , X , y = None ):
49+ def fit (self , X : pd .DataFrame ):
50+ self ._standard_scaler : StandardScaler = StandardScaler () # noqa
51+ if not isinstance (X , pd .DataFrame ):
52+ raise ValueError ("This estimator only accepts pd.DataFrame input!" )
53+ self .feature_names_in_ = list (X .columns )
4854 X_log = self ._log_transform (X = X )
4955 self ._standard_scaler .fit (X = X_log )
5056 return self
5157
52- def transform (self , X ):
58+ def transform (self , X : pd .DataFrame ):
59+ if not isinstance (X , pd .DataFrame ):
60+ raise ValueError ("This transformer only accepts pd.DataFrame input!" )
5361 X_log = self ._log_transform (X = X )
54- return self ._standard_scaler .transform (X = X_log + self ._shift )
62+ return self ._standard_scaler .transform (X = X_log + self .shift )
5563
5664 def fit_transform (self , X , y = None , ** fit_params ):
5765 return self .fit (X = X ).transform (X = X )
66+
67+ def get_feature_names_out (self , input_features = None ):
68+ if input_features is None :
69+ if self .feature_names_in_ is not None :
70+ input_features = self .feature_names_in_
71+ else :
72+ raise ValueError ("No input features provided and none "
73+ "were stored during fit! " )
74+ return [
75+ f"log_base_{ self .log_base :0.2f} _shift_{ self .shift :0.2f} _{ feature } "
76+ for feature in input_features
77+ ]
0 commit comments