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

时间:2015-01-16 03:54:53

标签: python arrays numpy

我使用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函数一些问题,但我不确定纠正这个问题的最佳方法是什么。感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

你的第二个案例在b中有一个零。

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

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

要修复它,你只需要在那里没有。

答案 1 :(得分:0)

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

(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)