【问题标题】:Python offset in loop循环中的Python偏移
【发布时间】:2018-05-30 09:27:55
【问题描述】:

我有一段代码可以计算贷款的摊销情况,并允许违约(cdr = 固定违约率)和提前还款(cpr = 固定提前还款率)。

我也想包括追回款,但这些追款款应在未来一段时间内收到。在下面的示例中,我应用了 3% 的 cdr,并且我希望在六个月后收回 60% 的违约贷款余额。 我正在为此苦苦挣扎,因为在每个循环中都需要参考上一个时期。

通过首先创建一个没有恢复的表/数据框来解决这个问题,然后在第二阶段通过在列恢复中添加 60% 的默认值来应用恢复,抵消 6 个月。

但是我希望在 amortize 函数中有一种更好/更清洁的方法。

任何帮助将不胜感激。

import pandas as pd
import numpy as np
from datetime import date
from collections import OrderedDict
from dateutil.relativedelta import *
pd.options.display.float_format = '{:,.2f}'.format

def amortize(principal, int_rate,periods, cpr, cdr, date, recovery_rate, recovery_timing):
    p = 0
    beg_balance = principal
    end_balance = principal

    while end_balance > 1:
        default = round((1-(1-cdr/100)**(1/12)) * beg_balance,2)
        interest = round((int_rate/12)*max(beg_balance-default,0),2)        
        if p < periods:
            pmt = -round(np.pmt(int_rate/12, periods -p, 
                                beg_balance - default),2)
        else:
            pmt = 0
        principal = pmt - interest
        prepay = round((1-(1-cpr/100)**(1/12)) * (beg_balance - principal),2)

        end_balance = max(beg_balance - principal - prepay - default,0)
        recovery = default * recovery_rate/100

        total_cash = pmt + prepay + recovery #plus a recovery lag
        yield OrderedDict([('Period',p+1),
                          ('Month', date),
                          ('Begin_Bal', beg_balance),
                          ('Default',default),
                          ('Sched Princ',principal),
                          ('Prepay Princ',prepay),
                          ('Interest',interest),
                          ('Recovery',recovery),
                          ('Total CF',total_cash),
                          ('End Balance', end_balance)])
        p += 1
        date += relativedelta(months=1)
        beg_balance = end_balance


table = amortize(300000,0.03,360,10,3,date(2017,12,11),60,6)                            

pd.DataFrame(table).head()

【问题讨论】:

    标签: python pandas loops generator ordereddictionary


    【解决方案1】:

    您的解决方案听起来很干净。您还可以使用defaults.append(..) 创建过去默认值的列表,然后参考defaults[-6]

    如果贷款期限很长,可以使用collections.deque,固定容量为6,而不是列表,避免保留过多的旧计算。

    【讨论】:

    • 谢谢,简单有效!
    猜你喜欢
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    相关资源
    最近更新 更多