使用numpy.rate,在numpy数组上返回意外的nan

3

我正在使用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:])

返回结果:
数组([ nan, nan, nan, nan, nan, nan, nan, nan, nan])
有什么好的解决方法吗?我认为第一个索引位置的0可能会给np.rate函数带来一些问题,但我不确定最好的纠正方法是什么。感谢您的帮助。

1
我收到了这个错误:RuntimeWarning: divide by zero encountered in true_divide。所以很可能这就是原因。 - Marcin
如果我的回答不够充分,您能告诉我您还需要什么吗? - Joel
2个回答

3

你的第二个案例中,b 的值为零。

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

从 np.rate 的(简要)文档中可以理解,你正在要求它找到在单个支付周期内将0变成1所需的利率。这是一个具有挑战性的问题。

要解决此问题,您只需不要在那里放置零即可。


2
嗨,乔尔。感谢你的回答。我们知道得到你提出的问题的答案是不可行的。但让我惊讶的是速率函数的响应。它没有将nan放在特定元素中,而是将向量中的每个元素都变成了nan。这是一种全有或全无的方法,我没有预料到。我可以创建自己的函数来处理这个问题。也许通过将所有零更改为某个任意数字,然后在结果中将其变成nan? - user2962397

1
我可以想到两种可能的解决方法。
(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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接