from woe_bin import woe_bin
import sys
def woe_bin(merge_data,label):
wb = woe_bin(indata = merge_data, target=label, min_group_rate=0.05, max_bin=6, bin_method='mono', alg_method='iv')
#print(wb)
mapiv = wb.split_data()
#print(mapiv)
mapiv.to_csv('woe_0120_调整_woe_1.csv')
mapiv1 = mapiv[mapiv['iv'] >= 0.02]
#转为woe格式
w_tab = wb.apply_woetab(merge_data, mapiv1)
#print(w_tab)
# w_tab.to_csv('data_woe值.csv')
return w_tab
def lisan_woe(merge_data,t_data,variable,target): ? ? y_all = len(merge_data[target]) ? ? y_1 = sum(merge_data[target]) ? ? y_0 = y_all - y_1 ? ? ##对于特殊部分的woe编码
? ? for k in variable: ? ? ? ? dic_count = {} ? ? ? ? dic_bad = {} ? ? ? ? dic_good = {} ? ? ? ? j = 0 ? ? ? ? mt = merge_data.groupby([k])[target].count().values ? ? ? ? mt_sum = merge_data.groupby([k])[target].sum().values ? ? ? ? for i in merge_data.groupby([k])[target].count().index: ? ? ? ? #df.groupby([col])[target] # ? ? ? ? ? ?print(i) # ? ? ? ? ? ?print(mt[j]) ? ? ? ? ? ? dic_count[i] = mt[j] ? ? ? ? ? ? dic_bad[i] = mt_sum[j] ? ? ? ? ? ? dic_good[i] = mt[j]-mt_sum[j] ? ? ? ? ? ? j += 1 ? ?? ? ? ? ? woe = {} ? ? ? ? for i in merge_data.groupby([k])[target].count().index: ? ? ? ? ? ? woe[i] = np.log(dic_bad[i]/y_1) - np.log(dic_good[i]/y_0) ? ? ? ? ? ? if abs(woe[i]) == np.inf: ? ? ? ? ? ? ? ? woe[i] = np.log((dic_bad[i]+0.05)/y_1) - np.log((dic_good[i]+0.05)/y_0) ? ? ? ? ? ? ? ?? ? ? ? ? null_good,null_bad = y_0-sum(dic_good.values()),y_1-sum(dic_bad.values()) ? ? ? ? null_woe = np.log(null_bad/y_1)-np.log(null_good/y_0) ? ? ? ? if null_good == 0 and null_bad == 0: ? ? ? ? ? ? 1 ? ? ? ? elif abs(null_woe) == np.inf: ? ? ? ? ? ? null_woe = np.log((null_bad+0.05)/y_1)-np.log((null_good+0.05)/y_0) ? ? ? ? ? ? woe[np.NaN] = null_woe ? ? ? ? else: ? ? ? ? ? ? woe[np.NaN] = null_woe ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? listed = merge_data[k] ? ? ? ? t_data['W_'+k] = listed.map(woe) ? ? return t_data lisan_woe(merge_data,w_tab,bp,'is_ovdu')
#merge_data是样本数据,'label'是目标变量
w_tab =?woe_bin(merge_data,'label')
#读取分箱结果
ww = pd.read_csv('woe_0120_调整_woe_1.csv')
#查找只有少量离散变量从而无法分箱的情况
bp =?set(merge_data.columns) - set(np.unique(ww['varname']))?
lisan_woe(merge_data,w_tab,bp,target)
|