In [1]:
import pandas as pd


/Users/admin/anaconda3/lib/python3.6/importlib/_bootstrap.py:219: RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility. Expected 96, got 88
  return f(*args, **kwds)

载入数据、查阅基本信息

用户的基本信息,逾期情况,接待对象,金额

'注册日期', '来源渠道', '用户级别', '拨打次数', '客户ID', '客户性别', '年龄', '客户设备', '客户所属省', '客户公司地址', '客户授信状态', '评分原因', '标识原因', '总分', '初审审核说明', '审核人', '备注', '授信额度', '当前授信额度', '可用额度', '授信进件时间', '授信完成时间', '认证 1', '认证 2', '认证 3', '认证 4', '认证 5', '认证 6', '认证 7', '借款合计', '责任员工手机号', '责任员工岗位', '与责任员工的关系级次', '确认状态', '确认用户来源', '确认备注', '营业部经理手机号', '城市经理手机号', '银行卡行', '入司时间', '入司时长(月)', '从业时间', '客户授信入口', '风控分', '芝麻分', '下次是否需要做运营商认证', '已使用额度', '冻结额度', '有没有做过运营商', '是否离职', '是否命中预拉黑名单表', '首次借款时间', '最新一次借款时间', '借款次数', '还款计划总条数', '到期应还次数', '正常未还次数', '正常还款中次数', '正常已还次数', '逾期未还次数', '逾期已还次数', '逾期还款中次数', '逾期1天已还次数', '逾期1_3天次数', '逾期4_7天次数', '逾期8_20天次数', '逾期21天以上次数', '最长逾期天数', '到期应还金额', '标签'


In [4]:
user_info = pd.read_excel('2000_sample.xlsx', 'user_info')

In [105]:
user_info.head()


Out[105]:
注册日期 来源渠道 用户级别 拨打次数 客户ID 客户性别 年龄 客户设备 客户所属省 客户公司地址 ... 逾期已还次数 逾期还款中次数 逾期1天已还次数 逾期1_3天次数 逾期4_7天次数 逾期8_20天次数 逾期21天以上次数 最长逾期天数 到期应还金额 标签
0 2017-09-14 12:58:27 分享用户 业务员 0 562 27 android 山西省 太原市小店区南内环街财富大厦 ... 3 0 0 0 0 3 2 77 35000.0 差用户
1 2017-09-14 13:26:40 分享用户 业务员 0 566 33 android 山西省 太原市小店区南内环街财富大厦 ... 6 0 2 1 0 1 3 40 109000.0 差用户
2 2017-09-14 13:58:59 分享用户 业务员 0 572 35 android 山西省 太原市小店区南内环街财富大厦 ... 0 0 0 0 0 0 1 347 15000.0 差用户
3 2017-09-14 18:48:04 分享用户 NaN 0 652 26 android 山西省 太原市内环街 ... 2 0 0 2 0 0 3 316 14500.0 差用户
4 2017-09-15 08:38:45 分享用户 业务员 0 712 30 android 山西省 太原小店学府街平阳路口鸿富大厦 ... 8 0 0 2 1 0 5 255 20000.0 差用户

5 rows × 70 columns


In [10]:
# 独立检验
user_info.客户ID.unique().shape


Out[10]:
(2000,)

In [12]:
# 总的分析
user_info.describe()


Out[12]:
拨打次数 客户ID 年龄 总分 授信额度 当前授信额度 可用额度 借款合计 与责任员工的关系级次 入司时长(月) ... 逾期未还次数 逾期已还次数 逾期还款中次数 逾期1天已还次数 逾期1_3天次数 逾期4_7天次数 逾期8_20天次数 逾期21天以上次数 最长逾期天数 到期应还金额
count 2000.000000 2000.000000 2000.000000 60.000000 2000.000000 2000.000000 2000.000000 2000.000000 1968.000000 1603.000000 ... 2000.000000 2000.000000 2000.0 2000.00000 2000.000000 2000.00000 2000.000000 2000.000000 2000.000000 2000.000000
mean 0.212500 48583.154000 35.508000 3.633333 20062.500000 27600.000000 10171.709085 48009.800000 1.291159 31.544604 ... 1.008500 1.164500 0.0 0.40200 0.225500 0.17000 0.230000 1.095000 43.229500 35948.964255
std 0.585248 26524.962114 7.085198 1.974126 14476.036114 17097.599655 14481.831680 40895.162319 0.564212 31.325698 ... 2.412123 2.859463 0.0 1.35141 0.724508 0.57207 0.747248 2.192345 73.551239 35406.062751
min 0.000000 562.000000 20.000000 0.000000 1000.000000 1000.000000 -36919.880000 500.000000 1.000000 4.000000 ... 0.000000 0.000000 0.0 0.00000 0.000000 0.00000 0.000000 0.000000 0.000000 500.000000
25% 0.000000 20053.250000 30.000000 2.000000 10000.000000 15000.000000 1.640000 20000.000000 1.000000 12.000000 ... 0.000000 0.000000 0.0 0.00000 0.000000 0.00000 0.000000 0.000000 0.000000 14000.000000
50% 0.000000 57128.000000 35.000000 4.000000 15000.000000 24000.000000 5352.385000 36100.000000 1.000000 19.000000 ... 0.000000 0.000000 0.0 0.00000 0.000000 0.00000 0.000000 0.000000 0.000000 24982.020000
75% 0.000000 68315.750000 41.000000 5.000000 23000.000000 35000.000000 15952.290000 63000.000000 1.000000 38.000000 ... 1.000000 1.000000 0.0 0.00000 0.000000 0.00000 0.000000 1.000000 58.250000 42268.220000
max 5.000000 94332.000000 55.000000 9.000000 82000.000000 110000.000000 110000.000000 282500.000000 7.000000 239.000000 ... 32.000000 51.000000 0.0 39.00000 8.000000 5.00000 8.000000 26.000000 347.000000 265305.380000

