Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # 等频分箱
- def bin_frequency(x,y,n=10): # x为待分箱的变量,y为target变量.n为分箱数量
- total = y.count() # 计算总样本数
- bad = y.sum() # 计算坏样本数,坏样本为1,好样本为0
- good = y.count()-y.sum() # 计算好样本数
- d1 = pd.DataFrame({'x':x,'y':y,'bucket':pd.qcut(x,n)}) # 用pd.cut实现等频分箱
- d2 = d1.groupby('bucket',as_index=True) # 按照分箱结果进行分组聚合
- d3 = pd.DataFrame(d2.x.min(),columns=['min_bin'])
- d3['min_bin'] = d2.x.min() # 箱体的左边界
- d3['max_bin'] = d2.x.max() # 箱体的右边界
- d3['bad'] = d2.y.sum() # 每个箱体中坏样本的数量
- d3['total'] = d2.y.count() # 每个箱体的总样本数
- d3['bad_rate'] = d3['bad']/d3['total'] # 每个箱体中坏样本所占总样本数的比例
- d3['badattr'] = d3['bad']/bad # 每个箱体中坏样本所占坏样本总数的比例
- d3['goodattr'] = (d3['total'] - d3['bad'])/good # 每个箱体中好样本所占好样本总数的比例
- d3['woe'] = np.log(d3['goodattr']/d3['badattr']) # 计算每个箱体的woe值
- iv = ((d3['goodattr']-d3['badattr'])*d3['woe']).sum() # 计算变量的iv值
- d4 = (d3.sort_values(by='min_bin')).reset_index(drop=True) # 对箱体从大到小进行排序
- print('分箱结果:')
- print(d4)
- print('IV值为:')
- print(iv)
- cut = []
- cut.append(float('-inf'))
- for i in d4.min_bin:
- cut.append(i)
- cut.append(float('inf'))
- woe = list(d4['woe'].round(3))
- return d4,iv,cut,woe
- # 等距分箱
- def bin_distince(x,y,n=10): # x为待分箱的变量,y为target变量.n为分箱数量
- total = y.count() # 计算总样本数
- bad = y.sum() # 计算坏样本数 坏样本为1,好样本为0
- good = y.count()-y.sum() # 计算好样本数
- d1 = pd.DataFrame({'x':x,'y':y,'bucket':pd.cut(x,n)}) #利用pd.cut实现等距分箱
- d2 = d1.groupby('bucket',as_index=True) # 按照分箱结果进行分组聚合
- d3 = pd.DataFrame(d2.x.min(),columns=['min_bin'])
- d3['min_bin'] = d2.x.min() # 箱体的左边界
- d3['max_bin'] = d2.x.max() # 箱体的右边界
- d3['bad'] = d2.y.sum() # 每个箱体中坏样本的数量
- d3['total'] = d2.y.count() # 每个箱体的总样本数
- d3['bad_rate'] = d3['bad']/d3['total'] # 每个箱体中坏样本所占总样本数的比例
- d3['badattr'] = d3['bad']/bad # 每个箱体中坏样本所占坏样本总数的比例
- d3['goodattr'] = (d3['total'] - d3['bad'])/good # 每个箱体中好样本所占好样本总数的比例
- d3['woe'] = np.log(d3['goodattr']/d3['badattr']) # 计算每个箱体的woe值
- iv = ((d3['goodattr']-d3['badattr'])*d3['woe']).sum() # 计算变量的iv值
- d4 = (d3.sort_values(by='min_bin')).reset_index(drop=True) # 对箱体从大到小进行排序
- print('分箱结果:')
- print(d4)
- print('IV值为:')
- print(iv)
- cut = []
- cut.append(float('-inf'))
- for i in d4.min_bin:
- cut.append(i)
- cut.append(float('inf'))
- woe = list(d4['woe'].round(3))
- return d4,iv,cut,woe
- # 自定义分箱
- def bin_self(x,y,cut): # x为待分箱的变量,y为target变量,cut为自定义的分箱(list)
- total = y.count() # 计算总样本数
- bad = y.sum() # 计算坏样本数 坏样本为1,好样本为0
- good = y.count()-y.sum() # 计算好样本数
- d1 = pd.DataFrame({'x':x,'y':y,'bucket':pd.cut(x,cut)})
- d2 = d1.groupby('bucket',as_index=True) # 按照分箱结果进行分组聚合
- d3 = pd.DataFrame(d2.x.min(),columns=['min_bin'])
- d3['min_bin'] = d2.x.min() # 箱体的左边界
- d3['max_bin'] = d2.x.max() # 箱体的右边界
- d3['bad'] = d2.y.sum() # 每个箱体中坏样本的数量
- d3['total'] = d2.y.count() # 每个箱体的总样本数
- d3['bad_rate'] = d3['bad']/d3['total'] # 每个箱体中坏样本所占总样本数的比例
- d3['badattr'] = d3['bad']/bad # 每个箱体中坏样本所占坏样本总数的比例
- d3['goodattr'] = (d3['total'] - d3['bad'])/good # 每个箱体中好样本所占好样本总数的比例
- d3['woe'] = np.log(d3['goodattr']/d3['badattr']) # 计算每个箱体的woe值
- iv = ((d3['goodattr']-d3['badattr'])*d3['woe']).sum() # 计算变量的iv值
- d4 = (d3.sort_values(by='min_bin')).reset_index(drop=True) # 对箱体从大到小进行排序
- print('分箱结果:')
- print(d4)
- print('IV值为:')
- print(iv)
- woe = list(d4['woe'].round(3))
- return d4,iv,woe
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement