python计算卡方值代码,python 基于卡方值分箱算法的实现示例
原理很简单,初始分20箱或更多,先确保每箱中都含有0,1标签,对不包含0,1标签的箱向前合并,计算各箱卡方值,对卡方值最小的箱向后合并,代码如下
import pandas as pd
import numpy as np
import scipy
from scipy import stats
def chi_bin(DF,var,target,binnum=5,maxcut=20):
'''
DF:data
var:variable
target:target / label
binnum: the number of bins output
maxcut: initial bins number
'''
data=DF[[var,target]]
#equifrequent cut the var into maxcut bins
data["cut"],breaks=pd.qcut(data[var],q=maxcut,duplicates="drop",retbins=True)
#count 1,0 in each bin
count_1=data.loc[data[target]==1].groupby("cut")[target].count()
count_0=data.loc[data[target]==0].groupby("cut")[target].count()
#get bins value: min,max,count 0,count 1
bins_value=[*zip(breaks[:maxcut-1],breaks[1:],count_0,count_1)]
#define woe
def woe_value(bins_value):
df_woe=pd.DataFrame(bins_value)
df_woe.columns=["min","max","count_0","count_1"]
df_woe["total"]=df_woe.count_1+df_woe.count_0
df_woe["bad_rate"]=df_woe.count_1/df_woe.total
df_woe["woe"]=np.log((df_woe.count_0/df_woe.count_0.sum())/(df_woe.count_1/df_woe.count_1.sum()))
return df_woe
#define iv
def iv_value(df_woe):
rate=(df_woe.count_0/df_woe.count_0.sum())-(df_woe.count_1/df_woe.count_1.sum())
iv=np.sum(rate * df_woe.woe)
return iv
#make sure every bin contain 1 and 0
##first bin merge backwards
for i in range(len(bins_value)):
if 0 in bins_value[0][2:]:
bins_value[0:2]=[(
bins_value[0][0],
bins_value[1][1],
bins_value[0][2]+bins_value[1][2],
bins_value[0][3]+bins_value[1][3])]
continue
##bins merge forwards
if 0 in bins_value[i][2:]:
bins_value[i-1:i+1]=[(
bins_value[i-1][0],
bins_value[i][1],
bins_value[i-1][2]+bins_value[i][2],
bins_value[i-1][3]+bins_value[i][3])]
break
else:
break
#calculate chi-square merge the minimum chisquare
while len(bins_value)>binnum:
chi_squares=[]
for i in range(len(bins_value)-1):
a=bins_value[i][2:]
b=bins_value[i+1][2:]
chi_square=scipy.stats.chi2_contingency([a,b])[0]
chi_squares.append(chi_square)
#merge the minimum chisquare backwards
i = chi_squares.index(min(chi_squares))
bins_value[i:i+2]=[(
bins_value[i][0],
bins_value[i+1][1],
bins_value[i][2]+bins_value[i+1][2],
bins_value[i][3]+bins_value[i+1][3])]
df_woe=woe_value(bins_value)
#print bin number and iv
print("箱数:{},iv:{:.6f}".format(len(bins_value),iv_value(df_woe)))
#return bins and woe information
return woe_value(bins_value)
以下是效果:
初始分成10箱,目标为3箱
chi_bin(data,"age","SeriousDlqin2yrs",binnum=3,maxcut=10)
箱数:8,iv:0.184862
箱数:7,iv:0.184128
箱数:6,iv:0.179518
箱数:5,iv:0.176980
箱数:4,iv:0.172406
箱数:3,iv:0.160015
min max count_0 count_1 total bad_rate woe
0 0.0 52.0 70293 7077 77370 0.091470 -0.266233
1 52.0 61.0 29318 1774 31092 0.057056 0.242909
2 61.0 72.0 26332 865 27197 0.031805 0.853755
python计算卡方值代码,python 基于卡方值分箱算法的实现示例相关推荐
- ADC12DJ3200 FMC子卡原理图PCB代码 FMC采集卡 JESD204B源码
ADC12DJ3200 FMC子卡原理图&PCB&代码 FMC采集卡 JESD204B源码 高速ADC 可直接制板 ID:6919999633115104170浪里个浪里个浪001
- 基于FPGA的二值图像的膨胀算法的实现
基于FPGA的二值图像的膨胀算法的实现 1 背景知识 二值图像(Binary Image)是指将图像上的每一个像素只有两种可能的取值或灰度等级状态,人们经常用黑白.B&W.单色图像表示二值图像 ...
- python计算商品总价_GitHub - ideaOzy/data_analysis: 基于Python的南京二手房数据采集及可视化分析...
基于Python的南京二手房数据采集及可视化分析 1 内容简介 首先通过爬虫采集链家网上所有南京二手房的房源数据,并对采集到的数据进行清洗:然后,对清洗后的数据进行可视化分析,探索隐藏在大量数据背后的 ...
- python计算2的平方代码_Python练习实例46 | 求输入数字的平方,如果平方运算后小于 50 则退出。...
这个问题,其实有两种计算的思路,第一种就是需要对结果进行判断,无非就是两种结果,一种结果为真,一种结果为假,将这两种结果分别赋值给1和0,然后创建一个while循环即可. 小黄人.jpg 实现的方式大 ...
- python最简单的爬虫代码,python小实例一简单爬虫
python新手求助 关于爬虫的简单例子 #coding=utf-8from bs4 import BeautifulSoupwith open('', 'r') as file: fcontent ...
- 如何用python计算圆周率_如何用python计算圆周率?
如何用python计算圆周率? python计算圆周率的方法: 圆周率没有精确的计算公式,所以只能用近似的方式计算它的近似值. 我们运用蒙特卡罗方法,思路很简单,在下面图形中随机抛置大量的点, 计算落 ...
- python计算两张图片相似度,python 图片相似度匹配
如何使用python来判断图片相似度 . fromPILimportImageimportos#importhashlibdefgetGray(image_file):tmpls=[]forhinra ...
- python创意turtle作品和代码,python创意编程比赛作品
这篇文章主要介绍了python创意turtle作品和代码,具有一定借鉴价值,需要的朋友可以参考下.希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下. 1.创意编程与python编程区别 ...
- Python 计算总分数和平均分 - Python零基础入门教程
目录 一.Python 计算总分数和平均分源码 二.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一.Python 计算总分数和平 ...
- python清晰度增强_3行代码Python搞定图片清晰度识别,原来我们看到的不一定是这样的...
有了代表清晰度的值,剩下的工作就是设定相应的阀值,如果某图片方差低于预先定义的阈值,那么该图片就可以被认为是模糊的,高于阈值,就不是模糊的. 实操 原理看起来比较复杂,涉及到很多信号啊图片处理的相关知 ...
最新文章
- StringUtils
- 剑指offer_第3题_从尾到头打印链表
- 常用的Firefox浏览器插件、Chrome浏览器插件收藏
- OC-NSFileManager和NSFileHandle的使用
- Activiti 5.3:子流程(subProcess)
- php文件名函数,详解php 获取文件名basename()函数的用法
- C++自学08:类型推断(auto/typeid)
- Python之面向对象 私有属性和私有方法
- java开辟_仿照百度文库_FlexPaper
- 7628刷breed_我的刷breed机方法 一步一图超详细
- 《自己动手写网络爬虫》读书笔记——队列与集合
- 电脑计算机无法找到脚本文件夹,电脑弹出无法找到脚本文件怎么办
- GoodERP交付手册:CRM模块交付
- 云技术:弹性计算ECS
- 交换机和路由器技术-07-静态路由配置
- 解决DeepL翻译器翻译出来的文档是只读模式,不能编辑
- 金秋发布会·实在里程碑,从RPA 向 IPA 进军!
- 京沪高铁上火车位置的实时监视模拟网站的开发
- 国外服务器被攻击以及应对方法
- 学习的目的:建立世界观、学以致用、知行合一