如何改进 Python 类的迭代

如何解决如何改进 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?