0
点赞
收藏
分享

微信扫一扫

【案例1】征信指标加工

晚熟的猫 2022-03-11 阅读 34
mysql

文章目录

案例介绍

风控建模常用到征信指标,本笔记在已落入数据库的结构化数据(标签)的基础上,使用MYSQL实现个人征信指标加工。

目标

每份征信报告生成一行指标。

需求分析

一份征信报告,有的标签出现一次,有的出现多次,后者通过聚合才能降维成一行指标;有的标签是人的属性,有的标签是账户的属性。账户可以有多个,所以也需要做聚合,另外账户有很多分类,所以聚合前往往要先筛选。
可见,可以从“直属对象”和“是否唯一”两个维度将标签分为以下四类:

标签分类标签唯一标签不唯一
人的属性个人唯一标签(直接提取)个人非唯一标签(聚合)
账户的属性账户唯一标签(先筛选后聚合)账户非唯一标签(先多条件筛选后聚合)
  • 个人唯一标签,如性别、学历等,与征信报告的数量关系是1:1;
  • 个人非唯一标签,如手机号变更日期等,与征信报告的数量关系是n:1;
  • 账户唯一标签,如授信金额、余额、开立日期等,与账户的数量关系是1:1,账户与征信报告的数量关系是n:1;
  • 账户非唯一标签,如近60个月的还款状态和逾期金额,与账户的数量关系是n:1。

实现过程

加工上述四类标签,并拼接为一张表格,创建视图以备复用。

需求1、加工个人唯一标签

性别、学历

对于一个人来说,性别、学历是唯一的,直接提取相应字段即可。

select 
	rpt_no , 		-- 征信报告编号
	pb01ad01,		-- 性别
	pb01ad02		-- 学历
from ind_str_iden_info

需求2、个人非唯一标签相关指标加工

最近一次手机号变更日期
最近一次手机号变更日期距报告日期天数
最近一次手机号变更日期距报告日期月份数

对于一个人来说,手机号、手机号变更日期可能有多个,所以上述指标需要以人(征信报告编号)为对象做聚合操作;另外,相距天数、月份数相关指标需要先求日期差再做聚合。

select 
	rpt_no,
	max(pb01br01),									-- 最近一次手机号变更日期
	min(timestampdiff(day,pb01br01,pa01ar01)),		-- 最近一次手机号变更日期距报告日期天数
	min(timestampdiff(month,pb01br01,pa01ar01))		-- 最近一次手机号变更日期距报告日期月份数
from ind_str_phonenum_info left join ind_str_rpthead_inf using(rpt_no) -- 关联报告日期所在表格
group by rpt_no

需求3、加工账户唯一标签

贷记卡账户授信金额合计
贷记卡账户余额合计
贷记卡账户最早开卡日期
贷记卡账户最早开卡日期距报告日期天数
贷记卡账户最早开卡日期距报告日期月份数

对于一个人来说,账户可能有多个,所以上述指标也需要做聚合;另外,贷记卡仅是账户类型中的一种,所以聚合前首先要按照“账户类型为贷记卡”这一条件进行筛选。

select 
	t1.rpt_no ,
	sum(case when pd01ad01='r2' then pd01aj02 else 0 end) as pd01aj02_r2_sum,									-- 贷记卡账户授信金额合计
	sum(case when pd01ad01='r2' then pd01bj01 else 0 end) as pd01bj01_r2_sum,									-- 贷记卡账户余额合计
	min(case when pd01ad01='r2' then pd01ar01 else null end) as pd01ar01_r2_min,								-- 贷记卡账户最早开户日期
	max(case when pd01ad01='r2' then timestampdiff(day,pd01ar01,pa01ar01) else null end) as pd01ar01_diffd_max,	-- 最早开立日期距报告日期天数
	max(case when pd01ad01='r2' then timestampdiff(month,pd01ar01,pa01ar01) else null end) as pd01ar01_diffm_max-- 最早开立日期距报告日期月份数
from ind_str_creacco_bas_info t1
left join ind_str_creacco_latperf_info iscli using(pk_id) 	
left join ind_str_rpthead_inf t2 on(t1.rpt_no = t2.rpt_no)
group by rpt_no

需求4、加工账户非唯一标签

贷记卡账户近5年逾期次数
贷记卡账户近5年最大逾期金额

对于一个账户来说,近5年的还款表现可能有多个,所以也需要做聚合;另外,逾期仅是账户还款状态中的一种,所以需求4需要在需求3的基础上,在聚合前首先按照“还款状态为逾期”这一条件进行筛选。
从加工方式来讲,需求4与需求3是相同的。

select 
	t1.rpt_no ,
	sum(case when pd01ad01='r2' and pd01ed01 in ('1','2','3','4','5','6','7','B') then 1 else 0 end) as pd01ed01_r2_ovd_count,
	max(case when pd01ad01='r2' and pd01ed01 in ('1','2','3','4','5','6','7','B') then pd01ej01 else 0 end) as pd01ej01_r2_ovd_max
from ind_str_history_pref_info t1 left join ind_str_creacco_bas_info t2 on(t1.rel_id=t2.pk_id)
group by rpt_no

需求5、拼接上述结果

将上述结果拼接为一张表,并创建视图以备复用。

