一.需求描述与分析
1.背景
已知客户的借款数据,加工借款行为相关衍生变量,模拟进行回溯,获得客户更为具体的借款行为数据从而进行更多维度的分析。
2.数据描述
借款数据如下
event_id | uuid | event_time | 授信额度 | 借款申请状态 | 放款金额 |
---|---|---|---|---|---|
1 | 1 | 2020-01-01 00:10:00 | 10000 | 通过 | 2000 |
2 | 1 | 2020-01-03 00:10:00 | 10000 | 通过 | 5000 |
3 | 1 | 2020-02-01 00:00:00 | 10000 | 拒绝 | |
4 | 1 | 2020-04-01 20:20:00 | 10000 | 通过 | 8000 |
5 | 1 | 2020-08-01 20:20:00 | 10000 | 通过 | 6000 |
6 | 1 | 2020-09-05 00:10:00 | 10000 | 通过 | 5000 |
7 | 2 | 2021-05-01 10:00:12 | 5000 | 拒绝 | |
8 | 2 | 2021-05-10 12:00:50 | 5000 | 拒绝 | |
9 | 2 | 2021-06-05 15:00:51 | 5000 | 通过 | 2000 |
10 | 2 | 2021-06-10 17:00:51 | 5000 | 通过 | 3000 |
11 | 2 | 2021-07-05 12:00:51 | 5000 | 通过 | 4000 |
12 | 3 | 2021-07-01 00:00:00 | 20000 | 通过 | 10000 |
13 | 3 | 2021-07-04 00:00:00 | 20000 | 通过 | 2000 |
14 | 3 | 2021-07-10 00:00:00 | 20000 | 通过 | 5000 |
15 | 3 | 2022-10-01 00:00:00 | 20000 | 通过 | 15000 |
16 | 3 | 2022-11-01 00:00:00 | 20000 | 通过 | 5000 |
17 | 3 | 2022-11-05 00:00:00 | 20000 | 通过 | 2000 |
18 | 3 | 2022-12-01 00:00:00 | 20000 | 拒绝 |
3.加工变量
根据借款信息,加工变量为近7/14/30/60/90/180的申请订单数、被拒订单数、被拒率、累计放款订单数、累计放款金额、额度使用率。
二.代码编写
1. 导入包/定义路径
导入依赖包
import pandas as pd
import numpy as np
import os
import warnings
warnings.filterwarnings("ignore")
# 打开line magic
%config ZMQInteractiveShell.ast_node_interactivity='all'
%pprint
定义文件夹路径
os.chdir("C:/data_analyse")
2. 数据读取/处理
读取借款数据
data_loan = pd.read_excel("loan.xlsx")
data_loan.info()
借款数据处理
data_analyse = data_loan
data_analyse["借款是否拒绝"] = 0
data_analyse.loc[data_analyse["借款申请状态"]=="拒绝","借款是否拒绝"] = 1
data_analyse['借款申请时间_dt'] = pd.to_datetime(data_analyse['event_time'])
data_analyse = data_analyse.sort_values(by='event_time')
data_analyse.set_index('借款申请时间_dt', inplace=True)
由于要用rolling函数进行统计,所以需要将借款申请时间设为索引
3.函数编写
def loan_apply(data_analyse,N):
# 计算近N天的申请次数、成功通过次数和放款金额
apply_orders_Ndays = data_analyse.groupby('uuid',as_index=False)['event_id'].transform(lambda x: x.rolling(f'{N}D').count()-1)
data_analyse['近N天申请订单数'] = apply_orders_Ndays
refuse_orders_Ndays = data_analyse.groupby('uuid',as_index=False)['借款是否拒绝'].transform(lambda x: x.rolling(f'{N}D').sum())
data_analyse['近N天被拒订单数'] = refuse_orders_Ndays
data_analyse.loc[data_analyse["借款申请状态"]=="拒绝",'近N天被拒订单数'] = data_analyse.loc[data_analyse["借款申请状态"]=="拒绝",'近N天被拒订单数'].apply(lambda x: x-1 if x>0 else 0)
data_analyse['近N天被拒率'] = data_analyse['近N天被拒订单数']/data_analyse['近N天申请订单数']
fk_orders_Ndays = data_analyse.groupby('uuid',as_index=False)['放款金额'].transform(lambda x: x.rolling(f'{N}D').count())
data_analyse['近N天累计放款订单数'] = fk_orders_Ndays
data_analyse.loc[data_analyse["放款金额"]>0,'近N天累计放款订单数'] = data_analyse.loc[data_analyse["放款金额"]>0,'近N天累计放款订单数'].apply(lambda x: x-1)
fk_je_Ndays = data_analyse.groupby('uuid',as_index=False)['放款金额'].transform(lambda x: x.rolling(f'{N}D').sum())
data_analyse['近N天累计放款金额'] = fk_je_Ndays
data_analyse.loc[data_analyse["放款金额"]>0,'近N天累计放款金额'] = data_analyse.loc[data_analyse["放款金额"]>0,['近N天累计放款金额','放款金额']].apply(lambda x: x['近N天累计放款金额']-x['放款金额'],axis=1)
# 填充NaN值为0
data_analyse['近N天累计放款金额'] = data_analyse['近N天累计放款金额'].fillna(0)
data_analyse['近N天额度使用率'] = data_analyse['近N天累计放款金额']/data_analyse['授信额度']
return data_analyse
4.求衍生变量
for N in [7,14,30,60,90,180]:
data_analyse = loan_apply(data_analyse,N)
source_table_headers=[column for column in data_analyse]
change_table_headers=[]
for table_header in source_table_headers:
change_table_headers.append(table_header.replace('近N天','近'+str(N)+'天'))
data_analyse.columns=change_table_headers
data_analyse.info()
5.文件存储
data_analyse.to_excel("analyse.xlsx",index=False)