|
@@ -5,13 +5,20 @@
|
|
|
@desc: 特征工具类
|
|
|
"""
|
|
|
import pandas as pd
|
|
|
-
|
|
|
+from sklearn.preprocessing import KBinsDiscretizer
|
|
|
from entitys import DataSplitEntity
|
|
|
|
|
|
|
|
|
-def f_get_bins(data: DataSplitEntity) -> pd.DataFrame:
|
|
|
- pass
|
|
|
-
|
|
|
+def f_get_bins(data: DataSplitEntity, feat: str, strategy: str='quantile', nbins: int=10) -> pd.DataFrame:
|
|
|
+ # 等频分箱
|
|
|
+ if strategy == 'quantile':
|
|
|
+ kbin_encoder = KBinsDiscretizer(n_bins=nbins, encode='ordinal', strategy='quantile')
|
|
|
+ feature_binned = kbin_encoder.fit_transform(data[feat])
|
|
|
+ return feature_binned.astype(int).astype(str)
|
|
|
+ # 等宽分箱
|
|
|
+ if strategy == 'width':
|
|
|
+ bin_width = (data[feat].max()-data[feat].min()) / nbins
|
|
|
+ return pd.cut(data[feat], bins=nbins, labels=[f'Bin_{i}' for i in range(1, nbins+1)])
|
|
|
|
|
|
def f_get_woe(data: DataSplitEntity) -> pd.DataFrame:
|
|
|
pass
|