如何使用类为DataFrame指定列的所有行实例化属性?
解决方法
1. 调整类的初始化逻辑
先修改Tranche的初始化方法,让它接收单一行的数据,这样每个实例就能对应DataFrame里的一行:
class Tranche: # 初始化资产池层级 def __init__(self, rating, row_data): self.rating = rating self.cpn = row_data['Cpn'] self.price = row_data['Price'] self.moddur = row_data['ModDur'] self.oas = row_data['OAS']
2. 批量生成所有行的实例
遍历DataFrame的每一行,创建对应的Tranche实例,把实例存到列表里方便后续调用:
基础遍历写法
# 假设你的数据集叫historical_data tranche_list = [] # 这里替换成实际评级,要是每行评级不同,直接从DataFrame的列里取就行 target_rating = "AAA" for _, row in historical_data.iterrows(): tranche = Tranche(target_rating, row) tranche_list.append(tranche)
简化的列表推导式
如果不需要额外逻辑,用列表推导式更简洁:
target_rating = "AAA" tranche_list = [Tranche(target_rating, row) for _, row in historical_data.iterrows()]
每行评级不同的情况
要是DataFrame本身有Rating列,每个实例的评级对应行内的值:
tranche_list = [Tranche(row['Rating'], row) for _, row in historical_data.iterrows()]
3. 访问实例属性
生成实例后,直接通过实例名访问属性即可:
# 取第一个实例的票面利率 print(tranche_list[0].cpn) # 遍历所有实例打印价格 for tranche in tranche_list: print(tranche.price)
性能优化(针对超大型数据集)
如果你的DataFrame行数极多,iterrows()效率偏低,可以换成itertuples()提升速度:
tranche_list = [] target_rating = "AAA" for row in historical_data.itertuples(index=False): tranche = Tranche( target_rating, {'Cpn': row.Cpn, 'Price': row.Price, 'ModDur': row.ModDur, 'OAS': row.OAS} ) tranche_list.append(tranche)
内容的提问来源于stack exchange,提问作者ho0sh12
相关产品推荐
相关产品推荐

