金融风控项目-1

文章目录

  • 一. 案例背景介绍
  • 二. 代码实现
    • 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 逾期一个月以内

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/968315.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA安全—Shiro反序列化DNS利用链CC利用链AES动态调试

前言 讲了FastJson反序列化的原理和利用链&#xff0c;今天讲一下Shiro的反序列化利用&#xff0c;这个也是目前比较热门的。 原生态反序列化 我们先来复习一下原生态的反序列化&#xff0c;之前也是讲过的&#xff0c;打开我们写过的serialization_demo。代码也很简单&…

基于Spring Boot的医院挂号就诊系统【免费送】

基于Spring Boot的医院挂号就诊系统 效果如下&#xff1a; 系统登陆页面 系统主页面 挂号页面 客服页面 挂号管理页面 公告信息管理页面 审核页面 在线咨询管理页面 研究背景 随着医疗技术的不断发展和人们健康意识的提高&#xff0c;医院作为提供医疗服务的核心机构&#x…

玩转适配器模式

文章目录 解决方案现实的举例适用场景实现方式适配器模式优缺点优点:缺点:适配器模式可比上一篇的工厂模式好理解多了,工厂模式要具有抽象的思维。这个适配器模式,正如字面意思,就是要去适配某一件物品。 假如你正在开发一款股票市场监测程序, 它会从不同来源下载 XML 格…

栈的简单介绍

一.栈 栈是一种先进后出的结构&#xff1a;&#xff08;先出来的是45&#xff0c;要出12就必须先把前面的数据全部出完。&#xff09; 2.实例化一个栈对象&#xff1a; 3.入栈&#xff1a; 4.出栈&#xff1a;&#xff08;当走完pop就直接弹出45了。&#xff09; 5.出栈的…

【Java】-【面试】-【Java进阶】

一、分布式 1、分布式锁 2、分布式ID 3、分布式事务

Leetcode - 周赛435

目录 一、3442. 奇偶频次间的最大差值 I二、3443. K 次修改后的最大曼哈顿距离三、3444. 使数组包含目标值倍数的最少增量四、3445. 奇偶频次间的最大差值 II 一、3442. 奇偶频次间的最大差值 I 题目链接 本题使用数组统计字符串 s s s 中每个字符的出现次数&#xff0c;然后…

kafka了解-笔记

文章目录 kafka快速上手Kafka介绍Kafka快速上手理解Kafka的集群工作机制Kafka集群的消息流转模型 Kafka客户端小型流转流程客户端工作机制 kafka快速上手 Kafka介绍 MQ的作用 MQ&#xff1a;MessageQueue&#xff0c;消息队列&#xff0c;是一种FIFO先进先出的数据结构&#…

支持向量机原理

支持向量机&#xff08;简称SVM&#xff09;虽然诞生只有短短的二十多年&#xff0c;但是自一诞生便由于它良好的分类性能席卷了机器学习领域。如果不考虑集成学习的算法&#xff0c;不考虑特定的训练数据集&#xff0c;尤其在分类任务中表现突出。在分类算法中的表现SVM说是排…

解决VsCode的 Vetur 插件has no default export Vetur问题

文章目录 前言1.问题2. 原因3. 解决其他 前言 提示&#xff1a; 1.问题 Cannot find module ‘ant-design-vue’. Did you mean to set the ‘moduleResolution’ option to ‘node’, or to add aliases to the ‘paths’ option? Module ‘“/xxx/xxx/xxx/xxx/xxx/src/vie…

常用的python库-安装与使用

常用的python库函数 yield关键字openslide库openslide库的安装-linuxopenslide的使用openslide对象的常用属性 cv2库numpy库ASAP库-multiresolutionimageinterface库ASAP库的安装ASAP库的使用 concurrent.futures.ThreadPoolExecutorxml.etree.ElementTree库skimage库PIL.Image…

Word成功接入DeepSeek详细步骤