8 rows × 30 columns

有缺失数值的特征: 总分,与责任员工的关系层次 、入司时长 参考分数

是否实名


In [13]:
SZ = pd.read_excel('2000_sample.xlsx', 'SZ')

In [14]:
SZ.head()


Out[14]:
user_id ctime 在网状态 在网时长 实名
0 10026 2017-11-30 13:05:04 NaN [24+) 一致
1 10064 2017-11-30 14:44:17 NaN [24+) 一致
2 10094 2017-12-01 11:04:19 NaN [24+) 一致
3 1014 2017-09-16 14:06:15 NaN [24+) 查无记录
4 1015 2017-09-16 12:25:19 NaN [6-12) 一致

In [16]:
SZ.user_id.unique().shape


Out[16]:
(2000,)

In [17]:
SZ.shape
# 取同一个用户下的最后一行


Out[17]:
(2132, 5)

运营商、年龄、地域分布,3个月内是否地点发生过变动


In [18]:
SL_1 = pd.read_excel('2000_sample.xlsx', 'SL-1')

In [19]:
SL_1.head(5)


Out[19]:
user_id ctime 年龄 性别 生日 身份证是否有效 城市 地区 手机运营商 手机归属省份 手机归属城市 身份证记录天数 手机号记录天数 身份证最近时间 手机号最后时间 关联身份证数量 关联手机号数量
0 1014 2018-04-24 10:07:25 29 1989-04-11 1 山西省 忻州地区 繁峙县 中国移动 北京市 北京市 221 221 2018-04-17 2018-04-17 1 1
1 1014 2018-04-26 17:22:37 29 1989-04-11 1 山西省 忻州地区 繁峙县 中国移动 北京市 北京市 221 221 2018-04-17 2018-04-17 1 1
2 1014 2018-04-29 16:51:44 29 1989-04-11 1 山西省 忻州地区 繁峙县 中国移动 北京市 北京市 221 221 2018-04-17 2018-04-17 1 1
3 1014 2018-05-08 08:47:09 29 1989-04-11 1 山西省 忻州地区 繁峙县 中国移动 北京市 北京市 235 235 2018-04-24 2018-04-24 1 1
4 1014 2018-05-08 20:31:06 29 1989-04-11 1 山西省 忻州地区 繁峙县 中国移动 北京市 北京市 235 235 2018-04-24 2018-04-24 1 1

葫芦分 直接黑人 间接黑人 认识间接黑人的联系人个数


In [20]:
SL_2 = pd.read_excel('2000_sample.xlsx', 'SL-2')

In [21]:
SL_2.user_id.unique()
#取最后一条


Out[21]:
array([ 1014, 10188, 10301, ...,  9524,  9639,  9640])

In [80]:
SL_2.head()


Out[80]:
user_id 葫芦分 ctime 直接联系人 直接黑人 间接黑人 认识间接黑人的联系人个数 认识间接黑人的联系人比例
0 1014 86.0 2018-04-24 10:07:25 5.0 0.0 3.0 3.0 0.6
1 1014 86.0 2018-04-26 17:22:37 5.0 0.0 3.0 3.0 0.6
2 1014 86.0 2018-04-29 16:51:44 5.0 0.0 3.0 3.0 0.6
3 1014 85.0 2018-05-08 08:47:09 5.0 0.0 3.0 3.0 0.6
4 1014 85.0 2018-05-08 20:31:06 5.0 0.0 3.0 3.0 0.6

线上消费分期出现次数 线下消费分期出现次数 信用卡代还出现次数 小额快速贷出现次数 线上现金贷出现次数 线下现金贷出现次数 其他 趋势


In [22]:
SL_3 = pd.read_excel('2000_sample.xlsx', 'SL-3')

In [23]:
SL_3.user_id.unique().shape


Out[23]:
(1723,)

In [100]:
SL_3.head()


Out[100]:
user_id ctime 线上消费分期出现次数 线下消费分期出现次数 信用卡代还出现次数 小额快速贷出现次数 线上现金贷出现次数 线下现金贷出现次数 其他
0 1014 2018-04-24 10:07:25 0 0 0 0 0 0 4
1 1014 2018-04-26 17:22:37 0 0 0 0 0 0 4
2 1014 2018-04-29 16:51:44 0 0 0 0 0 0 4
3 1014 2018-05-08 08:47:09 0 0 0 0 0 0 4
4 1014 2018-05-08 20:31:06 0 0 0 0 0 0 4

