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处理文本文件实现生成指定格式文件的方法
Jul 31 Python
Python从MP3文件获取id3的方法
Jun 15 Python
解析Python中的__getitem__专有方法
Jun 27 Python
linecache模块加载和缓存文件内容详解
Jan 11 Python
tensorflow实现简单的卷积网络
May 24 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
May 28 Python
pandas 小数位数 精度的处理方法
Jun 09 Python
python实现合并两个排序的链表
Mar 03 Python
python enumerate内置函数用法总结
Jan 07 Python
详解python 破解网站反爬虫的两种简单方法
Feb 09 Python
Python3变量与基本数据类型用法实例分析
Feb 14 Python
Keras 加载已经训练好的模型进行预测操作
Jun 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
PHP6 mysql连接方式说明
2009/02/09 PHP
PHP数据类型之布尔型的介绍
2013/04/28 PHP
php 邮件发送问题解决
2014/03/22 PHP
php把数据表导出为Excel表的最简单、最快的方法(不用插件)
2014/05/10 PHP
PHP中函数gzuncompress无法使用的解决方法
2017/03/02 PHP
PHP实现上传图片到数据库并显示输出的方法
2018/05/31 PHP
document.all还是document.getElementsByName?
2006/07/21 Javascript
用Javascript 获取页面元素的位置的代码
2009/09/25 Javascript
JavaScript 对象链式操作测试代码
2010/04/25 Javascript
jquery tab标签页的制作
2010/05/10 Javascript
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
JavaScript中的toLocaleDateString()方法使用简介
2015/06/12 Javascript
JavaScript代码实现禁止右键、禁选择、禁粘贴、禁shift、禁ctrl、禁alt
2015/11/17 Javascript
BootStrap 智能表单实战系列(二)BootStrap支持的类型简介
2016/06/13 Javascript
Vue自定义指令介绍(2)
2016/12/08 Javascript
JavaScript控制输入框中只能输入中文、数字和英文的方法【基于正则实现】
2017/03/03 Javascript
HTML中使背景图片自适应浏览器大小实例详解
2017/04/06 Javascript
ionic2自定义cordova插件开发以及使用(Android)
2017/06/19 Javascript
在Vue中使用echarts的实例代码(3种图)
2017/07/10 Javascript
js断点调试经验分享
2017/12/08 Javascript
利用ES6实现单例模式及其应用详解
2017/12/09 Javascript
jQuery实现弹窗下底部页面禁止滑动效果
2017/12/19 jQuery
使用webpack-dev-server处理跨域请求的方法
2018/04/18 Javascript
layui插件表单验证提交触发提交的例子
2019/09/09 Javascript
vue简单封装axios插件和接口的统一管理操作示例
2020/02/02 Javascript
vue 使用class创建和清除水印的示例代码
2020/12/25 Vue.js
Python实现数据结构线性链表(单链表)算法示例
2019/05/04 Python
Python之pymysql的使用小结
2019/07/01 Python
Python实现一个带权无回置随机抽选函数的方法
2019/07/24 Python
python中property和setter装饰器用法
2019/12/19 Python
加拿大最大的书店:Indigo
2017/01/01 全球购物
网络信息管理员岗位职责
2014/01/05 职场文书
父亲追悼会答谢词
2014/01/17 职场文书
我的求职择业计划书
2014/04/04 职场文书
2014年社区宣传工作总结
2014/12/02 职场文书
2015年销售助理工作总结
2015/05/11 职场文书