You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:50:50