原理很简单,初始分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 基于卡方值分箱算法的实现示例相关推荐

  1. ADC12DJ3200 FMC子卡原理图PCB代码 FMC采集卡 JESD204B源码

    ADC12DJ3200 FMC子卡原理图&PCB&代码 FMC采集卡 JESD204B源码 高速ADC 可直接制板 ID:6919999633115104170浪里个浪里个浪001

  2. 基于FPGA的二值图像的膨胀算法的实现

    基于FPGA的二值图像的膨胀算法的实现 1 背景知识 二值图像(Binary Image)是指将图像上的每一个像素只有两种可能的取值或灰度等级状态,人们经常用黑白.B&W.单色图像表示二值图像 ...

  3. python计算商品总价_GitHub - ideaOzy/data_analysis: 基于Python的南京二手房数据采集及可视化分析...

    基于Python的南京二手房数据采集及可视化分析 1 内容简介 首先通过爬虫采集链家网上所有南京二手房的房源数据,并对采集到的数据进行清洗:然后,对清洗后的数据进行可视化分析,探索隐藏在大量数据背后的 ...

  4. python计算2的平方代码_Python练习实例46 | 求输入数字的平方,如果平方运算后小于 50 则退出。...

    这个问题,其实有两种计算的思路,第一种就是需要对结果进行判断,无非就是两种结果,一种结果为真,一种结果为假,将这两种结果分别赋值给1和0,然后创建一个while循环即可. 小黄人.jpg 实现的方式大 ...

  5. python最简单的爬虫代码,python小实例一简单爬虫

    python新手求助 关于爬虫的简单例子 #coding=utf-8from bs4 import BeautifulSoupwith open('', 'r') as file: fcontent ...

  6. 如何用python计算圆周率_如何用python计算圆周率?

    如何用python计算圆周率? python计算圆周率的方法: 圆周率没有精确的计算公式,所以只能用近似的方式计算它的近似值. 我们运用蒙特卡罗方法,思路很简单,在下面图形中随机抛置大量的点, 计算落 ...

  7. python计算两张图片相似度,python 图片相似度匹配

    如何使用python来判断图片相似度 . fromPILimportImageimportos#importhashlibdefgetGray(image_file):tmpls=[]forhinra ...

  8. python创意turtle作品和代码,python创意编程比赛作品

    这篇文章主要介绍了python创意turtle作品和代码,具有一定借鉴价值,需要的朋友可以参考下.希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下. 1.创意编程与python编程区别 ...

  9. Python 计算总分数和平均分 - Python零基础入门教程

    目录 一.Python 计算总分数和平均分源码 二.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一.Python 计算总分数和平 ...

  10. python清晰度增强_3行代码Python搞定图片清晰度识别,原来我们看到的不一定是这样的...

    有了代表清晰度的值,剩下的工作就是设定相应的阀值,如果某图片方差低于预先定义的阈值,那么该图片就可以被认为是模糊的,高于阈值,就不是模糊的. 实操 原理看起来比较复杂,涉及到很多信号啊图片处理的相关知 ...

最新文章

  1. StringUtils
  2. 剑指offer_第3题_从尾到头打印链表
  3. 常用的Firefox浏览器插件、Chrome浏览器插件收藏
  4. OC-NSFileManager和NSFileHandle的使用
  5. Activiti 5.3:子流程(subProcess)
  6. php文件名函数,详解php 获取文件名basename()函数的用法
  7. C++自学08:类型推断(auto/typeid)
  8. Python之面向对象 私有属性和私有方法
  9. java开辟_仿照百度文库_FlexPaper
  10. 7628刷breed_我的刷breed机方法 一步一图超详细
  11. 《自己动手写网络爬虫》读书笔记——队列与集合
  12. 电脑计算机无法找到脚本文件夹,电脑弹出无法找到脚本文件怎么办
  13. GoodERP交付手册:CRM模块交付
  14. 云技术:弹性计算ECS
  15. 交换机和路由器技术-07-静态路由配置
  16. 解决DeepL翻译器翻译出来的文档是只读模式,不能编辑
  17. 金秋发布会·实在里程碑,从RPA 向 IPA 进军!
  18. 京沪高铁上火车位置的实时监视模拟网站的开发
  19. 国外服务器被攻击以及应对方法
  20. 学习的目的:建立世界观、学以致用、知行合一

热门文章

  1. supersu二进制更新安装失败_supersu 二进制更新解决方法
  2. 1308:【例1.5】高精除
  3. c语言获取系统时间精确到毫秒,如何获取系统流逝时间(要求精确到毫秒)
  4. java数组写99乘法表,Java 实例九九乘法表
  5. [读书]如果人类只有一种性别的话
  6. 任意进制加法计数器电路设计
  7. 485通讯问题及解决调试方案提炼
  8. 海康USB摄像头----MV-CAO13-21UM工业摄像头的调用---python实现
  9. 使用tkinter canvas绘制中国象棋棋盘
  10. 当moba遇上麻将——刀塔自走棋