文章目录
案例介绍
风控建模常用到征信指标,本笔记在已落入数据库的结构化数据(标签)的基础上,使用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种:
- 直接提取:适用于个人唯一标签;
- 聚合加工:适用于个人非唯一标签;
- 筛选聚合:适用于账户标签(包括账户唯一标签和账户非唯一标签)。