身份证挖掘,是否与运营商匹配 产生新的指标


In [25]:
SL_4 = pd.read_excel('2000_sample.xlsx', 'SL-4')

In [45]:
SL_4.head(5)


Out[45]:
user_id ctime 绑定其他身份证号码 此号码绑定其他姓名个数 查询此身份证的机构数 身份证是否是有效身份证 身份证户籍省份 身份证户籍城市 身份证户籍地区 年龄 性别 最近此身份证出现时间
0 15382 2018-06-21 16:26:35 45212319950708**** 0 1 1 广西壮族自治区 南宁地区 宾阳县 22 2018-06-17
1 15382 2018-07-13 09:51:53 45212319950708**** 0 1 1 广西壮族自治区 南宁地区 宾阳县 23 2018-06-17
2 15382 2018-07-13 10:39:11 45212319950708**** 0 1 1 广西壮族自治区 南宁地区 宾阳县 23 2018-06-17
3 2507 2018-04-12 21:53:25 14103119960626**** 1 1 1 山西省 临汾市 隰县 21 2017-10-19
4 29891 2018-04-15 15:09:12 14262919681019**** 1 1 1 山西省 临汾地区 浮山县 49 2017-09-05

绑定其他手机号码、个数、归属地


In [79]:
SL_5 = pd.read_excel('2000_sample.xlsx', 'SL-5')
SL_5.head(5)


Out[79]:
user_id ctime 绑定其他手机号码 此号码绑定其他姓名个数 查询此手机号的机构数 手机运营商 手机归属地省份 手机归属地城市 最近此手机号出现时间
0 10629 2018-04-18 12:09:42 139****4745 0 1 中国移动 江苏省 苏州市 2015-07-26
1 10629 2018-04-18 12:09:42 137****2780 0 1 中国移动 河南省 平顶山市 2016-11-05
2 10629 2018-04-21 12:34:32 137****2780 0 1 中国移动 河南省 平顶山市 2016-11-05
3 10629 2018-04-21 12:34:32 139****4745 0 1 中国移动 江苏省 苏州市 2015-07-26
4 10629 2018-05-23 10:14:52 137****2780 0 1 中国移动 河南省 平顶山市 2016-11-05

In [ ]:

定位信息


In [30]:
BQS_1 = pd.read_excel('2000_sample.xlsx', 'BQS-1')

In [74]:
BQS_1.head()


Out[74]:
用户ID ctime 平台 tokenKey 经度 纬度 操作系统 设备ID imei号 手机运营商家 国家 城市 等级 省市全称
0 562 2018-05-10 05:58:20 android be741203-96ac-47c9-acc0-20b06c183ec0 112.590701 37.889158 android 716235f9eaa6c9ff1ea3fdaf1d3e1338 86432703****894 OPPO 中国 山西省 太原市 3.0 杏花岭区 山西省太原市杏花岭区
1 562 2018-05-12 22:26:53 android 9516157f-020a-436c-8c6c-6517d063c8ac 112.566075 37.868440 android 716235f9eaa6c9ff1ea3fdaf1d3e1338 86432703****894 OPPO 中国 山西省 太原市 3.0 迎泽区 山西省太原市迎泽区
2 562 2018-05-16 18:13:07 android 6cdb5c99-d46b-445d-a3e2-554687d0448f 112.698474 37.719158 android 716235f9eaa6c9ff1ea3fdaf1d3e1338 86432703****894 OPPO 中国 山西省 晋中市 3.0 榆次区 山西省晋中市榆次区
3 562 2018-06-13 19:11:08 android 26157aad-82fb-4e33-92c4-5455e7fc7d3d 112.619462 37.778118 android 716235f9eaa6c9ff1ea3fdaf1d3e1338 86432703****894 OPPO 中国 山西省 太原市 3.0 小店区 山西省太原市小店区
4 562 2018-06-14 12:07:10 android 111c05c6-08e2-4444-9fbc-f0139b2615b2 112.688389 37.728858 android 716235f9eaa6c9ff1ea3fdaf1d3e1338 86432703****894 OPPO 中国 山西省 晋中市 3.0 榆次区 山西省晋中市榆次区

多头借贷次数 身份证三个月关联手机号个数 手机号六个月星网模型大小 手机号三个月关联身份证个数


In [31]:
BQS_2 = pd.read_excel('2000_sample.xlsx', 'BQS-2')

In [36]:
BQS_2.用户Id.unique().shape


Out[36]:
(44,)

In [87]:
BQS_2.shape


Out[87]:
(47, 6)

In [86]:
BQS_2.head()


