我有这个任务,并且我在python中设计一个滚动率转换矩阵表,分配如下: 1)设计贷款利率表转换矩阵表。描述如何从复古数据中获得推导滚动速率的任务。用实际的示例费率填写表格。随意使用常识或数据驱动的方法来推导示例。
所以我做了:
import numpy as np
import pandas as pd
from numpy.random import rand
np.random.seed(50)
它给了我一个设定的数据帧矩阵但是随机数,但现在我几乎没有问题
假设所有列最多可添加1或100
转换矩阵假设排列为单位矩阵 现在你如何在python中做到这一点?
答案 0 :(得分:2)
贷款业绩通常作为字符串在单个字段中提供。所以,如果它是你必须打破这一点。以下是代表6笔贷款的数据框架。
df = pd.DataFrame([
"CCCCCC",
"CCCC3C",
"C3363C",
"6669F",
"CC3CC3",
"69R"
], columns=["history"])
如果弦长不均匀,则必须用一些值填充它们。下面我考虑6个月的历史
mo_history = 6
df = df.history.str.pad(mo_history,fillchar="X").str[-mo_history:]
df
0 CCCCCC
1 CCCC3C
2 C3363C
3 X6669F
4 CC3CC3
5 XXX69R
Name: history, dtype: object
将其拆分为期间
df = df.apply(lambda x: pd.Series(list(x)))
df
0 1 2 3 4 5
0 C C C C C C
1 C C C C 3 C
2 C 3 3 6 3 C
3 X 6 6 6 9 F
4 C C 3 C C 3
5 X X X 6 9 R
分解过渡并排除那些已填充的过渡
df_trans = pd.DataFrame(columns=["mo1","mo2"])
for c1 in range(len(df.columns) - 1):
c2 = c1 + 1
trans = pd.concat([df[c1],df[c2]],axis=1)
trans.columns = ["mo1","mo2"]
df_trans = pd.concat([df_trans, trans],ignore_index=True)
df_trans = df_trans[(df_trans["mo1"] != "X") & (df_trans["mo2"] != "X")]
df_trans[:5]
mo1 mo2
0 C C
1 C C
2 C 3
4 C C
6 C C
我们必须得到所有可能的状态
states = set(df_trans.values.flatten())
states
{'C', '3', '6', '9', 'F', 'R'}
创建roll表并使用零填充
num_states = len(states)
roll_rates = pd.DataFrame(np.zeros([num_states,
num_states]),columns=states,index=states)
roll_rates
C 3 6 9 F R
C 0.0 0.0 0.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0 0.0 0.0
6 0.0 0.0 0.0 0.0 0.0 0.0
9 0.0 0.0 0.0 0.0 0.0 0.0
F 0.0 0.0 0.0 0.0 0.0 0.0
R 0.0 0.0 0.0 0.0 0.0 0.0
最后填充表格
for s1 in states:
for s2 in states:
num_match = sum((df_trans["mo1"] == s1) & (df_trans["mo2"] == s2))
num_all = sum(df_trans["mo1"] == s1)
if num_all > 0:
roll_rates.loc[s2,s1] = num_match / float(num_all)
roll_rates
C 3 6 9 F R
C 0.71 0.6 0.0 0.0 0.0 0.0
3 0.29 0.2 0.2 0.0 0.0 0.0
6 0.00 0.2 0.4 0.0 0.0 0.0
9 0.00 0.0 0.4 0.0 0.0 0.0
F 0.00 0.0 0.0 0.5 0.0 0.0
R 0.00 0.0 0.0 0.5 0.0 0.0
请注意,最后两列(F和R)的值为零,因为它们永远不会出现在状态1中。您可以排除它们以满足所有列总和为1的条件。