解决 Python 中 qcut() 运行报错: Bin edges must be unique和drop duplicate edges by setting 'duplicates' kwarg
本次纠错背景,来源于互金领域信用风控建模中的变量分箱处理。(附在文末)
解决 Python 中 qcut() 函数运行报错:
Bin edges must be unique和 You can drop duplicate edges by setting the ‘duplicates’ kwarg
首先,报错如下:

然后,在qcut() 函数中设置duplicates参数为“drop”(不能设置为“raise”),解决(如下)。

本次纠错背景,来源于互金领域信用风控建模中的变量分箱处理。如下:
# 五、变量选择
# 特征变量选择(排序)对于数据分析、机器学习从业者来说非常重要。
# 好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点、底层结构,这对进一步改善模型、算法都有着重要作用。
# 至于Python的变量选择代码实现可以参考结合Scikit-learn介绍几种常用的特征选择方法。
# 在本文中,我们采用信用评分模型的变量选择方法,通过WOE分析方法,即是通过比较指标分箱和对应分箱的违约概率来确定指标是否符合经济意义。
# 首先我们对变量进行离散化(分箱)处理。
# 5.1 分箱处理
# 变量分箱(binning)是对连续变量离散化(discretization)的一种称呼。
# 信用评分卡开发中一般有常用的等距分段、等深分段、最优分段。
# 其中等距分段(Equval length intervals)是指分段的区间是一致的,比如年龄以十年作为一个分段;
# 等深分段(Equal frequency intervals)是先确定分段数量,然后令每个分段中数据数量大致相等;
# 最优分段(Optimal Binning)又叫监督离散化(supervised discretizaion),使用递归划分(Recursive Partitioning)将连续变量分为分段,背后是一种基于条件推断查找较佳分组的算法。
# 我们首先选择对连续变量进行最优分段,在连续变量的分布不满足最优分段的要求时,再考虑对连续变量进行等距分段。最优分箱的代码如下:
# 定义自动分箱函数
from scipy import stats
def mono_bin(Y, X, n = 20):
r = 0
good=Y.sum()
bad=Y.count()-good
while np.abs(r) < 1:
d1 = pd.DataFrame({"X": X, "Y": Y, "Bucket": pd.qcut(X, n,duplicates="drop")})
# 后面报错You can drop duplicate edges by setting the 'duplicates' kwarg,所以回到这里补充duplicates参数
# pandas中使用qcut(),边界易出现重复值,如果为了删除重复值设置 duplicates=‘drop’,则易出现于分片个数少于指定个数的问题
d2 = d1.groupby('Bucket', as_index = True)
r, p = stats.spearmanr(d2.mean().X, d2.mean().Y)
n = n - 1
d3 = pd.DataFrame(d2.X.min(), columns = ['min'])
d3['min']=d2.min().X
d3['max'] = d2.max().X
d3['sum'] = d2.sum().Y
d3['total'] = d2.count().Y
d3['rate'] = d2.mean().Y
d3['woe']=np.log((d3['rate']/(1-d3['rate']))/(good/bad))
d4 = (d3.sort_index(by = 'min')).reset_index(drop=True)
print("=" * 60)
print(d4)
return d4
# 此定义函数暂未理解通透,暂且保留。这里先直接使用。
# 原帖代码没有导入scipy.stats模块,会导致下一条语句运行报错,上面补上,搞定。
# 原帖代码qcut()函数中没有设置duplicates参数,上面补上,搞定。
# 自定义函数分箱RevolvingUtilizationOfUnsecuredLines时报错You can drop duplicate edges by setting the 'duplicates' kwarg
# 所以先回来删除重复值。删除后发现没有解决问题,真正解决问题是在qcut()函数中没有设置duplicates参数为“drop”(不能设置为“raise”)
data=data.drop_duplicates(subset=None,keep='first',inplace=False)
data.shape
(119703, 11)
# 针对我们将使用最优分段对于数据集中的RevolvingUtilizationOfUnsecuredLines、age、DebtRatio和MonthlyIncome进行分类。
mono_bin(data.SeriousDlqin2yrs,data.RevolvingUtilizationOfUnsecuredLines)
============================================================
min max sum total rate woe
0 0.000000 0.035034 29333 29926 0.980184 1.298275
1 0.035037 0.176771 29205 29926 0.975907 1.098457
2 0.176777 0.577036 28305 29925 0.945865 0.257613
3 0.577040 50708.000000 24607 29926 0.822262 -1.071254
| min | max | sum | total | rate | woe | |
|---|---|---|---|---|---|---|
| 0 | 0.000000 | 0.035034 | 29333 | 29926 | 0.980184 | 1.298275 |
| 1 | 0.035037 | 0.176771 | 29205 | 29926 | 0.975907 | 1.098457 |
| 2 | 0.176777 | 0.577036 | 28305 | 29925 | 0.945865 | 0.257613 |
| 3 | 0.577040 | 50708.000000 | 24607 | 29926 | 0.822262 | -1.071254 |
mono_bin(data.SeriousDlqin2yrs,data.age)
============================================================
min max sum total rate woe
0 21 30 7913 8885 0.890602 -0.506093
1 31 34 6640 7383 0.899363 -0.412828
2 35 38 7594 8386 0.905557 -0.342447
3 39 41 7131 7849 0.908523 -0.307262
4 42 43 4890 5362 0.911973 -0.265031
5 44 46 8163 8868 0.920501 -0.153830
6 47 48 5776 6274 0.920625 -0.152133
7 49 51 8545 9280 0.920797 -0.149768
8 52 53 5454 5901 0.924250 -0.101453
9 54 56 7922 8463 0.936075 0.080980
10 57 59 7517 7946 0.946011 0.260466
11 60 61 4942 5200 0.950385 0.349567
12 62 64 7464 7776 0.959877 0.571844
13 65 68 6968 7212 0.966167 0.748916
14 69 75 7911 8141 0.971748 0.934931
15 76 103 6620 6777 0.976833 1.138606
| min | max | sum | total | rate | woe | |
|---|---|---|---|---|---|---|
| 0 | 21 | 30 | 7913 | 8885 | 0.890602 | -0.506093 |
| 1 | 31 | 34 | 6640 | 7383 | 0.899363 | -0.412828 |
| 2 | 35 | 38 | 7594 | 8386 | 0.905557 | -0.342447 |
| 3 | 39 | 41 | 7131 | 7849 | 0.908523 | -0.307262 |
| 4 | 42 | 43 | 4890 | 5362 | 0.911973 | -0.265031 |
| 5 | 44 | 46 | 8163 | 8868 | 0.920501 | -0.153830 |
| 6 | 47 | 48 | 5776 | 6274 | 0.920625 | -0.152133 |
| 7 | 49 | 51 | 8545 | 9280 | 0.920797 | -0.149768 |
| 8 | 52 | 53 | 5454 | 5901 | 0.924250 | -0.101453 |
| 9 | 54 | 56 | 7922 | 8463 | 0.936075 | 0.080980 |
| 10 | 57 | 59 | 7517 | 7946 | 0.946011 | 0.260466 |
| 11 | 60 | 61 | 4942 | 5200 | 0.950385 | 0.349567 |
| 12 | 62 | 64 | 7464 | 7776 | 0.959877 | 0.571844 |
| 13 | 65 | 68 | 6968 | 7212 | 0.966167 | 0.748916 |
| 14 | 69 | 75 | 7911 | 8141 | 0.971748 | 0.934931 |
| 15 | 76 | 103 | 6620 | 6777 | 0.976833 | 1.138606 |
mono_bin(data.SeriousDlqin2yrs,data.MonthlyIncome)
============================================================
min max sum total rate woe
0 0.0 3400.0 27355 30073 0.909620 -0.293996
1 3401.0 5400.0 27655 30008 0.921588 -0.138884
2 5401.0 8200.0 27925 29725 0.939445 0.138736
3 8201.0 49750.0 28515 29897 0.953775 0.423899
| min | max | sum | total | rate | woe | |
|---|---|---|---|---|---|---|
| 0 | 0.0 | 3400.0 | 27355 | 30073 | 0.909620 | -0.293996 |
| 1 | 3401.0 | 5400.0 | 27655 | 30008 | 0.921588 | -0.138884 |
| 2 | 5401.0 | 8200.0 | 27925 | 29725 | 0.939445 | 0.138736 |
| 3 | 8201.0 | 49750.0 | 28515 | 29897 | 0.953775 | 0.423899 |
智能推荐
opencv学习(七)Mat函数(数据储存结构 /多种初始化创建方式/ 输出矩阵内容),,其他数据结构存放形式
Mat函数数据储存结构 Mat定义矩阵数据结构(初始化)有多种方式(opencv3 详见P108),如最常用的(直接用mat()函数) 输出矩阵的命令也有多种语言风格,但一般为(opencv风格) 例子 输出一个rows=10,col=3(3*3通道)的随机数(限定0-255)矩阵* 其他数据结构存放形式 1.三维点 2.基于Mat的vector 3.存放输出的vector容器...
简单说说自己对自定义view的onMeasure的理解
在学习自定义view 的时候,一直不懂这个东,新手,总感觉这个很难,于是带着猜想写下这篇文章,通过测试来谈谈自己对onMeasure()方法的理解 下面是具体的测试代码 下面是我对测试的过程的回顾与总结 1 .首先为了验证我的猜测,做了以下测试 首先我考虑当view的布局为match_parent时,MeasureSpec对应的mode为AT_MOST 时,由于这样会进行查找父集的数据,而line...
Windows10 通过conda安装PyTorch(流程记录)
文章目录 PyTorch安装记录 前言 1. 检查驱动版本 2. PyTorch安装 3. 下载过慢 PyTorch安装记录 前言 之前在linux里安装了很多次pytorch,这次在Windows10下安装,记录下这个过程,供自己以后参考。由于不同人群可能在环境上存在差异,这里仅记录我自己的安装过程,虽然比较简单,但是不够全面之处还请海涵。 安装方式:conda 版本信息: Anaconda 4...
详解AtomicReference,AtomicStampedReference与AtomicMarkableReference的区别
前言 我们知道CAS是最轻量级的,性能比锁更高,单CPU的开销很大,CAS是英文单词Compare and Swap的缩写,翻译过来就是比较并替换。 CAS原子类操作包括如AtomicBoolean,AtomicUInteger,AtomicLong。它们分别用于Boolean,Integer,Long类型的原子性操作。今天我们主要讲AtomicReference,AtomicStampedRef...
LogStash 安装
LogStash安装 1. LogStash插件介绍 Logstash是一个具有实时管道的开源数据收集引擎。可以动态地统一不同来源的数据,并将数据归到不同目的地。也是一个管理事件和日志工具。你可以用它来收集日志,分析它们,并将它们储存起来以供以后使用。 Logstash 通常都是和 Kibana 以及 Elasticsearch 一起使用。 2. logStash安装 快速启动: 3. logSt...
猜你喜欢
【C++】继承的简单了解!!!
继承机制在C++里面是程序设计使代码可以重复利用的一种重要的手段,它允许在原有类的基础上进行扩展、丰富程序的功能。这样产生的类被称为派生类(子类),这个被继承的类就是基类(父类)。 这里的继承类型和类里面的数据访问权限很类似: 虽然在理论上有三种继承方式,但是在实际应用中常用的是public继承。 在继承里面基类和派生类的作用域是不一样的,即在派生类里面是不可以直接访问基类里面的私有和保护的成员。...
pb获取数据窗 edit source 源码_RxJS 源码解析(一): Observable & Subscription
DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师。 官方网站:devui.design Ng组件库:ng-devui(欢迎Star) 官方交流群:添加DevUI小助手(微信号:devui-official)进群 DevUIHelper插件:DevUIHelper-LSP(欢迎Star) 前言 ReactiveX 是 R...
protobuf使用记录
1、编译proto文件 --java_out表示文件输出位置 .\comment.proto表示proto文件所在位置 如果proto文件中有引用其他proto文件,可以把文件添加到: ...
精品:CentOS7和FastDFS搭建图片服务器
简介 FastDFS 是一个开源的高性能分布式文件系统(Distributed File System),它对文件进行管理,主要功能包括功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。 FastDFS 系统有三个角色:跟踪服务器(Tracker Se...
