在python中,我可以创建一个将dataframe函数的结果连接到一个dataframe的函数吗

2024-07-04 13:53:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个功能:

import pandas as pd
import numpy as np
import numpy_financial as npf
from datetime import datetime 
from dateutil.relativedelta import relativedelta

def amortisation_schedule(accountno,amount, annualinterestrate, paymentsperyear, years,commission=0,LoanApplicationDate=datetime.today(),ReportStartDate=datetime.today(),ReportEndDate=datetime.today()):
 
df = pd.DataFrame({ 'Schedule_No' :[(i+1) for i in range(paymentsperyear*years)],
                    'Repayment_Date' :[(LoanApplicationDate+ relativedelta(months=i+1)) for i in range(paymentsperyear*years)],
                    'Principal' :[npf.ppmt(annualinterestrate/paymentsperyear, i+1, paymentsperyear*years, amount) for i in range(paymentsperyear*years)],
                    'Interest' :[npf.ipmt(annualinterestrate/paymentsperyear, i+1, paymentsperyear*years, amount) for i in range(paymentsperyear*years)],
                    'Fee':commission/(paymentsperyear*years) if commission>0 else 0 })

     df['Instalment'] = df.Principal + df.Interest+df.Fee
     df['Balance'] = amount + np.cumsum(df.Principal)
     df['FeeCarryingAmt'] =commission - np.cumsum(df.Fee)
     df['Account_no']=accountno
     df['EIR'] =npf.rate(paymentsperyear*years,df.Principal + df.Interest+df.Fee ,amount,0)*12
     return(round(df,3))

尝试编写一个函数,通过获取数据帧输入来实现以下功能

    df1=amortisation_schedule('xxx',-10000,0.125, 12, 2,1000,datetime(2018,4,4),datetime(2021,1,1),datetime(2021,3,31))
    df2=amortisation_schedule('yyy',-30000,0.125, 4, 3,1500,datetime(2018,4,4),datetime(2021,1,1),datetime(2021,3,31))
    df3=amortisation_schedule('zzz',-25000,0.125, 3, 5,1600,datetime(2018,4,4),datetime(2021,1,1),datetime(2021,3,31))
    df4=amortisation_schedule('ccc',-60000,0.125, 6, 6,2000,datetime(2018,4,4),datetime(2021,1,1),datetime(2021,3,31))
    dfm=pd.concat([df,df1, df2, df3], ignore_index=True)
    dfm

我有成千上万的这样的记录,我需要以这种格式处理


Tags: inimportprincipaldffordatetimerangeamount
1条回答
网友
1楼 · 发布于 2024-07-04 13:53:31

如果您有一个DataFrame函数,其中包含函数的输入值,则可以将其转换为记录字典,并使用**kwargs对函数进行求值。下面的代码提供了一个简单的演示:

import pandas as pd
import numpy as np
import numpy_financial as npf
from datetime import datetime 
from dateutil.relativedelta import relativedelta

def amortisation_schedule(accountno
                          ,amount
                          , annualinterestrate
                          , paymentsperyear
                          , years
                          , commission=0
                          , LoanApplicationDate=datetime.today()
                          , ReportStartDate=datetime.today()
                          , ReportEndDate=datetime.today()):
 
     df = pd.DataFrame({ 'Schedule_No' :[(i+1) for i in range(paymentsperyear*years)],
                    'Repayment_Date' :[(LoanApplicationDate+ relativedelta(months=i+1)) for i in range(paymentsperyear*years)],
                    'Principal' :[npf.ppmt(annualinterestrate/paymentsperyear, i+1
                                           , paymentsperyear*years, amount) for i in range(paymentsperyear*years)],
                    'Interest' :[npf.ipmt(annualinterestrate/paymentsperyear, i+1
                                          , paymentsperyear*years, amount) for i in range(paymentsperyear*years)],
                    'Fee':commission/(paymentsperyear*years) if commission>0 else 0 })

     df['Instalment'] = df.Principal + df.Interest+df.Fee
     df['Balance'] = amount + np.cumsum(df.Principal)
     df['FeeCarryingAmt'] =commission - np.cumsum(df.Fee)
     df['Account_no']=accountno
     df['EIR'] =npf.rate(paymentsperyear*years,df.Principal + df.Interest+df.Fee ,amount,0)*12
     return(round(df,3))
    
inputdata = pd.DataFrame(
  {'accountno':['xxx','yyy','zzz','aaa'], 
    'amount':[-10000,-30000,-25000,-60000], 
    'annualinterestrate':[.125,.11,.07,.08], 
    'paymentsperyear':[12,4,3,6], 
    'years':[2,3,5,6], 
    'commission':[1000,1500,1000,1800], 
    'LoanApplicationDate':[datetime(2018,4,4),datetime(2019,1,1),datetime(2020,4,1),datetime(2021,1,1)], 
    'ReportStartDate':[datetime(2021,1,1),datetime(2021,1,1),datetime(2021,1,1),datetime(2021,1,1)], 
    'ReportEndDate':[datetime(2021,3,31),datetime(2021,3,31),datetime(2021,3,31),datetime(2021,3,31)] })


vectorOfDFs = [amortisation_schedule(**record) for record in inputdata.to_dict('records') ]

result = pd.concat(vectorOfDFs, ignore_index = True)

相关问题 更多 >

    热门问题