Out[86]:
用户Id ctime 多头借贷次数 身份证三个月关联手机号个数 手机号六个月星网模型大小 手机号三个月关联身份证个数
0 34291 2018-05-09 12:30:01 3.0 1.0 NaN 1.0
1 50607 2018-04-21 16:10:00 NaN NaN NaN NaN
2 52982 2018-05-02 16:00:01 NaN 1.0 NaN 1.0
3 53243 2018-04-29 11:10:01 NaN 1.0 NaN 1.0
4 54555 2018-05-05 10:30:01 NaN 1.0 NaN 1.0

行为分析,地理变更


In [37]:
BQS_3 = pd.read_excel('2000_sample.xlsx', 'BQS-3')

In [38]:
BQS_3.用户ID.unique().shape


Out[38]:
(37,)

In [77]:
BQS_3.head(5)


Out[77]:
用户ID ctime 出发地 目的地 出发时间 达到时间 离开时间 停留时间
0 34291 2018-05-09 12:30:01 河南省郑州市 山西省太原市 2018-03-23 2018-03-23 2018-03-25 工作日(1天), 节假日(2天)
1 34291 2018-05-09 12:30:01 河南省新乡市 河南省郑州市 2018-03-25 2018-03-25 2018-04-19 工作日(18天), 节假日(8天)
2 34291 2018-05-09 12:30:01 河南省郑州市 河南省洛阳市 2017-12-22 2017-12-22 2017-12-22 工作日(1天), 节假日(0天)
3 34291 2018-05-09 12:30:01 陕西省西安市 河南省信阳市 2017-12-22 2017-12-23 2017-12-30 工作日(5天), 节假日(3天)
4 34291 2018-05-09 12:30:01 河南省信阳市 河南省周口市 2018-02-20 2018-02-20 2018-02-20 工作日(0天), 节假日(1天)

用户画像标签构建

用户标签:性别、年龄、地域、学历职业

消费标签:消费习惯、购买意向、促销敏感度

行为标签:时间频次分布、时长、访问路径探索用户使用APP习惯

内容分析:浏览内容、停留时长


In [48]:
from IPython.display import Image
from IPython.core.display import HTML 
Image(url= "https://pic3.zhimg.com/80/v2-1919e069b796f92075c128af5eaf7e9a_hd.png")


Out[48]:

人口属性统计,来源SL-1,SL-4


In [175]:
# 取最近的一条信息
tmp_1 = SL_1.groupby(by='user_id').apply(lambda x: x[x.ctime==max(x.ctime)])
tmp_2 = SL_4.groupby(by='user_id').apply(lambda x: x[x.ctime==max(x.ctime)])

In [176]:
user_info.columns


Out[176]:
Index(['注册日期', '来源渠道', '用户级别', '拨打次数', '客户ID', '客户性别', '年龄', '客户设备', '客户所属省',
       '客户公司地址', '客户授信状态', '评分原因', '标识原因', '总分', '初审审核说明', '审核人', '备注', '授信额度',
       '当前授信额度', '可用额度', '授信进件时间', '授信完成时间', '认证 1', '认证 2', '认证 3', '认证 4',
       '认证 5', '认证 6', '认证 7', '借款合计', '责任员工手机号', '责任员工岗位', '与责任员工的关系级次',
       '确认状态', '确认用户来源', '确认备注', '营业部经理手机号', '城市经理手机号', '银行卡行', '入司时间',
       '入司时长(月)', '从业时间', '客户授信入口', '风控分', '芝麻分', '下次是否需要做运营商认证', '已使用额度',
       '冻结额度', '有没有做过运营商', '是否离职', '是否命中预拉黑名单表', '首次借款时间', '最新一次借款时间', '借款次数',
       '还款计划总条数', '到期应还次数', '正常未还次数', '正常还款中次数', '正常已还次数', '逾期未还次数', '逾期已还次数',
       '逾期还款中次数', '逾期1天已还次数', '逾期1_3天次数', '逾期4_7天次数', '逾期8_20天次数', '逾期21天以上次数',
       '最长逾期天数', '到期应还金额', '标签'],
      dtype='object')

In [177]:
tmp = pd.DataFrame(user_info[['客户ID','是否离职','客户公司地址']]).merge(tmp_1,left_on='客户ID',right_on='user_id',how='left')
tmp = tmp.merge(tmp_2,left_on='客户ID',right_on='user_id',how='left')
tmp.head(5)


Out[177]:
客户ID 是否离职 客户公司地址 user_id_x ctime_x 年龄_x 性别_x 生日 身份证是否有效 ... 绑定其他身份证号码 此号码绑定其他姓名个数 查询此身份证的机构数 身份证是否是有效身份证 身份证户籍省份 身份证户籍城市 身份证户籍地区 年龄_y 性别_y 最近此身份证出现时间
0 562 太原市小店区南内环街财富大厦 562.0 2018-07-03 20:06:09 27.0 1991-05-28 1.0 山西省 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 566 太原市小店区南内环街财富大厦 566.0 2018-09-03 18:35:21 33.0 1985-09-08 1.0 山西省 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 572 太原市小店区南内环街财富大厦 NaN NaT NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 652 太原市内环街 NaN NaT NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 712 太原小店学府街平阳路口鸿富大厦 712.0 2018-08-15 17:36:39 30.0 1988-04-30 1.0 山西省 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

