python风控工具_python-风控模型分析01

数据导入与查看

# -*- coding: utf-8 -*-

# %%time

# from pyhive import presto

import pandas as pd

import numpy as np

import warnings

import os

data=pd.read_csv('*/全域风险.csv')

data.head(2)

# label= pd.DataFrame(list(result),columns=columns_names)

# label.to_csv('/data/ljk/baixin.csv',index=False)

数据筛选

data2=data[data['fina_date']

feature=['num_id','zhiye','weiyue','gongzhai','qingchang','zhuxing','lvyue','shouxin','xiaofei','xingqu','chengzhang']

data2=data2[feature]

data2.head()

scorecardpy Python包的使用

import scorecardpy as sc

import matplotlib.pyplot as plt

%matplotlib inline

plt.show()

bins_new=sc.woebin(data_new.loc[data_new.overdue!=-1,['zhiye','overdue']], y="overdue")

woebin_plot=sc.woebin_plot(bins_new)

woebin_plot

结果编辑

# data_new = data_new.drop(['flag','var_name'],axis=1)

merge_result_total = pd.DataFrame()

for cl in data_new.columns[1:]:

x=data_new[data_new[cl]>=0][cl]

if len(set(x))>=10:

value_bins=pd.qcut(x,5,duplicates='drop',retbins=True)[0]

data_new['flag']=value_bins #拦截点打标

data_new['var_name']= cl #变量

tmp = data_new[['var_name','flag','overdue']]

tmp.rename(columns={'overdue':'label'},inplace=True)

result_stp=tmp.groupby(['var_name','flag']).count() #拦截数

result_pos=tmp.groupby(['var_name','flag'])['label'].sum().to_frame() #黑样本

result_neg=tmp[tmp['label']==0].groupby(['var_name','flag'])['label'].count().to_frame() #白样本

merge_result=result_stp.merge(result_pos,how='left',on=['var_name','flag']).merge(result_neg,how='left',on=['var_name','flag'])

merge_result.reset_index(inplace=True)

merge_result.rename(columns={'label_x':'stp','label_y':'pos','label':'neg'},inplace=True)

merge_result['rank']=pd.Series([i+1 for i in range(merge_result.shape[0])])

merge_result.sort_values(by=['rank'],axis=0,ascending=True,inplace=True,na_position='last')

merge_result['cunsum_pos']=merge_result.groupby('var_name')['pos'].cumsum()

merge_result['cunsum_neg']=merge_result.groupby('var_name')['neg'].cumsum()

merge_result['cunsum_stp']=merge_result.groupby('var_name')['stp'].cumsum()

merge_result['total_pos']=merge_result[merge_result['rank']== merge_result.shape[0]]['cunsum_pos'].values[0]

merge_result['total_neg']=merge_result[merge_result['rank']== merge_result.shape[0]]['cunsum_neg'].values[0]

merge_result['total_stp']=merge_result[merge_result['rank']== merge_result.shape[0]]['cunsum_stp'].values[0]

res = merge_result

res['intercept']=res['stp']/res['total_stp'] # 区间拦截率

res['precision']=res['pos']/res['stp'] # 准确率

res['recall']=res['pos']/res['total_pos'] #召回率

res['Disturb']=res['neg']/res['total_neg'] #打扰率

res['cum_precision']=res['cunsum_pos']/res['cunsum_stp'] # 累计准确率

res['avg_precision']=res['total_pos']/res['total_stp']

res['cum_recall']=res['cunsum_pos']/res['total_pos'] # 累计召回率

res['cum_Disturb']=res['cunsum_neg']/res['total_neg'] # 累计打扰率

res['ks']=res['cum_recall']-res['cum_Disturb']

res['ks_max']=res.groupby('var_name')['ks'].max().values[0]

rs=res.drop_duplicates(subset=None, keep='first', inplace=False) #去重

merge_result_total = merge_result_total.append(rs)

merge_result_total.rename(columns={'var_name':'变量','flag':'拦截区间','stp':'拦截样本数','pos':'黑样本数','neg':'白样本数','cunsum_pos':'累计黑样本数','cunsum_neg':'累计白样本数','cunsum_stp':'累计拦截数','intercept':'拦截率','precision':'准确率','recall':'召回率','Disturb':'打扰率','cum_precision':'累计准确率','avg_precision':'平均准确率','cum_recall':'累计召回率','cum_Disturb':'累计打扰率','ks':'ks区间值','ks_max':'ks值','total_pos':'总黑样本','total_neg':'总白样本','total_stp':'总样本'},inplace=True)

merge_result_total.to_csv('*/quanyumob3_result0421.csv',header=True,index=False)

merge_result_total

ks曲线函数

调用方法

ks=PlotKS(data_new3['zhiye'],data_new3['overdue'],n=20,asc=True)

ks

plt.show

import pandas as pd

import matplotlib.pyplot as plt

####################### PlotKS ##########################

def PlotKS(preds, labels, n=20, asc=True):

# preds is score: asc=1

# preds is prob: asc=0

pred = preds # 预测值

bad = labels # 取1为bad, 0为good

ksds = pd.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 = pd.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 = pd.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543040.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

查看某个文件是否正在被修改

1、首先执行命令,写到1.log文件下面: find -name *.rdb|xargs stat| grep -i Modify | awk -F. {print $1} | awk {print $2$3}| awk -F- {print $1$2$3} | awk -F: {print $1$2$3} > 1.log 2、再等待1分钟,执行命令,写到2.log…

c语言位运算+乘法,关于c语言中的位运算。。。

标签&#xff1a;c位运算是一种针对二进制数的一种运算位运算 共有六种都有其对应得操作符号& (and) 位于| (or) 位或~ (not) 取反^ (xor) 异或>> (shr) 右移一位<< (shl) 左移一位运算说明&a…

python模型保存save_浅谈keras保存模型中的save()和save_weights()区别

今天做了一个关于keras保存模型的实验&#xff0c;希望有助于大家了解keras保存模型的区别。我们知道keras的模型一般保存为后缀名为h5的文件&#xff0c;比如final_model.h5。同样是h5文件用save()和save_weight()保存效果是不一样的。我们用宇宙最通用的数据集MNIST来做这个实…

技术淘宝

? ? ? ? 精度前端学习 —— 前端开发100天&#xff08;置顶&#xff09; http://alloyteam.github.io/CodeGuide/https://github.com/AlloyTeam/CodeGuide cmd控制台的小技巧&#xff1a;可以直接将文件夹/文件丢进去&#xff0c;这样就会打印出该路径了。 舒服的字体家族…

vue 导出_Vue核心知识:8.3 vuex在vue-cli中的应用,文件之间的导出与引入

问题&#xff1a;vuex在vue-cli中的应用第一步&#xff1a;npm下载vuex资源包&#xff1a;npm install vuex --save第二步&#xff1a;在 src/main.js 中引入import Vue from vue import Vuex from vuexVue.use(Vuex)import store from ./vuex/store第三步&#xff1a;在 src 下…

android界面设计字体大小,Andoird用户界面设计上手指南:设置字体大小

教程详解技术应用: AndroidOS / Android SDK难易程度: 简单预计完成时间: 15分钟【51CTO译文】在本文中&#xff0c;我们将介绍一些简单的处理方式&#xff0c;帮助开发人员轻松编写出能够应对各类设备型号的应用程序文本方案&#xff0c;同时为用户提供自定义文字尺寸功能。别…

回溯算法解决八皇后_4皇后问题和使用回溯算法的解决方案

回溯算法解决八皇后4-皇后问题 (4 - Queens problem) In 4- queens problem, we have 4 queens to be placed on a 4*4 chessboard, satisfying the constraint that no two queens should be in the same row, same column, or in same diagonal. 在4个皇后问题中 &#xff0c…

MAVEN 私有仓库库迁移

一、下载 Nexus:cd /usr/local/srcwget http://download.sonatype.com/nexus/oss/nexus-xxxx-bundle.tar.gz二、安装配置授权 cd /var/app/sudo cp nexus-xxxx-bundle.tar.gz /var/app/cd /var/app/sudo tar xvzf nexus-xxxx-bundle.tar.gzln -s nexus-xxxx nexuscp nexus/bin/…

写python笔记本推荐_写个python程序帮你清理垃圾

起步知识概要【临时文件(*.tmp)】【临时文件(*._mp)】【日志文件(*.log)】【临时帮助文件(*.gid)】【磁盘检查文件(*.chk)】【临时备份文件(*.old)】【Excel备份文件(*.xlk)】【临时备份文件(*.bak)】【COOKIE】 cookies\*.*【文件使用记录】 recent\*.*【IE临时文件】 Tempora…

0623TP框架联系

先用框架查询 namespace Home\Controller;use Home\Controller\FuLeiController; class WccController extends FuLeiController {//查看项目的方法function xiangmu(){$xiangmuD("xiangmu");$zhi$xiangmu->select();$this->assign("zhi",$zhi);$thi…

怎么重置blockinput的锁_OPPOA9锁屏密码忘了怎么办? OPPO忘记锁屏密码的解决办法...

看点&#xff1a;iPhone X原装屏与国产屏有哪些区别&#xff1f;看点&#xff1a;换7P、8P屏幕&#xff1a;C11和DTP和DKH的区别狮淘&#xff1a;不锈钢拆机片5个只需9.9元&#xff01;包邮&#xff01;每天10名OPPOA9锁屏密码忘了怎么办&#xff1f;OPPO A9手机忘记了锁屏密码…

Android的面孔_Actiyity

一、什么是Activity&#xff1f; 简单的说&#xff1a;Activity就是布满整个窗口或者悬浮于其他窗口上的交互界面。在一个应用程序中通常由多个Activity构成&#xff0c;都会在Manifest.xml中指定一个主的Activity&#xff0c;如下设置 <actionandroid:name"android.in…

vsco怎么两个滤镜叠加_10 款超美的 VSCO 调色滤镜,怎么用都好看!

VSCO 里的滤镜简单 又 好看可太让人喜欢了&#xff01;但是 VSCO 的滤镜实在太多太多了有点让人眼花缭乱~今天旅拍菌请来了 摄影博主 丹丹儿啊专门来为大家盘点一波超美的 VSCO 滤镜合集&#xff01;怎么用 都很好看~微博&#xff1a;丹丹儿啊01滤镜&#xff1a;1ND1锐化&#…

linuxSAMBA共享

转自http://blog.chinaunix.net/uid-20537084-id-2977850.html经常要在Windows与Linux之间共享文件&#xff0c;Samba是一个很常见的选择&#xff1a;Linux运行Samba服务&#xff0c;Windows访问Linux上共享的文件。在不需要用户访问控制的场景下&#xff0c;Samba服务的安全级…

python状态码409_HTTP状态码

HTTP各种相应的状态码HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。它由 RFC 2616 规范定义的&#xff0c;并得到RFC 2518、RFC 2817、RFC 2295、RFC 2774、RFC 4918等规范扩展。中文名HTTP状态码外文名HTTP Status Code规范定义RFC 2616消息端…

Kubernetes Master High Availability 高级实践

才云科技云开源高级工程师唐继元受邀DBAplus社群&#xff0c;在线分享《Kubernetes Master High Availability 高级实践》&#xff0c;介绍如何构建Kubernetes Master High Availability环境。 以下是分享实录&#xff1a; 大家好&#xff0c;我是才云科技的唐继元&#xff0c;…

pythonmysqldb_python中MySQLdb的使用

基本的使用如上&#xff0c;还是很简单的&#xff0c;进一步使用还没操作&#xff0c;先从网上找点资料放上来&#xff0c;以备后续查看1.引入MySQLdb库import MySQLdb2.和数据库建立连接connMySQLdb.connect(host"localhost",user"root",passwd"sa&q…

分布式系统的唯一ID

2019独角兽企业重金招聘Python工程师标准>>> 需求 为什么需要唯一ID 让分布式系统中的需要辨别的元素&#xff0c;都能有唯一的辨识标志。 几乎所有的业务系统&#xff0c;都有生成一个记录标识的需求&#xff0c;例如&#xff1a; 消息标识&#xff1a;message-id订…

python程序跨平台桌面_Python中的跨平台桌面通知程序

在2010年的Pycon大会上有一个presentation on cross-platform Python development。还有一个关于它的html页面&#xff0c;其中包含一些跨平台通知的建议。但是&#xff0c;我在网上找不到它了&#xff0c;但我保存了一个本地副本&#xff0c;这是关于通知的部分&#xff1a;Th…

python去掉html标签_python 去除html标签的几种方法

#! /usr/bin/python# -*- coding:utf-8 -*-created on 2013-12-18author: javaimport refrom htmlparser import htmlparserclass filtertag():def __init__(self):passdef filterhtmltag(self,htmlstr):过滤html中的标签:param htmlstr:html字符串 或是网页源码self.htmlstr …