如何解决如何改进 Python 类的迭代
我正在对投资组合中的许多贷款进行一组计算。
我在 Python 中创建了几个类(我使用的是 Jupyter notebook)。第一类“PortfolioInput”包括适用于投资组合中所有贷款的静态输入值。接下来的两个“PortfolioAssumptionA”和“B”是假设表。最后,我打算对投资组合中的每笔贷款一遍又一遍地使用“Loan”类。
我在 Loan 类中有一些虚构的方法,但我有大约 10 个方法,正如您在 for 循环中看到的那样,我需要多次引入这些方法以计算其他内容作为输出(例如cf_output 1 和 2)。
我正在使用 xlwings 从 excel 文件(具有命名范围)中读取数据,我的投资组合包括大约 3,000 笔贷款。在 for 循环中发生的计算实际上要长得多......虽然它有效,但需要几个小时才能完成。在循环结束时,我使用输出进行分析...
谁能给我一些关于如何改进 for 循环的建议,或者我是否可以改进我在这里使用的结构?
具体来说,我使用 portAsm_A = PortfolioAssumptionA().GetAssumptionA()
使用类“Loan”中的表和 results = AllLoans.apply(lambda x:Loan(*x),axis=1)
为所有贷款实例化类的方式......我需要帮助,如果这甚至是你在 Python 中的做法.我提前感谢您的时间,任何事情都会很有帮助!!!
import pandas as pd
import xlwings as xw
class PortfolioInput:
ClosingDate: str="12/1/2020"
ReinvestmentPeriod: int = 6
LastPeriod: int = 120
@dataclass
class PortfolioAssumptionA:
def GetAssumptionA(self):
assumption = wb.names['assumptionA'].refers_to_range.options(
pd.DataFrame,header=1,expand='table').value
return assumption
@dataclass
class PortfolioAssumptionB:
def GetAssumptionB(self):
assumption = wb.names['assumptionB'].refers_to_range.options(
pd.DataFrame,expand='table').value
return assumption
wb = xw.Book('filename.xlsx')
portAsm_A = PortfolioAssumptionA().GetAssumptionA()
portAsm_B = PortfolioAssumptionB().GetAssumptionB()
@dataclass
class Loan(PortfolioInput):
LoanNumber: int
LoanType: str
BeginningBalance: float
IntRate: float
Flag: str
State: str
def CalculateSomething1(self) -> float:
output = self.BeginningBal * self.IntRate
return output
def CalculateSomething2(self,rating) -> float:
output = self.BeginningBal * portAsm_A.loc[:,rating][0]
return output
def CalculateSomething3(self,rating) -> float:
output = self.CalculateSomething2() * portAsm_B.loc[:,rating][0]
AllLoans = pd.DataFrame(xw.Range('LoanTable').options(header=True).value) #total ~3000
results = AllLoans.apply(lambda x:Loan(*x),axis=1)
rating = ["A+","A","A-","BBB+","BBB","BBB-","BB+"]
cf_output1 = {key: {key: [] for key in results} for key in rating}
cf_output2 = {key: {key: [] for key in results} for key in rating}
for i in range(len(results)):
row = results.loc[i]
for r in rating:
cf_output1[rating][i] = row.CalculateSomething1() * row.CalculateSomething2(rating)
if row.BeginningBalance >= 10000:
cf_output2[rating][i] = row.CalculateSomething3(rating)/100
else: cf_output2[rating][i] = row.CalculateSomething3(rating) * self.IntRate
编辑:这是假设A的样子:
A+ A A- BBB+ BBB BBB- BB+
asusmptionA 0.5 0.45 0.4 0.35 0.3 0.25 0.2
这就是贷款的样子:
LoanNumber LoanType BeginningBalance IntRate Flag State
0 1.0 A 10000.0 0.030 Y MA
1 2.0 A 15000.0 0.020 Y NY
2 3.0 A 9500.0 0.035 Y NY
3 4.0 B 20000.0 0.210 N NH
4 5.0 A 15850.0 0.340 Y MD
解决方法
也许您可以将评分存储为 Loan
类的一部分。这意味着您不需要制作 dicts 来保存评级。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。