5 rows × 33 columns


In [178]:
popu_attributes = tmp[['客户ID','是否离职','客户公司地址','省','城市', '地区', '手机运营商', '手机归属省份', '手机归属城市',
                      '关联身份证数量','身份证户籍城市',
                      '身份证是否是有效身份证', '身份证户籍省份','身份证户籍地区', '生日','年龄_y', '性别_y']]
# 年龄段划分
popu_attributes.head(5)


Out[178]:
客户ID 是否离职 客户公司地址 城市 地区 手机运营商 手机归属省份 手机归属城市 关联身份证数量 身份证户籍城市 身份证是否是有效身份证 身份证户籍省份 身份证户籍地区 生日 年龄_y 性别_y
0 562 太原市小店区南内环街财富大厦 山西省 晋中地区 介休市 中国移动 山西省 晋中市 1.0 NaN NaN NaN NaN 1991-05-28 NaN NaN
1 566 太原市小店区南内环街财富大厦 山西省 吕梁地区 柳林县 中国移动 山西省 太原市 1.0 NaN NaN NaN NaN 1985-09-08 NaN NaN
2 572 太原市小店区南内环街财富大厦 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 652 太原市内环街 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 712 太原小店学府街平阳路口鸿富大厦 山西省 晋中市 榆社县 中国移动 山西省 晋中市 1.0 NaN NaN NaN NaN 1988-04-30 NaN NaN

In [179]:
popu_attributes.shape


Out[179]:
(2000, 17)

用户社会属性 家庭成员--一般从亲情号和通讯录获取,并未提供。 家庭住址、公司数据, 是否是学生、老师(地理链接),职业身份


In [125]:
# user_info.客户公司地址
#social attributes

用户消费特征 包含子类:用户消费类目偏好(缺乏电商数据) 暂时只能分析手机型号 借贷次数 来粗略判断


In [180]:
# 消费情况
tmp_1 = SL_3.groupby(by = 'user_id',group_keys = False).apply(lambda x: x[x.ctime==max(x.ctime)])

In [181]:
tmp_1.head()


Out[181]:
user_id ctime 线上消费分期出现次数 线下消费分期出现次数 信用卡代还出现次数 小额快速贷出现次数 线上现金贷出现次数 线下现金贷出现次数 其他
5782 562 2018-07-03 20:06:09 0 0 0 0 0 0 4
6019 566 2018-09-03 18:35:21 0 0 0 0 0 0 1
13284 712 2018-08-15 17:36:39 0 0 0 2 0 1 7
16 1014 2018-07-03 17:15:27 0 0 0 1 0 0 9
275 1334 2018-08-25 15:25:58 0 0 0 0 0 0 1

In [182]:
# 手机品牌  操作系统
tmp_2 = BQS_1.groupby(by='用户ID',group_keys = False).apply(lambda x: x[x.ctime==max(x.ctime)])

In [183]:
tmp_2.dtypes


Out[183]:
用户ID                 int64
ctime       datetime64[ns]
平台                  object
tokenKey            object
经度                 float64
纬度                 float64
操作系统                object
设备ID                object
imei号               object
手机运营商家              object
国家                  object
省                   object
城市                  object
等级                 float64
县                   object
省市全称                object
dtype: object

In [184]:
tmp = pd.DataFrame(user_info['客户ID']).merge(tmp_1,left_on='客户ID',right_on='user_id',how='left')
#tmp = tmp.merge(tmp_2,left_on='客户ID',right_on='用户ID',how='left')
tmp.head(5)
tmp = tmp.merge(tmp_2,left_on='客户ID',right_on='用户ID',how='left')
tmp.head(5)


Out[184]:
客户ID user_id ctime_x 线上消费分期出现次数 线下消费分期出现次数 信用卡代还出现次数 小额快速贷出现次数 线上现金贷出现次数 线下现金贷出现次数 其他 ... 操作系统 设备ID imei号 手机运营商家 国家 城市 等级 省市全称
0 562 562.0 2018-07-03 20:06:09 0.0 0.0 0.0 0.0 0.0 0.0 4.0 ... android 716235f9eaa6c9ff1ea3fdaf1d3e1338 86432703****894 OPPO 中国 山西省 晋中市 3.0 榆次区 山西省晋中市榆次区
1 566 566.0 2018-09-03 18:35:21 0.0 0.0 0.0 0.0 0.0 0.0 1.0 ... android 5cacab38a09e874088e0ff101b3da8c8 86192503****792 Huawei NaN NaN NaN NaN NaN NaN
2 572 NaN NaT NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 652 NaN NaT NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 712 712.0 2018-08-15 17:36:39 0.0 0.0 0.0 2.0 0.0 1.0 7.0 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

5 rows × 26 columns


In [185]:
tmp.shape


Out[185]:
(2000, 26)

