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在hadoop上跑起来
Jan 27 Python
使用Python的Django框架结合jQuery实现AJAX购物车页面
Apr 11 Python
轻松掌握python设计模式之访问者模式
Nov 18 Python
Python排序搜索基本算法之选择排序实例分析
Dec 09 Python
ubuntu安装sublime3并配置python3环境的方法
Mar 15 Python
Pandas 数据处理,数据清洗详解
Jul 10 Python
实例介绍Python中整型
Feb 11 Python
Python+Pyqt实现简单GUI电子时钟
Feb 22 Python
python库skimage给灰度图像染色的方法示例
Apr 27 Python
Python用dilb提取照片上人脸的示例
Oct 26 Python
python爬取微博评论的实例讲解
Jan 15 Python
深入探讨opencv图像矫正算法实战
May 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
桌面中心(一)创建数据库
2006/10/09 PHP
使用php判断浏览器的类型和语言的函数代码
2013/02/28 PHP
PHP的时间戳与具体时间转化的简单实现
2016/06/13 PHP
PHP中STDCLASS用法实例分析
2016/11/11 PHP
javascript div 弹出可拖动窗口
2009/02/26 Javascript
谈谈JavaScript中的函数与闭包
2013/04/14 Javascript
javascript禁用键盘功能键让右击及其他键无效
2013/10/09 Javascript
javascript封装的sqlite操作类实例
2015/07/17 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
黑帽seo劫持程序,js劫持搜索引擎代码
2015/09/15 Javascript
JS实现网页上随机产生超链接地址的方法
2015/11/09 Javascript
Node.js程序中的本地文件操作用法小结
2016/03/06 Javascript
JavaScript表单验证的两种实现方法
2017/02/11 Javascript
聊聊那些使用前端Javascript实现的机器学习类库
2017/09/18 Javascript
js打开word文档预览操作示例【不是下载】
2019/05/23 Javascript
vue中使用百度脑图kityminder-core二次开发的实现
2019/09/26 Javascript
Vue自定义多选组件使用详解
2020/09/08 Javascript
[40:50]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第四场
2014/05/24 DOTA
python创建和使用字典实例详解
2013/11/01 Python
Python中使用装饰器和元编程实现结构体类实例
2015/01/28 Python
Python机器学习logistic回归代码解析
2018/01/17 Python
Django 使用logging打印日志的实例
2018/04/28 Python
解决PyCharm import torch包失败的问题
2018/10/13 Python
python+opencv实现阈值分割
2018/12/26 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
Python插件机制实现详解
2020/05/04 Python
Django form表单与请求的生命周期步骤详解
2020/06/07 Python
基于opencv实现简单画板功能
2020/08/02 Python
Diptyque英国官方网站:源自法国的知名香氛品牌
2019/08/28 全球购物
纪检干部先进事迹材料
2014/08/23 职场文书
工作证明书
2015/06/15 职场文书
毕业典礼致辞
2015/07/29 职场文书
钓鱼岛事件感想
2015/08/11 职场文书
广播稿:校园广播稿范文
2019/04/17 职场文书
一篇合格的广告文案,其主要目的是什么?
2019/07/12 职场文书
python 中的jieba分词库
2021/11/23 Python