You need to enable JavaScript to run this app. 如何基于导入的pandas DataFrame账龄数据生成迁徙率矩阵
优惠活动
大模型
产品
解决方案
定价
更多

如何基于导入的pandas DataFrame账龄数据生成迁徙率矩阵

基于Pandas实现账龄迁徙率矩阵计算的实操步骤

前置数据准备

  • 首先明确固定账龄状态的风险递进顺序:["NYD", "DPD30", "DPD60", "DPD90", "DPD120", "DPD150", "Loss"],列顺序不能错位,否则会导致计算逻辑匹配错误
  • 对导入的DataFrame做时间清洗与排序,保证相邻月份按时间顺序严格对应:
import pandas as pd

# 固定账龄状态顺序(按风险从低到高排列)
aging_status = ["NYD", "DPD30", "DPD60", "DPD90", "DPD120", "DPD150", "Loss"]

# 数据清洗
df["Month"] = pd.to_datetime(df["Month"])
df = df.sort_values("Month", ascending=True).reset_index(drop=True)

核心计算逻辑实现

  • 计算规则完全匹配业务定义:对任意相邻的基准月t、观测月t+1,t月各状态的迁徙率 = t+1月风险层级向前移动一位的余额 / t月当前层级的余额
    • NYD迁徙率 = (t+1月DPD30余额)/(t月NYD余额),对应你举例的“2月DPD30余额400 / 1月NYD余额1000 = 40%”的计算逻辑
    • DPD30迁徙率 = (t+1月DPD60余额)/(t月DPD30余额)
    • 按此递进规则,直到最后一档DPD150的迁徙率 = (t+1月Loss余额)/(t月DPD150余额)
  • 代码实现:
# 提取结构化的账龄数值矩阵:行是按时间排序的月份,列是固定顺序的账龄状态
aging_matrix = df[aging_status].values
# 提取标准化月份标签
month_labels = df["Month"].dt.strftime("%Y-%m").tolist()

# 初始化结果存储容器
migration_result = []
# 遍历所有可计算的基准月(最后一个月没有后续观测月,无法计算迁徙率)
for base_month_idx in range(len(month_labels) - 1):
    # 当前基准月的各状态余额
    base_bal = aging_matrix[base_month_idx]
    # 观测月的余额向前偏移一位(从第二列DPD30开始取值,和基准月的NYD到DPD150序列一一对应)
    observed_bal_shifted = aging_matrix[base_month_idx + 1][1:]
    # 逐档计算迁徙率,加入除零保护避免报错
    current_rate_row = []
    for level_idx in range(len(observed_bal_shifted)):
        if base_bal[level_idx] == 0:
            current_rate_row.append(pd.NA)
        else:
            current_rate_row.append(observed_bal_shifted[level_idx] / base_bal[level_idx])
    # 拼接行数据
    migration_result.append([f"{month_labels[base_month_idx]} 基准月"] + current_rate_row)

# 生成最终的迁徙率矩阵表
migration_df = pd.DataFrame(
    migration_result,
    columns=["基准月份"] + [f"{status} 迁徙率" for status in aging_status[:-1]]
)

结果校验与格式调整

  • 数值校验:代入示例场景验证,若1月NYD余额为1000、2月DPD30余额为400,结果表中1月基准月对应的“NYD 迁徙率”值应为0.4,和业务规则完全匹配
  • 格式调整:若需要以百分比格式展示结果,可对数值列做格式化处理:
migration_df.iloc[:, 1:] = migration_df.iloc[:, 1:].applymap(
    lambda x: f"{x:.1%}" if pd.notna(x) else "-"
)

注意事项

  • 不要误用pandas行维度的shift函数:本次计算的错位是列维度(不同账龄状态的层级偏移),不是行维度的时间偏移,直接用行shift会导致逻辑完全错位
  • 保留除零保护逻辑:当基准月某账龄状态余额为0时(如当月无新增贷款导致NYD余额为0),对应迁徙率无业务意义,应设为空值而非计算出无意义的无穷值

内容的提问来源于stack exchange,提问作者Mohsin Jamil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.08 11:45:04