In [186]:
consum_attributes = tmp[['客户ID','线上消费分期出现次数', '线下消费分期出现次数', '信用卡代还出现次数',
                        '小额快速贷出现次数', '线上现金贷出现次数', '线下现金贷出现次数', '其他',
                        '操作系统','手机运营商家']]

用户价值属性 用户信用价值细分 芝麻分、来源渠道


In [156]:
# 芝麻分,客户来源
tmp_1 = user_info[['客户ID','芝麻分','来源渠道']]

value_attributes = tmp_1
value_attributes.shape

用户生命周期 无资产、无消费信息,无法进行聚类或者RFM切分 入司时长(月) 从业时间


In [158]:
lifecycl_attributes = user_info[['客户ID','入司时长(月)','从业时间']]
lifecycl_attributes.head()


Out[158]:
客户ID 入司时长(月) 从业时间
0 562 NaN 6-12个月
1 566 NaN 2年以上
2 572 NaN 2年以上
3 652 NaN 1-2年
4 712 NaN 6-12个月

用户风险控制 子类:黑灰用户识别 、、、是否实名、、、、多头多贷用户识别\授信状况、用户评价、、、、信息重名等


In [260]:
# source 
# 取最近的一条信息
tmp_1 = SL_2.groupby(by='user_id').apply(lambda x: x[x.ctime==max(x.ctime)])
tmp_1.head()


Out[260]:
user_id 葫芦分 ctime 直接联系人 直接黑人 间接黑人 认识间接黑人的联系人个数 认识间接黑人的联系人比例
user_id
562 5782 562 72.0 2018-07-03 20:06:09 14.0 0.0 9.0 7.0 0.50
566 6019 566 78.0 2018-09-03 18:35:21 8.0 0.0 6.0 5.0 0.63
712 13283 712 54.0 2018-08-15 17:36:39 52.0 0.0 220.0 12.0 0.23
1014 16 1014 86.0 2018-07-03 17:15:27 5.0 0.0 6.0 4.0 0.80
1334 275 1334 95.0 2018-08-25 15:25:58 2.0 0.0 2.0 1.0 0.50

In [261]:
tmp_1.user_id.unique().shape


Out[261]:
(1723,)

In [262]:
tmp_1.user_id.shape


Out[262]:
(1723,)

In [263]:
tmp_2 = BQS_2.groupby(by='用户Id').apply(lambda x: x[x.ctime==max(x.ctime)])
tmp_2.head()


Out[263]:
用户Id ctime 多头借贷次数 身份证三个月关联手机号个数 手机号六个月星网模型大小 手机号三个月关联身份证个数
用户Id
34291 0 34291 2018-05-09 12:30:01 3.0 1.0 NaN 1.0
50607 1 50607 2018-04-21 16:10:00 NaN NaN NaN NaN
52982 2 52982 2018-05-02 16:00:01 NaN 1.0 NaN 1.0
53243 3 53243 2018-04-29 11:10:01 NaN 1.0 NaN 1.0
54555 4 54555 2018-05-05 10:30:01 NaN 1.0 NaN 1.0

In [264]:
tmp_2 = tmp_2.drop_duplicates()

In [266]:
tmp_3 = SZ.groupby(by='user_id').apply(lambda x: x[x.ctime==max(x.ctime)])
tmp_3 = tmp_3[['user_id','实名']]
tmp_3.head()


Out[266]:
user_id 实名
user_id
562 884 562 一致
566 906 566 一致
572 935 572 一致
652 1342 652 一致
712 1650 712 一致

In [267]:
# 客户授信和评价
tmp_4 = user_info[['客户ID','客户授信状态','标签']]
tmp_4.head()


Out[267]:
客户ID 客户授信状态 标签
0 562 审核通过(风控初审通过,人工初审通过,人工终审通过) 差用户
1 566 审核通过(风控初审存疑,人工初审通过,人工终审通过) 差用户
2 572 审核通过(风控初审存疑,人工初审通过,人工终审通过) 差用户
3 652 审核通过(风控初审存疑,人工初审通过,人工终审通过) 差用户
4 712 审核通过(风控初审通过,人工初审通过,人工终审通过) 差用户

In [268]:
# # 绑定不同手机个数和机构数 # 重新构造
# tmp_5 = SL_5.groupby(by='user_id').apply(lambda x: x[x.ctime == max(x.ctime)])
# tmp_5 = tmp_5.drop_duplicates()
# tmp_5.head(5)

In [269]:
tmp = pd.DataFrame(user_info.客户ID).merge(tmp_1, left_on='客户ID', right_on = 'user_id', how='left' )
tmp = tmp.merge(tmp_2,left_on='客户ID',right_on = '用户Id', how='left')
tmp = tmp.merge(tmp_3,left_on='客户ID',right_on = 'user_id', how='left')
tmp = tmp.merge(tmp_4,left_on='客户ID',right_on = '客户ID', how='left')
# tmp = tmp.merge(tmp_5,left_on='客户ID',right_on = 'user_id', how='left')

tmp.head()


