python数据分析—借款行为数据加工

一.需求描述与分析

1.背景

已知客户的借款数据,加工借款行为相关衍生变量,模拟进行回溯,获得客户更为具体的借款行为数据从而进行更多维度的分析。

2.数据描述

借款数据如下

event_iduuidevent_time授信额度借款申请状态放款金额
112020-01-01 00:10:0010000通过2000
212020-01-03 00:10:0010000通过5000
312020-02-01 00:00:0010000拒绝
412020-04-01 20:20:0010000通过8000
512020-08-01 20:20:0010000通过6000
612020-09-05 00:10:0010000通过5000
722021-05-01 10:00:125000拒绝
822021-05-10 12:00:505000拒绝
922021-06-05 15:00:515000通过2000
1022021-06-10 17:00:515000通过3000
1122021-07-05 12:00:515000通过4000
1232021-07-01 00:00:0020000通过10000
1332021-07-04 00:00:0020000通过2000
1432021-07-10 00:00:0020000通过5000
1532022-10-01 00:00:0020000通过15000
1632022-11-01 00:00:0020000通过5000
1732022-11-05 00:00:0020000通过2000
1832022-12-01 00:00:0020000拒绝

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值