【问题标题】:ValueError: f(a) and f(b) must have different signValueError: f(a) 和 f(b) 必须有不同的符号
【发布时间】:2019-05-07 00:05:47
【问题描述】:

我有一个数据框,其中包含日期、现金、汇率、姓名等列。当我尝试按名称分组时,我能够找到 XIRR 的值,但是当我尝试按速率分组时,错误出现在

文件 "C:\ProgramData\Anaconda3\lib\site-packages\scipy\optimize\zeros.py", 第 519 行,在布伦特 r = _zeros._brentq(f,a,b,xtol,rtol,maxiter,args,full_output,disp)

ValueError: f(a) and f(b) must have different signs"
def xnpv(rate, values, dates):    
    if rate <= -1.0:
        return float('inf')
    d0 = dates.min()   # or min(dates)
    return sum([ vi / (1.0 + rate)**((di - d0).days / 365.0) for vi, di in zip(values, dates)])
def xirr(values, dates):  
    try:
        return scipy.optimize.newton(lambda r: xnpv(r, values, dates), 0.0)
    except RuntimeError:    # Failed to converge?
        return scipy.optimize.brentq(lambda r: xnpv(r, values, dates), -1.0, 1e10) 

def f(x):

    x["XNPV"] = xnpv(0.1, x["Cash"], x['Date'])
    x["XIRR"] = xirr( x["Cash"], x['Date'])
    return x

f2 = f1.groupby('RATE').apply(f)

【问题讨论】:

    标签: python python-3.x pandas-groupby valueerror


    【解决方案1】:

    错误信息相当清楚。 来自docs

    返回浮点数,a 和 b 之间的 f 的零。 f 必须是连续的 函数,[a,b] 必须是变号区间。

    出现这种情况是因为 brentq 对“二等分”求根技术进行了修改,而牛顿法却没有。鉴于区间之间存在根的保证(这意味着区间之间的符号必须改变),brentq 将始终收敛。
    这与 newton 方法形成对比,后者不受相同要求的影响,但可能无法收敛,因为它依赖于初始根猜测。

    底线 scipy.optimize.brentq(lambda r: xnpv(r, values, dates), -1.0, 1e10) 在这里,区间被视为 [-1.0, 1e10],并且对于这两个值,函数必须评估为相同的符号。您需要为f(a)f(b) 提供一个具有不同值的区间,以确保根位于两者之间。

    【讨论】:

    • 感谢您的回复。你能帮我解决我找到 XIRR 的问题吗?
    • 我可以给多少时间间隔?你能建议多一点吗?我有一个庞大的数据集
    • 你能帮我解决值区间问题吗?
    • 嗯,老实说,您必须弄清楚如何为您的用例选择一个稳健的间隔。然而,一个好的开始实际上是在xnpv(&lt;your value here&gt;, values, dates) 中插入一些值并尝试查看结果如何变化。您将需要选择最终给出不同符号的值。
    • @ChetanP 亲爱的朋友,我也有同样的问题。你能解决这个问题吗?
    猜你喜欢
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 2019-08-29
    • 2012-01-28
    相关资源
    最近更新 更多