Out[269]:
客户ID user_id_x 葫芦分 ctime_x 直接联系人 直接黑人 间接黑人 认识间接黑人的联系人个数 认识间接黑人的联系人比例 用户Id ctime_y 多头借贷次数 身份证三个月关联手机号个数 手机号六个月星网模型大小 手机号三个月关联身份证个数 user_id_y 实名 客户授信状态 标签
0 562 562.0 72.0 2018-07-03 20:06:09 14.0 0.0 9.0 7.0 0.50 NaN NaT NaN NaN NaN NaN 562 一致 审核通过(风控初审通过,人工初审通过,人工终审通过) 差用户
1 566 566.0 78.0 2018-09-03 18:35:21 8.0 0.0 6.0 5.0 0.63 NaN NaT NaN NaN NaN NaN 566 一致 审核通过(风控初审存疑,人工初审通过,人工终审通过) 差用户
2 572 NaN NaN NaT NaN NaN NaN NaN NaN NaN NaT NaN NaN NaN NaN 572 一致 审核通过(风控初审存疑,人工初审通过,人工终审通过) 差用户
3 652 NaN NaN NaT NaN NaN NaN NaN NaN NaN NaT NaN NaN NaN NaN 652 一致 审核通过(风控初审存疑,人工初审通过,人工终审通过) 差用户
4 712 712.0 54.0 2018-08-15 17:36:39 52.0 0.0 220.0 12.0 0.23 NaN NaT NaN NaN NaN NaN 712 一致 审核通过(风控初审通过,人工初审通过,人工终审通过) 差用户

In [270]:
tmp.columns


Out[270]:
Index(['客户ID', 'user_id_x', '葫芦分', 'ctime_x', '直接联系人', '直接黑人', '间接黑人',
       '认识间接黑人的联系人个数', '认识间接黑人的联系人比例', '用户Id', 'ctime_y', '多头借贷次数',
       '身份证三个月关联手机号个数', '手机号六个月星网模型大小', '手机号三个月关联身份证个数', 'user_id_y', '实名',
       '客户授信状态', '标签'],
      dtype='object')

In [271]:
tmp.shape


Out[271]:
(2000, 19)

In [272]:
risk_attributes = tmp[['客户ID','葫芦分','直接联系人', '直接黑人', '间接黑人','认识间接黑人的联系人个数', '认识间接黑人的联系人比例',
                      '多头借贷次数','身份证三个月关联手机号个数', '手机号六个月星网模型大小', '手机号三个月关联身份证个数',
                      '实名','客户授信状态', '标签']]
#                        ,
#                       '绑定其他手机号码', '此号码绑定其他姓名个数','查询此手机号的机构数']]

In [274]:
risk_attributes.head()


Out[274]:
客户ID 葫芦分 直接联系人 直接黑人 间接黑人 认识间接黑人的联系人个数 认识间接黑人的联系人比例 多头借贷次数 身份证三个月关联手机号个数 手机号六个月星网模型大小 手机号三个月关联身份证个数 实名 客户授信状态 标签
0 562 72.0 14.0 0.0 9.0 7.0 0.50 NaN NaN NaN NaN 一致 审核通过(风控初审通过,人工初审通过,人工终审通过) 差用户
1 566 78.0 8.0 0.0 6.0 5.0 0.63 NaN NaN NaN NaN 一致 审核通过(风控初审存疑,人工初审通过,人工终审通过) 差用户
2 572 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 一致 审核通过(风控初审存疑,人工初审通过,人工终审通过) 差用户
3 652 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 一致 审核通过(风控初审存疑,人工初审通过,人工终审通过) 差用户
4 712 54.0 52.0 0.0 220.0 12.0 0.23 NaN NaN NaN NaN 一致 审核通过(风控初审通过,人工初审通过,人工终审通过) 差用户

整合成标签用户标签大宽表


In [279]:
#在确认数据唯一的情况下,进行左链接 


tmp_1 = popu_attributes.merge(consum_attributes,left_on = '客户ID', right_on = '客户ID',how = 'left')
tmp_2 = tmp_1.merge( value_attributes ,left_on = '客户ID', right_on = '客户ID',how = 'left')

tmp_3 = tmp_2.merge(lifecycl_attributes,left_on = '客户ID', right_on = '客户ID',how = 'left')


portrait_attributes = tmp_3.merge( risk_attributes, left_on = '客户ID', right_on = '客户ID',how = 'left')

In [297]:
portrait_attributes.columns


Out[297]:
Index(['客户ID', '是否离职', '客户公司地址', '省', '城市', '地区', '手机运营商', '手机归属省份', '手机归属城市',
       '关联身份证数量', '身份证户籍城市', '身份证是否是有效身份证', '身份证户籍省份', '身份证户籍地区', '生日', '年龄_y',
       '性别_y', '线上消费分期出现次数', '线下消费分期出现次数', '信用卡代还出现次数', '小额快速贷出现次数',
       '线上现金贷出现次数', '线下现金贷出现次数', '其他', '操作系统', '手机运营商家', '芝麻分', '来源渠道',
       '入司时长(月)', '从业时间', '葫芦分', '直接联系人', '直接黑人', '间接黑人', '认识间接黑人的联系人个数',
       '认识间接黑人的联系人比例', '多头借贷次数', '身份证三个月关联手机号个数', '手机号六个月星网模型大小',
       '手机号三个月关联身份证个数', '实名', '客户授信状态', '标签'],
      dtype='object')

