前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >风控实战:用Python实现vintage报表

风控实战:用Python实现vintage报表

作者头像
Python数据科学
发布2023-12-26 15:22:22
2250
发布2023-12-26 15:22:22
举报
文章被收录于专栏:Python数据科学Python数据科学

大家好,我是东哥。本篇继续分享风控的内容,关于如何用python实现vintage报表及可视化图的实战。

历史实战文章如下:

账龄分析(vintage)是风控中非常重要的报表之一,通过它可以将不同月份的资产数据拉齐对比贷后表现,也可以用于指导制定风控模型Y标签的成熟表现期。

那么账龄分析是如何做的呢?

vintage报表,一般需要客户的还款计划表数据,即客户历史的还款记录,包括放款金额、每期到期日期、每期还款日期、每期应该金额、每期实还金额、期数等等。vintage加工计算逻辑会在理论篇单独讲解,本篇主要介绍python代码实战。

Python代码实现

首先导入数据,每家机构的数据字段可能不尽相同,但核心逻辑都是一样的,可以基于已有的数据进行加工出我们想要的样子,比如下面这个比较原始的表结构,没有非常完善的字段。

以下是核心字段的加工逻辑。我们以每月月底为观测点对各个账龄进行DPD30+金额口径逾期率的计算。

代码语言:javascript
复制
# 定义当前观测时点
now_date = '2023-08-31'

df['repay_time'] = pd.to_datetime(df['repay_time'])
df['due_time']   = pd.to_datetime(df['due_time'])
df['loan_time']   = pd.to_datetime(df['loan_time'])
df['loan_month'] = df['loan_time'].astype(str).map(lambda x:x[:7])
df['order_id'] = df['order_id'].astype(str)

# 加工出mob月底观测日期
def get_month(x) : return dt.datetime(x.year,x.month,int(x.days_in_month))
df['due_month_end'] = df.loc[df['due_time'].isna()==False,'due_time'].apply(get_month)

# 加工应还实还金额
df['shouldpay_permonth'] = df['loan_amt']/df['loan_term']
df['shouldpay_permonth'] = df['shouldpay_permonth'].round(2)
df['actualpay_permonth'] = df['shouldpay_permonth'].where(cond = df['repay_time'].isnull()==False)
df['balance'] = df['loan_amt']-df['mob']*df['actualpay_permonth']
df['balance'] = df['balance'].round(0).ffill()

# 观测日期前未归还余额
cond = (df['repay_time'].isnull()==True) | ((df['due_month_end'] - df['repay_time']).dt.days < 0)
df['overdue_amt'] = df['balance'].where(cond, other=0)

# 筛选当前观测时点之前的数据,未来数据还未发生
df = df[df['due_time'] < now_date]
print(df.shape)

加工出我们需要的数据以后,通过pandas的pivot_table对mob账龄和所有放款月份进行透视,这样我们就得到了以上口径下截止每个月的累积逾期金额。

然后再分组计算求得每个月的放款金额总和,与累积逾期金额合并,以逾期金额为分子,以放款总金额为分母,相除即可得到累积的逾期率。

代码语言:javascript
复制
df_mob = pd.pivot_table(df,index='loan_month',columns='mob',values='overdue_amt',aggfunc='sum')
# 放款月的放款本金求和
df_loan = df.groupby(['loan_month'])['shouldpay_permonth'].sum()
# 拼接计算金额dpd30+逾期率
df_mob_all = pd.concat([df_loan.to_frame(name='loan_amt'),df_mob],axis=1)
df_mob_rate = df_mob_all.divide(df_mob_all['loan_amt'],axis=0)

可视化

两种方式。

第一种使用seabornheatmap热力图可以完美输出,并有颜色渐变的趋势。

代码语言:javascript
复制
# cohort分析
import seaborn as sns
plt.figure(figsize=(15, 8))
plt.title('cohort vintage DPD30+')
sns.heatmap(data=df_mob_rate,annot = True,fmt = '.1%',vmin = 0.0,vmax = 0.5, cmap="BuPu_r")
plt.show()

第二种是比较常规的折线图,用lineplot可以更加直观的对比各个月的走势。

代码语言:javascript
复制
# vintage折线图
palette = sns.color_palette("husl", 9)
plt.figure(figsize=(15, 8))
plt.title('lineplot vintage DPD30+')
plt.ylim(0,0.2)
plt.xticks(df_mob_rate.loc[:,1:].columns.tolist())
sns.lineplot(data=df_mob_rate.loc[:,1:].T, markers=True, dashes=True, lw=3, palette=palette)
plt.show()

--end--

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-12-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python数据科学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python代码实现
  • 可视化
相关产品与服务
腾讯云 BI
腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档