【问题标题】:Using numpy.rate, on numpy array returns nan's unexpectedly使用 numpy.rate,在 numpy 数组上意外返回 nan
【发布时间】:2021-02-12 18:49:24
【问题描述】:

我正在使用 np.rate 函数来计算简单的增长率。我正在尝试使用矢量操作。这有效:

b = np.arange(1,10)
np.rate(1,0,-b[:-1],b[1:])

返回:
数组([ 1. , 0.5 , 0.33333333, 0.25 , 0.2 , 0.16666667, 0.14285714, 0.125])

但是,这并不像我预期的那样工作:

b = np.arange(10)
np.rate(1,0,-b[:-1],b[1:])

返回:
数组([南,南,南,南,南,南,南,南,南])

有什么想法可以最好地解决这个问题吗?我假设第一个索引位置的 0 给 np.rate 函数带来了一些问题,但我不确定纠正这个问题的最佳方法是什么。感谢您的帮助。

【问题讨论】:

  • 我收到此错误:RuntimeWarning: divide by zero encountered in true_divide。所以可能这就是原因。
  • 如果我的回答不够,你能告诉我你还想要什么吗?

标签: python arrays numpy


【解决方案1】:

您的第二个案例在b 中为零。

np.rate 无法处理那里的 0 值。

正如我从 np.rate 的(简要)文档中所理解的那样,您要求它找出在单个支付期内将 0 变为 1 所需的利率。这是一个您要求它解决的具有挑战性的问题。

要修复它,您只需要那里没有 0。

【讨论】:

  • 嗨乔尔。感谢您的回答。据了解,获得您提出的问题的答案是不可行的。但令我惊讶的是速率函数的响应。向量中的每个元素都是 nan,而不是为该特定元素放置 nan。这是我没想到的一种全有或全无的方法。我可以创建自己的函数来处理这个问题。也许通过将所有零更改为任意数字,然后在结果中对其进行 nan-ing?
【解决方案2】:

我能想到两种可能的解决方法。

(1) 将 -b[:-1] 和 b[1:] 存储在 pandas DataFrame 中,并使用 .apply 计算每一行的 np.rate。这将比您示例中的矢量化方法慢。

import pandas as pd
import numpy as np
import numpy_financial as npf # I get a warning telling me to use numpy_financial instead of numpy
b = np.arange(0,10)
df = pd.DataFrame({'a':-b[:-1],'b':b[1:]})
res = df.apply(lambda x: npf.rate(1,0,x.a,x.b),axis=1)
# [nan,0.9999999999999999, 0.4999999999999999, 0.33333333333333326, 0.24999999999999992, 0.2, 0.1666666666666667, 0.1428571428571427, 0.12499999999999992]

(2) 存储在 Pandas 数据框中,并为有效的条目添加过滤器。在您的示例中,nper > 0 但在其他情况下,您还希望过滤其他条件,例如 (pmt * npt) >= pv。

valid_df = df.loc[df['a'] !=0] # in real examples add other filtering here.

然后,您可以仅对这些过滤的行使用矢量化计算。

df['result'] = np.nan
df.loc[df['a'] != 0,'result'] = npf.rate(1,0,valid_df.a,valid_df.b)

【讨论】:

    猜你喜欢
    • 2017-08-12
    • 2016-01-16
    • 2023-03-29
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 2020-07-04
    • 2018-07-02
    • 2012-11-25
    相关资源
    最近更新 更多