create or replace view credit_v1 as 
select ta.*,
tb.pb01br01_max,
tb.pb01br01_diffd_min,
tb.pb01br01_diffm_min,
tc.pd01aj02_r2_sum,
tc.pd01bj01_r2_sum,
tc.pd01ar01_r2_min,
tc.pd01ar01_r2_diffd_max,
tc.pd01ar01_r2_diffm_max,
td.pd01ed01_r2_ovd_count,
td.pd01ej01_r2_ovd_max
from 
(select 
	rpt_no , 		-- 征信报告编号
	pb01ad01,		-- 性别
	pb01ad02		-- 学历
from ind_str_iden_info ) ta

left join 
(select 
	rpt_no,
	max(pb01br01) as pb01br01_max,									-- 最近一次手机号变更日期
	min(timestampdiff(day,pb01br01,pa01ar01)) as pb01br01_diffd_min,		-- 最近一次手机号变更日期距报告日期天数
	min(timestampdiff(month,pb01br01,pa01ar01))	as pb01br01_diffm_min	-- 最近一次手机号变更日期距报告日期月份数
from ind_str_phonenum_info left join ind_str_rpthead_inf using(rpt_no)
group by rpt_no) tb
on ta.rpt_no =tb.rpt_no 

left join 
(select 
	t1.rpt_no,
	sum(case when pd01ad01='r2' then pd01aj02 else 0 end) as pd01aj02_r2_sum,									-- 贷记卡账户授信金额合计
	sum(case when pd01ad01='r2' then pd01bj01 else 0 end) as pd01bj01_r2_sum,									-- 贷记卡账户余额合计
	min(case when pd01ad01='r2' then pd01ar01 else null end) as pd01ar01_r2_min,								-- 贷记卡账户最早开户日期
	max(case when pd01ad01='r2' then timestampdiff(day,pd01ar01,pa01ar01) else null end) as pd01ar01_r2_diffd_max,	-- 最早开立日期距报告日期天数
	max(case when pd01ad01='r2' then timestampdiff(month,pd01ar01,pa01ar01) else null end) as pd01ar01_r2_diffm_max-- 最早开立日期距报告日期月份数
from ind_str_creacco_bas_info t1
left join ind_str_creacco_latperf_info using(pk_id) 	
left join ind_str_rpthead_inf t2 on(t1.rpt_no = t2.rpt_no)
group by t1.rpt_no) tc
on ta.rpt_no =tc.rpt_no 

left join 
(select 
	t1.rpt_no,
	sum(case when pd01ad01='r2' and pd01ed01 in ('1','2','3','4','5','6','7','B') then 1 else 0 end) as pd01ed01_r2_ovd_count,
	max(case when pd01ad01='r2' and pd01ed01 in ('1','2','3','4','5','6','7','B') then pd01ej01 else 0 end) as pd01ej01_r2_ovd_max
from ind_str_history_pref_info t1 left join ind_str_creacco_bas_info t2 on(t1.rel_id=t2.pk_id)
group by t1.rpt_no ) td
on ta.rpt_no =td.rpt_no 

检验结果:

mysql> use creditrpt
Database changed
mysql> select * from credit_v1;
+------------------------+----------+----------+--------------+--------------------+--------------------+-----------------+-----------------+-----------------+-----------------------+-----------------------+-----------------------+---------------------+
| rpt_no                 | pb01ad01 | pb01ad02 | pb01br01_max | pb01br01_diffd_min | pb01br01_diffm_min | pd01aj02_r2_sum | pd01bj01_r2_sum | pd01ar01_r2_min | pd01ar01_r2_diffd_max | pd01ar01_r2_diffm_max | pd01ed01_r2_ovd_count | pd01ej01_r2_ovd_max |
+------------------------+----------+----------+--------------+--------------------+--------------------+-----------------+-----------------+-----------------+-----------------------+-----------------------+-----------------------+---------------------+
| 2020010710302917999835 |        1 |       20 | 2017-01-18   |               1084 |                 35 |         1820006 |           13310 | 2007-01-10      |                  4745 |                   155 |                 10550 |               21000 |
| 2020010710302917990836 |        1 |       20 | 2017-01-18   |               1084 |                 35 |         1820006 |           13310 | 2007-01-10      |                  4745 |                   155 |                 10550 |               21000 |
| 2020012108563112340001 |        1 |     9999 | 2021-01-09   |               -353 |                -11 |            NULL |            NULL | NULL            |                  NULL |                  NULL |                  NULL |                NULL |
| 2021012108564043467326 |        1 |       20 | 2021-01-09   |                 12 |                  0 |            NULL |            NULL | NULL            |                  NULL |                  NULL |                     0 |                   0 |
| 2021012109563111066918 |        1 |     9999 | 2021-01-09   |                 12 |                  0 |            NULL |            NULL | NULL            |                  NULL |                  NULL |                  NULL |                NULL |
+------------------------+----------+----------+--------------+--------------------+--------------------+-----------------+-----------------+-----------------+-----------------------+-----------------------+-----------------------+---------------------+
5 rows in set (18.43 sec)

总结

个人征信标签可分为4类:

  • 个人唯一标签;
  • 个人非唯一标签;
  • 账户唯一标签;
  • 账户非唯一标签。

个人征信指标加工方式可分为3种:

  • 直接提取:适用于个人唯一标签;
  • 聚合加工:适用于个人非唯一标签;
  • 筛选聚合:适用于账户标签(包括账户唯一标签和账户非唯一标签)。
举报

相关推荐

0 条评论