Python绘制KS曲线的实现方法


Posted in Python onAugust 13, 2018

python实现KS曲线,相关使用方法请参考上篇博客-R语言实现KS曲线

代码如下:

####################### PlotKS ##########################
def PlotKS(preds, labels, n, asc):
  
  # preds is score: asc=1
  # preds is prob: asc=0
  
  pred = preds # 预测值
  bad = labels # 取1为bad, 0为good
  ksds = DataFrame({'bad': bad, 'pred': pred})
  ksds['good'] = 1 - ksds.bad
  
  if asc == 1:
    ksds1 = ksds.sort_values(by=['pred', 'bad'], ascending=[True, True])
  elif asc == 0:
    ksds1 = ksds.sort_values(by=['pred', 'bad'], ascending=[False, True])
  ksds1.index = range(len(ksds1.pred))
  ksds1['cumsum_good1'] = 1.0*ksds1.good.cumsum()/sum(ksds1.good)
  ksds1['cumsum_bad1'] = 1.0*ksds1.bad.cumsum()/sum(ksds1.bad)
  
  if asc == 1:
    ksds2 = ksds.sort_values(by=['pred', 'bad'], ascending=[True, False])
  elif asc == 0:
    ksds2 = ksds.sort_values(by=['pred', 'bad'], ascending=[False, False])
  ksds2.index = range(len(ksds2.pred))
  ksds2['cumsum_good2'] = 1.0*ksds2.good.cumsum()/sum(ksds2.good)
  ksds2['cumsum_bad2'] = 1.0*ksds2.bad.cumsum()/sum(ksds2.bad)
  
  # ksds1 ksds2 -> average
  ksds = ksds1[['cumsum_good1', 'cumsum_bad1']]
  ksds['cumsum_good2'] = ksds2['cumsum_good2']
  ksds['cumsum_bad2'] = ksds2['cumsum_bad2']
  ksds['cumsum_good'] = (ksds['cumsum_good1'] + ksds['cumsum_good2'])/2
  ksds['cumsum_bad'] = (ksds['cumsum_bad1'] + ksds['cumsum_bad2'])/2
  
  # ks
  ksds['ks'] = ksds['cumsum_bad'] - ksds['cumsum_good']
  ksds['tile0'] = range(1, len(ksds.ks) + 1)
  ksds['tile'] = 1.0*ksds['tile0']/len(ksds['tile0'])
  
  qe = list(np.arange(0, 1, 1.0/n))
  qe.append(1)
  qe = qe[1:]
  
  ks_index = Series(ksds.index)
  ks_index = ks_index.quantile(q = qe)
  ks_index = np.ceil(ks_index).astype(int)
  ks_index = list(ks_index)
  
  ksds = ksds.loc[ks_index]
  ksds = ksds[['tile', 'cumsum_good', 'cumsum_bad', 'ks']]
  ksds0 = np.array([[0, 0, 0, 0]])
  ksds = np.concatenate([ksds0, ksds], axis=0)
  ksds = DataFrame(ksds, columns=['tile', 'cumsum_good', 'cumsum_bad', 'ks'])
  
  ks_value = ksds.ks.max()
  ks_pop = ksds.tile[ksds.ks.idxmax()]
  print ('ks_value is ' + str(np.round(ks_value, 4)) + ' at pop = ' + str(np.round(ks_pop, 4)))
  
  # chart
  plt.plot(ksds.tile, ksds.cumsum_good, label='cum_good',
             color='blue', linestyle='-', linewidth=2)
             
  plt.plot(ksds.tile, ksds.cumsum_bad, label='cum_bad',
            color='red', linestyle='-', linewidth=2)
            
  plt.plot(ksds.tile, ksds.ks, label='ks',
          color='green', linestyle='-', linewidth=2)
            
  plt.axvline(ks_pop, color='gray', linestyle='--')
  plt.axhline(ks_value, color='green', linestyle='--')
  plt.axhline(ksds.loc[ksds.ks.idxmax(), 'cumsum_good'], color='blue', linestyle='--')
  plt.axhline(ksds.loc[ksds.ks.idxmax(),'cumsum_bad'], color='red', linestyle='--')
  plt.title('KS=%s ' %np.round(ks_value, 4) + 
        'at Pop=%s' %np.round(ks_pop, 4), fontsize=15)
  

  return ksds
