当前位置: 首页 > news >正文

金融风控项目-业务基础

文章目录

  • 一. 案例背景介绍
  • 二. 代码实现
    • 1. 加载数据
    • 2. 数据处理
    • 3. 查询
  • 三. 业务解读

一. 案例背景介绍

  • 通过对业务数据分析了解信贷业务状况

  • 数据集说明

    • 从开源数据改造而来,基本反映真实业务数据
    • 销售,客服可以忽略
    • 账单周期,放款日期
    • 账单金额-实收金额 = 未收金额
    • 应付日期为还款时间
    • 账期分成两种 60天和90天
    • 实际到账日为空白 说明没还钱
      在这里插入图片描述
  • 通过对贷后业务数据的分析要分析出如下内容

    • 每个季度账单金额和坏账率(逾期90天以上)
      • 所有未收金额/所有账单金额
      • 未收金额 = 账单金额-实收金额
    • 每个季度60天账期 入催率,90天账单 入催率
    • 不同逾期天数的回款情况
      • 历史逾期天数 有逾期 已经还完了
      • 当前逾期天数 现在还欠着钱,没还完

二. 代码实现

1. 加载数据

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

在这里插入图片描述

df2.info()

在这里插入图片描述

2. 数据处理

填充缺失值,将日期时间类型转换成datetime类型

# 获取最大的日期,作为当前时间
today_time = pd.to_datetime(df2.实际到账日.fillna('0').max())

df2['实收金额'] = df2.实收金额.fillna(0)
df2['开票金额'] = df2.开票金额.fillna(0)
df2['未收金额'] = df2.未收金额.fillna(0)

df2['账单周期'] = pd.to_datetime(df2.账单周期)
df2['应付日期'] = pd.to_datetime(df2.应付日期)

df2['实际到账日'] = pd.to_datetime(df2.实际到账日).fillna(today_time)
df2

在这里插入图片描述

df2.info()

在这里插入图片描述
为了后续计算,在原始数据基础上构造新的字段:是否逾期,是否逾期90天,未收金额2(校验原始数据中的未收金额),当前逾期天数,历史逾期天数

df2['是否到期'] = df2.apply(lambda x: '1' if (x.实际到账日 > x.应付日期) else '0',axis = 1)

df2['是否到期90天'] =  ( today_time - df2.应付日期 ).map(lambda x : 1 if x.days >= 90 else 0)

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

df2['历史逾期天数'] = df2.apply(lambda x : (x.实际到账日 -  x.应付日期).days if x.未收金额2 == 0  else  (today_time - x.应付日期).days,axis=1)

df2['当前逾期天数'] = df2.apply(lambda x : (x.历史逾期天数) if x.未收金额2 > 0  else 0 ,axis = 1) 
df2

在这里插入图片描述

3. 查询

查询实际到账日期字段得知当前最近的到账日为2019年5月17日,如果以2019年5月17日为观察点,有些贷款还没到还款日,没法统计DPD90的数据,所以,这里只统计2019年之前的情况,下面将对应时间段的数据取出

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

在这里插入图片描述

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

在这里插入图片描述

#90天到期金额
df4 = df3[(df3.是否到期90== 1)]
fn2 = df4.groupby('账单季度')[['账单金额']].sum()
fn2.columns = ['到期金额']
fn2

在这里插入图片描述

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

在这里插入图片描述
合并数据计算逾期率

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

在这里插入图片描述

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

在这里插入图片描述
pyecharts绘图

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()

在这里插入图片描述
计算每个季度的60天账单入催金额,90天账单入催金额

#60天账期的账单金额
df4 = df3[(df3.账期 == 60)&(df3.是否到期 == "1")]
fn1 = df4.groupby('账单季度')[['账单金额']].sum()
fn1.columns = ['60天账期的账单金额']
fn1

在这里插入图片描述

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

在这里插入图片描述

#90天账期的账单金额
df4 = df3[(df3.账期 == 90)&(df3.是否到期 == '1')]
fn3 = df4.groupby('账单季度')[['账单金额']].sum()
fn3.columns = ['90天账期的账单金额']
fn3

在这里插入图片描述

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

在这里插入图片描述
计算入催率

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

在这里插入图片描述
pyecharts绘图

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()

在这里插入图片描述

df6 = df3[(df3.未收金额2 == 0)&(df3.是否到期 == '1')].copy()
df6

在这里插入图片描述

#使用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+'])
df6

在这里插入图片描述

final3 = df6.groupby('历史逾期天数')[['账期']].count()
final3.columns = ['回收账单数']
final3

在这里插入图片描述
pyecharts绘图

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()

在这里插入图片描述

三. 业务解读

业务解读

  • 从数据中看出,在2018年Q2季度之前,运营策略比较保守,坏账金额和入催率都比较低,
  • 2018年Q2之后,有可能是由于运营策略调整,给更多的人放贷,但坏账率和入催率均在3%一下,在合理范围内
  • 不同逾期天数收回账单的数据看,30天内能收回绝大部分账单

● 知道常见信贷风险
○ 信用风险
○ 欺诈风险
● 知道机器学习风控模型的优势
○ 批量,迅速,准确,同时处理大量贷款请求
○ 在零售信贷业务场景下,与人工审核相比优势显著
● 知道信贷领域常用术语含义
○ DPD 逾期天数
○ FPD 首次逾期天数
○ bad rate 坏账率
○ M1 逾期一个月以内

相关文章:

  • carbon 加入 GitCode:Golang 时间处理的 “瑞士军刀”
  • C语言基础学习之基本语法
  • C++智能指针的使用
  • 服务器绑定 127.0.0.1 和 0.0.0.0 的区别
  • 深入理解 CSS 层叠上下文
  • 只需三步!5分钟本地部署deep seek——MAC环境
  • linux ollama deepseek等大语言模型的model文件的存储目录
  • 【Mastering Vim 2_01】开篇词:在 AI 时代持续深耕底层技术,做长期主义的坚定捍卫者
  • 【每日关注】科技圈重要动态
  • ArrayList、LinkedList、HashMap、HashTable、HashSet、TreeSet
  • 得物端智能视频封面推荐
  • WebSocket与Socket.io的区别
  • 将Docker容器打包成镜像提交
  • 评估多智能体协作网络(MACNET)的性能:COT和AUTOGPT基线方法
  • 今日学习总结
  • 【面试集锦】如何设计SSO方案?和OAuth有什么区别?
  • Open FPV VTX开源之OSD使用分类
  • 腿足机器人之二- 运动控制概览
  • Java NIO ByteBuffer 详解
  • 如何在Vscode中接入Deepseek
  • wordpress 投票 插件/北京网站优化服务
  • 南京英文网站建设/网站搜索优化官网
  • 昆明 网站建设/怎么快速优化网站排名
  • 网站建设服务费交印花税吗/网络推广怎么学
  • 自适应网站建设哪家便宜/站优化
  • 京东网站建设费用/今日最新消息新闻