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中测试访问同一数据的竞争条件的方法
Apr 23 Python
Python读取图片属性信息的实现方法
Sep 11 Python
Python 字符串大小写转换的简单实例
Jan 21 Python
Python使用dict.fromkeys()快速生成一个字典示例
Apr 24 Python
python利用Opencv实现人脸识别功能
Apr 25 Python
利用PyCharm Profile分析异步爬虫效率详解
May 08 Python
python画图——实现在图上标注上具体数值的方法
Jul 08 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
Feb 25 Python
最简单的matplotlib安装教程(小白)
Jul 28 Python
python安装及变量名介绍详解
Dec 12 Python
python 实现的截屏工具
May 08 Python
使用python求解迷宫问题的三种实现方法
Mar 17 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
PHP实现的简单日历类
2014/11/29 PHP
php判断是否为ajax请求的方法
2016/11/29 PHP
HTA版JSMin(省略修饰语若干)基于javascript语言编写
2009/12/24 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/03 Javascript
jquery简单瀑布流实现原理及ie8下测试代码
2013/01/23 Javascript
js螺旋动画效果的具体实例
2013/11/15 Javascript
javascript等号运算符使用详解
2015/04/16 Javascript
聊一聊JS中this的指向问题
2016/06/17 Javascript
jQuery实现产品对比功能附源码下载
2016/08/09 Javascript
jQuery.form.js插件不能解决连接超时(timeout)的原因分析及解决方法
2016/10/14 Javascript
jQuery模拟窗口抖动效果
2017/03/15 Javascript
vue-cli项目代理proxyTable配置exclude的方法
2018/09/20 Javascript
解决vue项目router切换太慢问题
2020/07/19 Javascript
Vue之封装公用变量以及实现方式
2020/07/31 Javascript
vue pages 多入口项目 + chainWebpack 全局引用缩写说明
2020/09/21 Javascript
[17:13]DOTA2 HEROS教学视频教你分分钟做大人-斯拉克
2014/06/13 DOTA
Python程序员面试题 你必须提前准备!
2018/01/16 Python
python Opencv将图片转为字符画
2021/02/19 Python
python实现图片文件批量重命名
2020/03/23 Python
Python使用pylab库实现绘制直方图功能示例
2018/06/01 Python
django基于存储在前端的token用户认证解析
2019/08/06 Python
python3使用GUI统计代码量
2019/09/18 Python
使用python获取邮箱邮件的设置方法
2019/09/20 Python
pytorch下大型数据集(大型图片)的导入方式
2020/01/08 Python
Python日期格式和字符串格式相互转换的方法
2020/02/18 Python
详解html5 canvas常用api总结(二)--绘图API
2016/12/14 HTML / CSS
在线购买廉价折扣书籍和小说:BookOutlet.com
2018/02/19 全球购物
linux面试题参考答案(9)
2016/01/29 面试题
高级文秘工作总结的自我评价
2013/09/28 职场文书
HR喜欢的自荐信格式
2013/10/08 职场文书
学生安全教育材料
2014/02/14 职场文书
创建无烟单位实施方案
2014/03/29 职场文书
日语系毕业求职信
2014/07/27 职场文书
党支部先进事迹材料
2014/12/24 职场文书
学校教师师德师风承诺书
2015/04/28 职场文书
Linux中如何安装并部署Redis
2022/04/18 Servers