ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

风控项目01---风控业务统计处理

2020-12-13 22:57:25  阅读:291  来源: 互联网

标签:01 账单 逾期 金额 df3 风控 --- 90 df2


目录

一:查看数据的基本信息:

1:加载数据:

import pandas as pd 
import datetime 
from pyecharts.charts import * 
from pyecharts import options as opts
# 加载xls文件
df1 = pd.read_excel('data/业务数据.xls') 
#要使用原始数据构建新指标,所以保留原始数据,copy新的数据,在新的数据中创建新指标 
df2 = df1.copy()
df2.head()

在这里插入图片描述
2:查看数据的基本信息:

df2.info()

在这里插入图片描述
3:查看数字类型的统计信息:

df2.describe()

在这里插入图片描述

二:原有数据的预处理:

1:获取最大的时间,作为我们的当前时间:
原因是我们现在分析数据的时间,肯定不是得到数据的时间,因此我们先要获取获取一个最大的时间,当做当前时间。因此此时取最大值可能里面存储有空值,与空值比较大小会出错,所以要先将空值用0来填充。

today_time = pd.to_datetime(df2.实际到账日.fillna('0').max())
today_time

在这里插入图片描述

2: 对于具有缺失值的列进行填充:

df2['实收金额'] = df2.实收金额.fillna(0) # 实收金额为空,就是没收到,设置0。
df2['开票金额'] = df2.开票金额.fillna(0)  # 没开票,设置为0
df2['未收金额'] = df2.未收金额.fillna(0) # 对方不欠钱了,设置为0

3:对于日期格式的数据,我们将object转换成日期格式:
注意:实际到账日期为空,说明

df2['账单周期'] = pd.to_datetime(df2.账单周期)
df2['应付日期'] = pd.to_datetime(df2.应付日期)
df2['实际到账日'] = pd.to_datetime(df2.实际到账日).fillna(today_time) # 如果还没有到账,就假定今天到账,因为用户可能提前还款,实际到账时间记录的就是用户还款的时间。没有还款就假定今天还款。

三:分析增加新的数据:

1:增加是否逾期字段:

# 如果应付的时间大于当前时间,说明还没有预期,此时设置0 
df2['是否到期'] = df2.apply(lambda x : 0 if x.应付日期 > today_time else 1,axis=1)

2: 增加是否逾期90天的字段:

# 今天的日期-应付的时间得到一个timedata,判断这个时间段是否大于90天,如果大于为1,不大于为0
df2['是否到期90天'] = (today_time - df2.应付日期 ).map(lambda x : 1 if x.days >= 90 else 0)

3: 设置未收金额2 表示:还有多少钱没有还款?主要是为了校验数据是否正确。

# 账单的金额 - 已经收的金额
df2['未收金额2'] = (df2.账单金额 - df2.实收金额)

4: 计算逾期天数(历史逾期天数和当前逾期天数):
历史逾期天数 = 实际还款日- 应付日期。

如果未收到的金额为0,表示当前没有欠款。但是不能表明,他曾经没有逾期过。此时使用 实际还款日- 应付日期,存在两种情况。情况一:提前还款,此时计算得到的是负数。情况二:在还款日期之后还款,此时计算得到的是正数(曾经逾期过)。

如果未收到的金额不为0,表示当前存在欠款。但是此时不能表明,该用户已经逾期了。此时应该也分两种情况:情况一:today_time - x.应付日期,如果是负数,也就是表明,此时还没有逾期。如果是正数,则表示此时用户已经逾期了。

# 看现在未收的金额是不是0,如果是0表示用户已经还款了,则历史逾期天数 = 实际还款日 - 应付日期。此时的逾期可能是正(逾期但是还款了),可能是负数(不但逾期还没有还款)。
# 如果不是0,则表示还未还款,则用当前的时间 - 应付的日期。此时的逾期可能是正数(逾期了),也可能是负数(还没到期呢)。
df2['历史逾期天数'] = df2.apply(lambda x : (x.实际到账日 - x.应付日期).days if x.未收金额2 == 0 else (today_time - x.应付日期).days,axis=1)

5:计算当前的逾期天数:

# 如果当前没有欠款,直接赋值0,如果当前存在欠款,则当前的逾期天数 = 历史的逾期天数,如果历史逾期天数为正,表示此时已经逾期了,如果为负,表示此时还没有逾期。
df2['当前逾期天数'] = df2.apply(lambda x : (x.历史逾期天数) if x.未收金额2 > 0 else 0 ,axis = 1)

四:统计部分信息:

4.1: 统计2019年之前的账单信息:

1: 提取2017-2018年的数据:

df3 =df2.copy() 
#创建’账单季度‘字段,将日期转换成季度 
df3['账单季度'] = df3['账单周期'].map(lambda x : x.to_period('Q')) 
#提取2017年3季度到2018年4季度数据 
df3 = df3[(df3['账单季度']<='2018Q4') & (df3['账单季度']>='2017Q3')] 
df3.shape

在这里插入图片描述
2:按照季度统计账单金额:

fn1 = df3.groupby('账单季度')[['账单金额']].sum()
fn1.columns = ['账单金额'] 
fn1

在这里插入图片描述
3:按照季度统计,到期金额

#90天到期金额
df4 = df3[(df3.是否到期90天 == 1)] # 取出所有到期的数据
fn2 = df4.groupby('账单季度')[['账单金额']].sum() # 把数据按照账单季度分组,然后对账单金额进行求和
fn2.columns = ['到期金额']  # 修改列名
fn2

在这里插入图片描述
4:按照季度统计,逾期金额。

