使用Python/Pandas生成贷款从起息到到期的风险敞口演变DataFrame
生成贷款风险敞口演变DataFrame
实现步骤及代码
- 导入依赖并初始化输入数据
import pandas as pd # 输入的贷款数据 data = { 'contract': [1, 2, 3], 'amount': [100, 90, 50], 'inception': ['31/12/2022', '31/12/2023', '31/12/2024'], 'maturity': ['31/12/2042', '31/12/2052', '31/12/2035'] } df = pd.DataFrame(data)
- 转换日期格式为datetime类型
字符串日期无法直接比较,先统一转为datetime格式:
df['inception'] = pd.to_datetime(df['inception'], format='%d/%m/%Y') df['maturity'] = pd.to_datetime(df['maturity'], format='%d/%m/%Y')
- 生成观测日期序列
提取最早起息日到最晚到期日之间的每年12月31日(和示例日期格式一致):
start_date = df['inception'].min() end_date = df['maturity'].max() # 生成每年年末的日期序列,转为示例的字符串格式 date_range = pd.date_range(start=start_date, end=end_date, freq='Y').strftime('%d/%m/%Y').tolist() result_df = pd.DataFrame({'date': date_range})
- 计算每个合同的风险敞口
遍历每个合同,判断日期是否处于敞口期(起息日及之后、到期日之前),符合则赋值贷款金额,否则为0:
for _, loan in df.iterrows(): contract_id = str(loan['contract']) amount = loan['amount'] inception = loan['inception'] maturity = loan['maturity'] result_df[contract_id] = result_df['date'].apply( lambda dt_str: amount if (pd.to_datetime(dt_str, format='%d/%m/%Y') >= inception) and (pd.to_datetime(dt_str, format='%d/%m/%Y') < maturity) else 0 )
- 查看最终结果
print(result_df)
运行后输出的DataFrame将与示例一致,包含从最早起息日到最晚到期日的每年年末日期,以及对应每个合同的风险敞口金额。
内容的提问来源于stack exchange,提问作者Nassir Bin
相关产品推荐
相关产品推荐

