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 相关文章推荐
python3.0 字典key排序
Dec 24 Python
python中Genarator函数用法分析
Apr 08 Python
python pandas 对series和dataframe的重置索引reindex方法
Jun 07 Python
基于python的socket实现单机五子棋到双人对战
Mar 24 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
Jul 31 Python
Django上线部署之IIS的配置方法
Aug 22 Python
手机使用python操作图片文件(pydroid3)过程详解
Sep 25 Python
opencv3/C++图像像素操作详解
Dec 10 Python
Python virtualenv虚拟环境实现过程解析
Apr 18 Python
降低python版本的操作方法
Sep 11 Python
Python3如何使用range函数替代xrange函数
Oct 05 Python
python利用pandas分析学生期末成绩实例代码
Jul 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
PHP中的traits简单使用实例
2015/05/13 PHP
php计算整个目录大小的方法
2015/06/01 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
2017/08/07 PHP
TNC vs RR BO3 第一场 2.14
2021/03/10 DOTA
非常好的js代码
2006/06/27 Javascript
用js判断用户浏览器是否是XP SP2的IE6
2007/03/08 Javascript
Jquery实现仿新浪微博获取文本框能输入的字数代码
2013/02/22 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
NodeJS中利用Promise来封装异步函数
2015/02/25 NodeJs
jQuery实现网页抖动的菜单抖动效果
2015/08/07 Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
2015/10/17 Javascript
Node.js的Mongodb使用实例
2016/12/30 Javascript
vue实现弹框遮罩点击其他区域弹框关闭及v-if与v-show的区别介绍
2018/09/29 Javascript
Echart折线图手柄触发事件示例详解
2018/12/16 Javascript
JS实现点击按钮随机生成可拖动的不同颜色块示例
2019/01/30 Javascript
layui--select使用以及下拉框实现键盘选择的例子
2019/09/24 Javascript
vue中注册自定义的全局js方法
2019/11/15 Javascript
使用js和canvas实现时钟效果
2020/09/08 Javascript
[51:17]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python使用metaclass实现Singleton模式的方法
2015/05/05 Python
python Opencv将图片转为字符画
2021/02/19 Python
Python中垃圾回收和del语句详解
2018/11/15 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
2021/01/21 Python
英国人最爱的饰品网站:Accessorize
2016/08/22 全球购物
美国成衣女装品牌:CHICO’S
2016/09/19 全球购物
Under Armour澳大利亚官网:美国知名的高端功能性运动品牌
2018/02/22 全球购物
英国在线自行车店:Merlin Cycles
2018/08/20 全球购物
极简鞋类,赤脚的感觉:Lems Shoes
2019/08/06 全球购物
美发活动策划书
2014/01/14 职场文书
人事行政专员岗位职责
2014/07/23 职场文书
上课睡觉检讨书300字
2014/11/18 职场文书
2014年财政工作总结
2014/12/10 职场文书
2015年计划生育责任书
2015/05/08 职场文书
父亲去世追悼词
2015/06/23 职场文书
2016新教师培训心得体会范文
2016/01/08 职场文书
Windows Server 2016 配置 IIS 的详细步骤
2022/04/28 Servers