使用npf.rate()显示错误值,与Excel RATE()结果不符的问题排查
numpy_financial.rate与Excel RATE函数结果不一致的原因及解决
问题重现
以下是用于计算年利率的代码,使用numpy_financial.rate()生成int_py列,同时给出ExcelRATE()函数的结果exc列,两者仅最后2条数据结果一致,前5条差异极大:
import pandas as pd import numpy_financial as npf annual_interest = dict({"Id" : [1, 2, 3, 4, 5, 6, 7], "Period" : [24, 23, 18, 12, 36, 34, 60], "EMI" : [0, 0, 0, 87548, 58405, 2969, 22877], "Amount" : [2300, 38400, 31580, 80000, 46500, 68000, 1118691]}) df = pd.DataFrame(annual_interest) df['int_py'] = df.apply(lambda x : (npf.rate(x['Period'], -x['EMI'], x['Amount'], 0))*12, axis =1) # Excel代码:=RATE(Period, -EMI, AMOUNT)*12 df['exc'] = [-11.9642098, -11.9724795, -11.99528627, "#NUM!", "#NUM!", 0.293622, 0.083614] df.head(10)
原因分析
两者结果差异的核心是无解场景下的处理逻辑不同:
- 前3条(EMI=0):月供为0时,数学上只有负利率能让本金在期末变为0(本金持续贬值)。Excel直接返回负利率结果,而
npf.rate()会直接计算出该负利率,若你预期的是正利率解,就会产生认知差异。 - 第4、5条(EMI远大于本金/期数):总还款额(EMI*期数)远大于本金,此时不存在正实数利率解(相当于借了钱却超额还款,只有负利率能满足现金流等式)。Excel会返回
#NUM!表示无法找到正利率解,而npf.rate()会直接返回负利率解,导致结果差异。
解决方法
可以通过添加条件判断,让npf.rate()的行为和Excel对齐:
def calculate_rate(nper, pmt, pv): # 处理EMI为0的场景:无合理正利率解,返回NaN(和Excel#NUM!逻辑对齐) if pmt == 0: return float('nan') # 计算每期利率 period_rate = npf.rate(nper, -pmt, pv, 0) # 处理负利率场景:和Excel一致返回NaN if period_rate < 0: return float('nan') # 转换为年利率 return period_rate * 12 df['int_py'] = df.apply(lambda x: calculate_rate(x['Period'], x['EMI'], x['Amount']), axis=1)
调整后,前5条数据会返回NaN,和Excel的#NUM!或负利率场景的处理逻辑对齐;若你需要保留负利率结果,可移除对应的判断条件。
内容的提问来源于stack exchange,提问作者Data-7scientist
相关产品推荐
相关产品推荐

