-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathutils.py
85 lines (71 loc) · 3.74 KB
/
utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import pandas as pd
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.preprocessing import OneHotEncoder, MinMaxScaler, OrdinalEncoder
# Classes para pipeline
class DropFeatures(BaseEstimator,TransformerMixin):
def __init__(self,feature_to_drop = ['ID_Cliente']):
self.feature_to_drop = feature_to_drop
def fit(self,df):
return self
def transform(self,df):
if (set(self.feature_to_drop).issubset(df.columns)):
df.drop(self.feature_to_drop,axis=1,inplace=True)
return df
else:
print('Uma ou mais features não estão no DataFrame')
return df
class OneHotEncodingNames(BaseEstimator,TransformerMixin):
def __init__(self,OneHotEncoding = ['Estado_civil', 'Moradia', 'Categoria_de_renda',
'Ocupacao']):
self.OneHotEncoding = OneHotEncoding
def fit(self,df):
return self
def transform(self,df):
if (set(self.OneHotEncoding).issubset(df.columns)):
# função para one-hot-encoding das features
def one_hot_enc(df,OneHotEncoding):
one_hot_enc = OneHotEncoder()
one_hot_enc.fit(df[OneHotEncoding])
# obtendo o resultado dos nomes das colunas
feature_names = one_hot_enc.get_feature_names_out(OneHotEncoding)
# mudando o array do one hot encoding para um dataframe com os nomes das colunas
df = pd.DataFrame(one_hot_enc.transform(df[self.OneHotEncoding]).toarray(),
columns= feature_names,index=df.index)
return df
# função para concatenar as features com aquelas que não passaram pelo one-hot-encoding
def concat_with_rest(df,one_hot_enc_df,OneHotEncoding):
outras_features = [feature for feature in df.columns if feature not in OneHotEncoding]
# concaternar o restante das features com as features que passaram pelo one-hot-encoding
df_concat = pd.concat([one_hot_enc_df, df[outras_features]],axis=1)
return df_concat
# one hot encoded dataframe
df_OneHotEncoding = one_hot_enc(df,self.OneHotEncoding)
# retorna o dataframe concatenado
df_full = concat_with_rest(df, df_OneHotEncoding,self.OneHotEncoding)
return df_full
class OrdinalFeature(BaseEstimator,TransformerMixin):
def __init__(self,ordinal_feature = ['Grau_escolaridade']):
self.ordinal_feature = ordinal_feature
def fit(self,df):
return self
def transform(self,df):
if 'Grau_escolaridade' in df.columns:
ordinal_encoder = OrdinalEncoder()
df[self.ordinal_feature] = ordinal_encoder.fit_transform(df[self.ordinal_feature])
return df
else:
print('Grau_escolaridade não está no DataFrame')
return df
class MinMaxWithFeatNames(BaseEstimator,TransformerMixin):
def __init__(self,min_max_scaler_ft = ['Idade', 'Rendimento_anual', 'Tamanho_familia', 'Anos_empregado']):
self.min_max_scaler_ft = min_max_scaler_ft
def fit(self,df):
return self
def transform(self,df):
if (set(self.min_max_scaler_ft).issubset(df.columns)):
min_max_enc = MinMaxScaler()
df[self.min_max_scaler_ft] = min_max_enc.fit_transform(df[self.min_max_scaler_ft])
return df
else:
print('Uma ou mais features não estão no DataFrame')
return df