原理 原理是利用Word的VBA宏&#xff0c;写代码接入API。无需下载额外插件。 步骤一、注册硅基流动 硅基流动统一登录 注册这个是为了有一个api调用的api_key&#xff0c;有一些免费的额度可以使用。大概就是这个公司提供token&#xff0c;我们使用这个公司的模型调用deepsee…

【Ubuntu VScode Remote SSH 问题解决】Resolver error: Error: XHR failed

1. 问题描述 VScode使用remote ssh 远程服务器&#xff0c;报错类似&#xff1a; [12:06:01.219] Downloading VS Code server locally... [12:06:01.310] Resolver error: Error: XHR failedat k.onerror (vscode-file://vscode-app/private/var/folders/g1/cvs2rnpx60qc3b4…

系统思考—双环学习

前几天&#xff0c;一个企业高管向我提到&#xff1a;“我们调整了N次方案&#xff0c;市场策略、团队激励、管理制度&#xff0c;能改的全改了&#xff0c;怎么还是不见起色&#xff1f;” 这让我想到典型的单环学习&#xff0c;简单来说就是&#xff1a;发现问题 → 采取行动…

2.11寒假

今天复习了深搜和广搜然后做了作业中的一个题目。 解析&#xff1a;外层 for 循环&#xff1a;for (int i 1; i < n; i)&#xff0c;循环变量 i 从 1 递增到 n&#xff0c;表示要依次将数字 1 到 n 分配到数组 a 中。内层 for 循环&#xff1a;for (int j 1; j < 2; j)…

使用 AlexNet 实现图片分类 | PyTorch 深度学习实战

前一篇文章&#xff0c;CNN 卷积神经网络处理图片任务 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于 强化学习必修课&#xff1a;引领人工智能新时代【梗直哥瞿炜】 使用 AlexNet 实现图片分类…

基于进化式大语言模型的下一代漏洞挖掘范式:智能对抗与自适应攻防体系

摘要 本文提出了一种基于进化式大语言模型(Evolutionary LLM)的智能漏洞挖掘框架,突破了传统静态分析的局限,构建了具备对抗性思维的动态攻防体系。通过引入深度强化学习与多模态感知机制,实现了漏洞挖掘过程的自适应进化,在RCE、SQLi、XXE等关键漏洞类型的检测中达到97…

python自动化测试之Pytest框架之YAML详解以及Parametrize数据驱动!

一、YAML详解 YAML是一种数据类型&#xff0c;它能够和JSON数据相互转化&#xff0c;它本身也是有很多数据类型可以满足我们接口 的参数类型&#xff0c;扩展名可以是.yml或.yaml 作用&#xff1a; 1.全局配置文件 基础路径&#xff0c;数据库信息&#xff0c;账号信息&…

SQLMesh系列教程-2:SQLMesh入门项目实战(上篇)

假设你已经了解SQLMesh是什么&#xff0c;以及其他应用场景。如果没有&#xff0c;我建议你先阅读《SQLMesh系列教程-1&#xff1a;数据工程师的高效利器-SQLMesh》。 在本文中&#xff0c;我们将完成一个小项目或教程&#xff0c;以帮助你开始使用SQLMesh。你可以选择一步一步…

人工智能与低代码如何重新定义企业数字化转型?

引言&#xff1a;数字化转型的挑战与机遇 在全球化和信息化的浪潮中&#xff0c;数字化转型已经成为企业保持竞争力和创新能力的必经之路。然而&#xff0c;尽管“数字化”听上去是一个充满未来感的词汇&#xff0c;落地的过程却往往充满困难。 首先&#xff0c;传统开发方式…

使用云效解决docker官方镜像拉取不到的问题

目录 前言原文地址测试jenkins构建结果:后续使用说明 前言 最近经常出现docker镜像进行拉取不了&#xff0c;流水线挂掉的问题&#xff0c;看到一个解决方案: 《借助阿里个人版镜像仓库云效实现全免费同步docker官方镜像到国内》 原文地址 https://developer.aliyun.com/artic…