使用numpy_financial.npv对pandas dataframe计算NPV时报错如何解决?
报错原因
numpy_financial.npv()原生仅支持单个折现率+单条一维现金流序列的计算,你直接传入整列折现率(df['RFR']是一维Series)、整张现金流DataFrame(df[value]是二维结构),函数无法自动逐行匹配参数,因此触发维度不匹配报错。
你不需要手动逐行遍历计算,以下两种方案都可以实现需求:
方案1:pandas逐行apply(易读易维护,适合数据量<10万行的场景)
首先注意你定义的现金流列名里' value_2'前有多余空格,先修正为和实际DataFrame列名一致,再执行计算:
import numpy_financial as npf # 修正列名空格,确保和你的DataFrame列名匹配 cash_flow_cols = ['value_1', 'value_2', 'value_3', 'value_4', 'value_5'] # axis=1指定按行遍历,每行传入对应折现率和现金流序列计算NPV df['NPV_IV'] = df.apply( lambda row: npf.npv(rate=row['RFR']/100, values=row[cash_flow_cols].tolist()), axis=1 )
方案2:向量化计算(高性能,适合数据量>10万行的场景)
直接基于NPV计算公式实现向量化运算,速度比apply高1~2个数量级:
import numpy as np r = df['RFR'].to_numpy() / 100 # 生成对应期数的指数,默认第一期现金流为t=0(和npf.npv逻辑一致) periods = np.arange(len(cash_flow_cols)) # 计算每行对应的折现系数 discount_factor = 1 / (1 + r[:, np.newaxis]) ** periods # 矩阵运算批量计算所有行的NPV df['NPV_IV'] = (df[cash_flow_cols].to_numpy() * discount_factor).sum(axis=1)
注意事项
numpy_financial.npv默认将传入的现金流列表第一个元素视为t=0时刻的现金流(无需折现),如果你的value_1是第一期末的现金流,需要在现金流列表开头补0,或调整上述代码中periods的起始值为1,避免计算结果偏差。
内容的提问来源于stack exchange,提问作者JoshZ
相关产品推荐
相关产品推荐