####################### over ##########################

作图效果如下:

Python绘制KS曲线的实现方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
栈和队列数据结构的基本概念及其相关的Python实现
Aug 24 Python
Python中属性和描述符的正确使用
Aug 23 Python
python下读取公私钥做加解密实例详解
Mar 29 Python
基于Python对象引用、可变性和垃圾回收详解
Aug 21 Python
Selenium元素的常用操作方法分析
Aug 10 Python
Python3实现的回文数判断及罗马数字转整数算法示例
Mar 27 Python
Python之修改图片像素值的方法
Jul 03 Python
利用Python绘制有趣的万圣节南瓜怪效果
Oct 31 Python
解决json中ensure_ascii=False的问题
Apr 03 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
Jan 12 Python
python向xls写入数据(包括合并,边框,对齐,列宽)
Feb 02 Python
Python Pytorch查询图像的特征从集合或数据库中查找图像
Apr 09 Python
Python标准库shutil用法实例详解
Aug 13 #Python
详解windows python3.7安装numpy问题的解决方法
Aug 13 #Python
python之super的使用小结
Aug 13 #Python
Selenium控制浏览器常见操作示例
Aug 13 #Python
详解python3中的真值测试
Aug 13 #Python
利用Python将每日一句定时推送至微信的实现方法
Aug 13 #Python
Selenium鼠标与键盘事件常用操作方法示例
Aug 13 #Python
You might like
骨王战斗力在公会成员中排不进前五,却当选了会长,原因竟是这样
2020/03/02 日漫
fleaphp crud操作之find函数的使用方法
2011/04/23 PHP
php语言流程控制中的主动与被动
2012/11/05 PHP
PHP遍历数组的方法汇总
2015/04/30 PHP
PHP框架laravel的.env文件配置教程
2017/06/07 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
jQuery 1.9.1源码分析系列(十五)之动画处理
2015/12/03 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
2016/06/28 Javascript
有关文件上传 非ajax提交 得到后台数据问题
2016/10/12 Javascript
Javascript中关于Array.filter()的妙用详解
2016/12/04 Javascript
详解require.js配置路径的用法和css的引入
2017/09/06 Javascript
vue自定义过滤器创建和使用方法详解
2017/11/06 Javascript
Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件
2018/06/19 Javascript
浅谈vue中组件绑定事件时是否加.native
2019/11/09 Javascript
python实现多线程采集的2个代码例子
2014/07/07 Python
在Python的Django框架下使用django-tagging的教程
2015/05/30 Python
Python实现一个简单的验证码程序
2017/11/03 Python
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
Python实现带下标索引的遍历操作示例
2019/05/30 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
2019/10/11 Python
python读取ini配置文件过程示范
2019/12/23 Python
pyqt5中动画的使用详解
2020/04/01 Python
Chinti & Parker官网:奢华羊绒女装和创新针织设计
2021/01/01 全球购物
GWebs公司笔试题
2012/05/04 面试题
材料物理专业大学毕业生求职信
2013/10/15 职场文书
销售总监工作职责
2013/11/21 职场文书
教师求职信范文分享
2013/12/27 职场文书
军训 自我鉴定
2014/02/03 职场文书
应届生求职自荐信范文
2014/04/07 职场文书
入党积极分子党支部意见
2015/06/02 职场文书
Python利器openpyxl之操作excel表格
2021/04/17 Python
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python
阿里云服务器部署mongodb的详细过程
2021/09/04 MongoDB
Python字典的基础操作
2021/11/01 Python
MongoDB数据库之添删改查
2022/04/26 MongoDB