无循环改变数组的NPV

问题描述 投票:0回答:1

我正在尝试使用 Pandas/Numpy 在 Python 中创建 NPV 函数(或者使用给定的 NPV 函数)。我将使用这个简单的数据来解释我想要做什么:

这是一个数据框:

Index   Array
0       1
1       2
2       3
3       4
4       5
5       0
6       0 

并让比率简单地为0.05。我想计算的是每个索引号的 NPV。 NPV 函数的输入是比率 (0.05) 和一个数组。对于索引 0,数组应为 (2,3,4,5,0,0),对于索引 1,数组应为 (3,4,5,0,0),依此类推。

使用 Excel,它看起来像这样: NPV Calculations in Excel

Excel公式: '=NPV($P$6,R7:$R$12)' 其中 P6 是比率(固定),R7 是数组中的第一个值(基于索引的变量),用于计算索引 0 的 NPV,R12 是最后一个值数组中的值(固定),即 0.

现在,当我使用金融numpy包中的预制NPV函数时,我无法轻松更改范围,我想我必须使用循环来更改数组的范围。我还尝试从头开始定义一个 NPV 函数来改变范围,但似乎无法想出一种没有循环的方法。一些想法/技巧可能是创建一个速率列来根据范围选择值,使用 lambda 来实现更快的循环等。任何帮助将不胜感激。

python pandas numpy finance
1个回答
0
投票

npf NPV
与Excel公式不同。我不确定第一个数字(Excel 中的单元格 R6)是什么意思。所有公式都没有引用过它。反正我就留着吧

import pandas as pd
import numpy_financial as npf
data = [1,2,3,4,5,0,0]
rate = 0.05
df = pd.DataFrame({'data': data})
r_window = len(data) - 1  
df['rwin'] = [df['data'][(i - r_window):].tolist() for i in range(len(df))]
df['NPV'] = df['rwin'].apply(lambda x: npf.npv(rate, [0] + x))
df.loc[df.index[-1], 'NPV'] = 0
print(df.drop(columns=['rwin']))
   data        NPV                                                                            
0     1  12.194713                                                                            
1     2  10.804449                                                                            
2     3   8.344671                                                                            
3     4   4.761905                                                                            
4     5   0.000000                                                                            
5     0   0.000000                                                                            
6     0   0.000000  
© www.soinside.com 2019 - 2024. All rights reserved.