-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathaed.py
136 lines (97 loc) · 5.31 KB
/
aed.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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import pandas as pd
import numpy as np
from IPython.display import display
import pandas_profiling
import sweetviz as sv
def gera_relatorios_aed(df, target_feat,
html_pp='base_aed_pp.html',
html_sv='base_aed_sv.html'):
'''
'''
# Gera relatório usando Pandas Profiling
perfil_pp = df.profile_report()
perfil_pp.to_file(output_file=html_pp)
# Gera relatório usando SweetViz
perfil_sv = sv.analyze(df, target_feat=target_feat)
perfil_sv.show_html(html_sv)
return perfil_pp, perfil_sv
class analise_iv:
# função private
def __get_tab_bivariada(self, var_escolhida):
# Cria a contagem de Target_1 e Target_0
df_aux = self.df.copy()
df_aux['target2'] = self.df[self.target]
df2 = df_aux.pivot_table(values='target2',
index=var_escolhida,
columns=self.target,
aggfunc='count')
df2 = df2.rename(columns={0:'#Target_0',
1:'#Target_1'})
df2.fillna(0, inplace=True)
# Cria as demais colunas da tabela bivariada
df2['Total'] = (df2['#Target_0'] + df2['#Target_1'])
df2['%Freq'] = (df2['Total'] / (df2['Total'].sum()) * 100).round(decimals=2)
df2['%Target_1'] = (df2['#Target_1'] / (df2['#Target_1'].sum()) * 100).round(decimals=2)
df2['%Target_0'] = (df2['#Target_0'] / (df2['#Target_0'].sum()) * 100).round(decimals=2)
df2['%Target_0'] = df2['%Target_0'].apply(lambda x: 0.01 if x == 0 else x) #corrige problema do log indeterminado
df2['%Taxa_de_Target_1'] = (df2['#Target_1'] / df2['Total'] * 100).round(decimals=2)
df2['Odds'] = (df2['%Target_1'] / df2['%Target_0']).round(decimals=2)
df2['Odds'] = df2.Odds.apply(lambda x: 0.01 if x == 0 else x) #corrige problema do log indeterminado
df2['LN(Odds)'] = np.log(df2['Odds']).round(decimals=2)
df2['IV'] = (((df2['%Target_1'] / 100 - df2['%Target_0'] / 100) * df2['LN(Odds)'])).round(decimals=2)
df2['IV'] = np.where(df2['Odds'] == 0.01, 0 , df2['IV'])
df2 = df2.reset_index()
df2['Variavel'] = var_escolhida
df2 = df2.rename(columns={var_escolhida: 'Var_Range'})
df2 = df2[['Variavel','Var_Range', '#Target_1','#Target_0', 'Total', '%Freq', '%Target_1', '%Target_0',
'%Taxa_de_Target_1', 'Odds', 'LN(Odds)', 'IV']]
# Guarda uma cópia da tabela no histórico
self.df_tabs_iv = pd.concat([self.df_tabs_iv, df2], axis = 0)
return df2
def get_bivariada(self, var_escolhida='all_vars'):
if var_escolhida == 'all_vars':
#vars = self.df.drop(self.target,axis = 1).columns
vars = self.get_lista_iv().index
for var in vars:
tabela = self.df_tabs_iv[self.df_tabs_iv['Variavel'] == var]
print('==> "{}" tem IV de {}'.format(var,self.df_tabs_iv[self.df_tabs_iv['Variavel'] == var]['IV'].sum().round(decimals=2)))
# printa a tabela no Jupyter
display(tabela)
return
else:
print('==> "{}" tem IV de {}'.format(var_escolhida,self.df_tabs_iv[self.df_tabs_iv['Variavel'] == var_escolhida]['IV'].sum().round(decimals=2)))
return self.df_tabs_iv[self.df_tabs_iv['Variavel'] == var_escolhida]
def get_lista_iv(self):
# agrupa a lista de IV's em ordem descrescente
lista = (self.df_tabs_iv.groupby('Variavel').agg({'IV':'sum'})).sort_values(by=['IV'],ascending=False)
return lista
def __init__(self, df, target, nbins=10):
self.df = df.copy()
self.target = target
#lista de variaveis numericas
df_num = self.df.loc[:,((self.df.dtypes == 'int32') |
(self.df.dtypes == 'int64') |
(self.df.dtypes == 'float64')
)
]
vars = df_num.drop(target,axis = 1).columns
for var in vars:
nome_var = 'fx_' + var
df_num[nome_var] = pd.qcut(df_num[var],
q=nbins,
precision=2,
duplicates='drop')
df_num = df_num.drop(var, axis = 1)
df_num = df_num.rename(columns={nome_var: var})
#lista de variaveis qualitativas
df_str = self.df.loc[:,((self.df.dtypes == 'object') |
(self.df.dtypes == 'category') |
(self.df.dtypes == 'bool'))]
self.df = pd.concat([df_num,df_str],axis = 1)
# inicializa tab historica
self.df_tabs_iv = pd.DataFrame()
vars = self.df.drop(self.target,axis = 1).columns
for var in vars:
self.__get_tab_bivariada(var);
# remove tabs de iv duplicadas
self.df_tabs_iv = self.df_tabs_iv.drop_duplicates(subset=['Variavel','Var_Range'], keep='last')