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编写分析Python程序性能的工具的教程
Apr 01 Python
Python脚本判断 Linux 是否运行在虚拟机上
Apr 25 Python
python通过文件头判断文件类型
Oct 30 Python
python利用不到一百行代码实现一个小siri
Mar 02 Python
python基础之包的导入和__init__.py的介绍
Jan 08 Python
python多进程实现文件下载传输功能
Jul 28 Python
python调用摄像头显示图像的实例
Aug 03 Python
Python 忽略文件名编码的方法
Aug 01 Python
基于python requests selenium爬取excel vba过程解析
Aug 12 Python
python 使用cycle构造无限循环迭代器
Dec 02 Python
Python实现FTP文件定时自动下载的步骤
Dec 19 Python
python asyncio 协程库的使用
Jan 21 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 class类的用法详细总结
2013/10/17 PHP
php curl模拟post提交数据示例
2013/12/31 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
删除重复数据的算法
2006/11/23 Javascript
Javascript - HTML的request类
2007/01/09 Javascript
dropdownlist之间的互相联动实现(显示与隐藏)
2009/11/24 Javascript
javascript offsetX与layerX区别
2010/03/12 Javascript
javascript表格隔行变色加鼠标移入移出及点击效果的方法
2015/04/10 Javascript
JavaScript中join()方法的使用简介
2015/06/09 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
2016/03/30 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
2017/02/27 Javascript
浅谈gulp创建完整的项目流程
2017/12/20 Javascript
vue使用iframe嵌入网页的示例代码
2020/06/09 Javascript
Node.js 使用request模块下载文件的实例
2018/09/05 Javascript
详解适配器在JavaScript中的体现
2018/09/28 Javascript
JS图片懒加载技术实现过程解析
2020/07/27 Javascript
[00:57]英雄,你的补给到了!
2020/11/13 DOTA
python实现斐波那契数列的方法示例
2017/01/12 Python
利用Python循环(包括while&for)各种打印九九乘法表的实例
2017/11/06 Python
浅谈python装饰器探究与参数的领取
2017/12/01 Python
Python3结合Dlib实现人脸识别和剪切
2018/01/24 Python
Python实现图片拼接的代码
2018/07/02 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
2019/10/17 Python
使用wxpy实现自动发送微信消息功能
2020/02/28 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
2020/06/10 Python
Python进行统计建模
2020/08/10 Python
生产部统计员岗位职责
2014/01/05 职场文书
会计工作决心书
2014/03/11 职场文书
团购业务员岗位职责
2014/03/15 职场文书
政府领导干部个人对照检查材料思想汇报
2014/09/24 职场文书
查摆问题整改措施
2014/10/24 职场文书
幼儿园食品安全责任书
2015/05/08 职场文书
外出考察学习心得体会
2016/01/18 职场文书
Python如何解决secure_filename对中文不支持问题
2021/07/16 Python
磁贴还没死, 微软Win11可修改注册表找回Win10开始菜单
2021/11/21 数码科技