In [298]:
portrait_attributes = portrait_attributes.rename(columns={'入司时长(月)':'入司时长'})

In [299]:
portrait_attributes.head()


Out[299]:
客户ID 是否离职 客户公司地址 城市 地区 手机运营商 手机归属省份 手机归属城市 关联身份证数量 ... 间接黑人 认识间接黑人的联系人个数 认识间接黑人的联系人比例 多头借贷次数 身份证三个月关联手机号个数 手机号六个月星网模型大小 手机号三个月关联身份证个数 实名 客户授信状态 标签
0 562 太原市小店区南内环街财富大厦 山西省 晋中地区 介休市 中国移动 山西省 晋中市 1.0 ... 9.0 7.0 0.50 NaN NaN NaN NaN 一致 审核通过(风控初审通过,人工初审通过,人工终审通过) 差用户
1 566 太原市小店区南内环街财富大厦 山西省 吕梁地区 柳林县 中国移动 山西省 太原市 1.0 ... 6.0 5.0 0.63 NaN NaN NaN NaN 一致 审核通过(风控初审存疑,人工初审通过,人工终审通过) 差用户
2 572 太原市小店区南内环街财富大厦 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN 一致 审核通过(风控初审存疑,人工初审通过,人工终审通过) 差用户
3 652 太原市内环街 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN 一致 审核通过(风控初审存疑,人工初审通过,人工终审通过) 差用户
4 712 太原小店学府街平阳路口鸿富大厦 山西省 晋中市 榆社县 中国移动 山西省 晋中市 1.0 ... 220.0 12.0 0.23 NaN NaN NaN NaN 一致 审核通过(风控初审通过,人工初审通过,人工终审通过) 差用户

5 rows × 43 columns

输出文档报表


In [311]:
with open('chuangjin_template1.htm', 'r') as f:
    html_string_1 = f.read()
with open('chuangjin_template2.htm', 'r') as f:
    html_string_2 = f.read()
with open('chuangjin_template3.htm', 'r') as f:
    html_string_3 = f.read()

In [312]:
one_info = portrait_attributes.iloc[1]

In [313]:
portrait_attributes.columns


Out[313]:
Index(['客户ID', '是否离职', '客户公司地址', '省', '城市', '地区', '手机运营商', '手机归属省份', '手机归属城市',
       '关联身份证数量', '身份证户籍城市', '身份证是否是有效身份证', '身份证户籍省份', '身份证户籍地区', '生日', '年龄_y',
       '性别_y', '线上消费分期出现次数', '线下消费分期出现次数', '信用卡代还出现次数', '小额快速贷出现次数',
       '线上现金贷出现次数', '线下现金贷出现次数', '其他', '操作系统', '手机运营商家', '芝麻分', '来源渠道', '入司时长',
       '从业时间', '葫芦分', '直接联系人', '直接黑人', '间接黑人', '认识间接黑人的联系人个数', '认识间接黑人的联系人比例',
       '多头借贷次数', '身份证三个月关联手机号个数', '手机号六个月星网模型大小', '手机号三个月关联身份证个数', '实名',
       '客户授信状态', '标签'],
      dtype='object')

In [314]:
html_string_down = html_string_2.format(one_info.客户ID,one_info.身份证是否是有效身份证, '等待处理',   one_info.性别_y,   one_info.年龄_y,
                  one_info.生日,  one_info.是否离职 ,     '工作城市等待处理', one_info.客户公司地址,  one_info.手机归属省份,
                  one_info.手机归属城市, one_info.身份证户籍省份 , one_info.身份证户籍城市 , one_info.线上消费分期出现次数, one_info.线下消费分期出现次数,  
                  one_info.信用卡代还出现次数 , one_info.小额快速贷出现次数, one_info.线上现金贷出现次数, one_info.线下现金贷出现次数,one_info.其他,
                   one_info.操作系统, one_info.手机运营商,one_info.芝麻分, one_info.来源渠道, one_info.入司时长,
                   one_info.从业时间,one_info.葫芦分, one_info.直接联系人, one_info.直接黑人,one_info.间接黑人,
                   one_info.认识间接黑人的联系人个数, one_info.认识间接黑人的联系人比例, one_info.多头借贷次数,one_info.身份证三个月关联手机号个数, one_info.手机号六个月星网模型大小,
                   one_info.手机号三个月关联身份证个数, one_info.实名, one_info.客户授信状态, one_info.标签,'暂未整合',
                   '暂未整合', '暂未整合'
                  )

In [316]:
# 拼接成一个
html_string = html_string_1+html_string_down+html_string_3

In [318]:
def save_to_file(file_name, contents):
    fh = open(file_name, 'w')
    fh.write(contents)
    fh.close()

save_to_file('chuangjin-baogao.htm', html_string)