df4 = df3[(df3.是否到期90天 == 1)] 
fn3 = df4.groupby('账单季度')[['未收金额2']].sum() 
fn3.columns = ['当前逾期90+金额'] 
fn3

在这里插入图片描述
5:合并三个列:

dfs = [fn1,fn2,fn3]
final1 = pd.concat(dfs,axis=1)
final1

在这里插入图片描述
6:统计坏账率:
坏账率 = 逾期总额/到期总额:

final1['90+净坏账率'] = round(final1['当前逾期90+金额'] / final1.到期金额,3) 
final1

在这里插入图片描述

4.2:绘图展示季度账单总额,坏账率

bar = (
    Bar()
    .add_xaxis(list(final1.index.values.astype(str))) 
    .add_yaxis( 
        "账单金额", 
        list(final1.账单金额),
        yaxis_index=0, color="#5793f3",
    )
    .set_global_opts( 
        title_opts=opts.TitleOpts(title="90+净坏账率"), 
    )
    .extend_axis( 
        yaxis=opts.AxisOpts( 
            name="90+净坏账率", 
            type_="value",
            min_=0, 
            max_=0.014, 
            position="right",
            axisline_opts=opts.AxisLineOpts( 
                linestyle_opts=opts.LineStyleOpts(color="#d14a61") 
            ),
            axislabel_opts=opts.LabelOpts(formatter="{value}"),
        ) 
    )
)
line = ( 
    Line()
    .add_xaxis(list(final1.index.values.astype(str)))
    .add_yaxis(
        "90+净坏账率", 
        list(final1['90+净坏账率']),
        yaxis_index=1, 
        color="#675bba",
        label_opts=opts.LabelOpts(is_show=False),
    )
)
bar.overlap(line).render_notebook()

在这里插入图片描述

4.3: 计算每个季度的60天账单催金额,90天的账单催金额,以及入催率:

1:计算每个季度的60天账单入催金额,90天账单入催金额

#60天账期的账单金额 
df4 = df3[(df3.账期 == 60)&(df3.是否到期 == 1)]
fn1 = df4.groupby('账单季度')[['账单金额']].sum() 
fn1.columns = ['60天账期的账单金额'] 
#60天账期的入催金额 
df4 = df3[(df3.账期 == 60)&(df3.是否到期 == 1)&(df3.历史逾期天数>0)] 
fn2 = df4.groupby('账单季度')[['未收金额2']].sum() 
fn2.columns = ['60天账期的入催金额'] 
#90天账期的账单金额 
df4 = df3[(df3.账期 == 90)&(df3.是否到期 == 1)]
fn3 = df4.groupby('账单季度')[['账单金额']].sum()
fn3.columns = ['90天账期的账单金额'] 
#90天账期的入催金额 
df4 = df3[(df3.账期 == 90)&(df3.是否到期 == 1)&(df3.历史逾期天数>0)] 
fn4 = df4.groupby('账单季度')[['未收金额2']].sum()
fn4.columns = ['90天账期的入催金额']

2:计算入催率:

dfs = [fn1,fn2,fn3,fn4] 
final2 = pd.concat(dfs,axis=1)
# final2 = fn1.merge(fn2,on='账单季度').merge(fn3,on='账单季度',how='left').merge(fn4,on='账单季度')
final2['60天账期入催率'] = round(final2['60天账期的入催金额'] / final2['60天账期的账单金额'],3) 
final2['90天账期入催率'] = round(final2['90天账期的入催金额']/final2['90天账期的账单金额'],3)
final2

在这里插入图片描述
3: 进行绘图:

line = (
    Line() 
    .add_xaxis(list(final1.index.values.astype(str))) 
    .add_yaxis( 
        "60天账期入催率", 
        list(final2['60天账期入催率']),
        yaxis_index=0, color="#675bba",
        label_opts=opts.LabelOpts(is_show=False),
    )
    .set_global_opts( 
        title_opts=opts.TitleOpts(title="不同账期入催率"),
    )
    .add_xaxis(list(final1.index.values.astype(str)))
    .add_yaxis(
        "90天账期入催率", 
        list(final2['90天账期入催率']), 
        yaxis_index=0, color="#d14a61", 
        label_opts=opts.LabelOpts(is_show=False),
    ) 
)
line.render_notebook()

在这里插入图片描述

4.4:计算不同逾期天数的回收情况:

1: 计算:

df6 = df3[(df3.未收金额2 == 0)&(df3.是否到期 == 1)].copy()
#使用cut,讲数据按照逾期天数分箱,然后添加分箱之后结果标签 
df6['历史逾期天数'] = pd.cut(df6['历史逾期天数'],bins=[-999,0,5,10,15,20,30,60,90,999],right=True, labels=['0','1-5','6-10','11-15','16-20','21-30','31-60','61-90','91+'])
final3 = df6.groupby('历史逾期天数')[['账期']].count() 
final3.columns = ['回收账单数'] 
final3

在这里插入图片描述
2: 绘图:

ydata = final3['回收账单数'].values.tolist() 
bar = (
    Bar() 
    .add_xaxis(list(final3.index.values.tolist())) 
    .add_yaxis("收回账单数",ydata,yaxis_index=0,color="#675bba")
    .set_global_opts( title_opts=opts.TitleOpts(title="不同逾期天数的已收回账单数"), 
                    )
)
bar.render_notebook()

在这里插入图片描述

标签:01,账单,逾期,金额,df3,风控,---,90,df2
来源: https://blog.csdn.net/qq_41341757/article/details/111128649

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有