在python中设计滚动率转换martix表

时间:2018-02-07 19:14:51

标签: python pandas numpy matrix

我有这个任务,并且我在python中设计一个滚动率转换矩阵表,分配如下: 1)设计贷款利率表转换矩阵表。描述如何从复古数据中获得推导滚动速率的任务。用实际的示例费率填写表格。随意使用常识或数据驱动的方法来推导示例。

所以我做了:

import numpy as np
import pandas as pd
from numpy.random import rand
np.random.seed(50)

它给了我一个设定的数据帧矩阵但是随机数,但现在我几乎没有问题

  1. 假设所有列最多可添加1或100

  2. 转换矩阵假设排列为单位矩阵 现在你如何在python中做到这一点?

1 个答案:

答案 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的条件。