我不熟悉Python熊猫。 我想估算一个时期内流入付款的价值,考虑到费用和一段时期内的增长。 我只使用了一次付款(流入)来测试。 有时fee2可以应用到n-t周期,即不是整个周期,n
我像下面这样做,只是想知道是否有更好的方法来重新计算值而不循环?在
Python代码:
import pandas as pd
import numpy as np
def getCashFlows():
term = 2
growthRate = (1+0.06)**(1/12) - 1
df = pd.DataFrame(list(range(1,term*12+1)), columns=['t'])
df['Value_t_1'] = 0
df['Inflow1']=0
df['growth']=0
df['ValuePlusGrowth'] = 0
df['fee1']=0
df['fee2']=30
df['Value_t']=0
df.set_value(0, 'Inflow1', 10000)
for i in range(0,term*12):
df['Value_t_1'] = df['Value_t'].shift()
df['Value_t_1'].fillna(0,inplace=True)
df['growth'] = (df['Value_t_1'] + df['Inflow1'])*growthRate
df['ValuePlusGrowth'] = df['Value_t_1']+df['Inflow1']+df['growth']
df['fee1']=df['ValuePlusGrowth']*0.5/100
df['Value_t'] = df['ValuePlusGrowth'] - df['fee1'] - df['fee2']
return df
真正需要的唯一初始输入是
inflow
的初始值。其他所有操作都可以简化为基于行索引重复一定次数的操作。数据框中的一些列实际上只是常量。在下面是一个解决方案,它阐明了计算数据帧的每一行所需的操作:
现在只需设置初始值,实例化
^{pr2}$GrowthTracker
对象,update()
:我发现将这些都表示为一个类比较容易,但是只要在类之外定义变量,然后运行
update()
函数就足够简单了。在更新
以下是这个解决方案背后的更多解释:
初始数据帧
df
大部分是空的。唯一完全非零的列是t
,它从未使用过,和fee2
,它是一个常量(fee2 = 30
)。df
的其余部分以零值开始,除了Inflow1
中第一个单元格的一个例外,它的第一个值是10000
,其余的值都是零。在这意味着,就我们需要完成的计算而言,我们可以将“兴趣矩阵”限制为列}。在
Value_t_1
、growth
、ValuePlusGrowth
、fee1
、和{我们可以把第一个
Inflow1
值看作种子——其他的一切都只是对数字10000
执行的一系列操作。(事实上,我们实际上并不需要Inflow1
作为字段,因为它的所有其他值在整个计算过程中都保持为零。)在循环中,最初使用其他列的值更新列。这很有道理,也许我也会这么做的-看起来整洁高效。然而,回想一下,每个更新实际上只是一个数学字符串,它可以追溯到原来的
10000
。写出每个列更新的实际操作,而不是使用其他列名,显示了如何简化每个更新操作。在首先,一些速记符号:
我们从
t = 10000
开始。其他一切都是对t
的一些操作。在每个值都可以表示为我们需要将
t
乘以什么来获得所需的值(除了一个例外情况,我将在后面讨论)。例如:请记住,我们只需要放入种子值}的关系。在
t
一次,然后就只需对种子进行操作来填充所有df
。这意味着循环中的操作可以表示为“需要乘以t才能得到正确列值的项”。因此,尽管我们已经证明了t1 = 1 * t
,但考虑t1 = 1
对我们来说更有用——最终我们将用t
乘以这个等式的右边代表t1
与{然后:
下一步:
现在,对于每一行,我们对每一列都有一组更新操作
ops
。假设我们有上一行的t
,我们可以用以下内容填充每一行的值:我们仍然需要从
new_t
中减去fee2
,而这并不能很好地适用于到目前为止,一系列的乘法运算。但我们可以坚持矢量化公式并定义:在每个}向量,这实际上只是根据需要从}。在
new_row
之后,我们从new_row
向量中减去{new_t
中减去{此时,我们只需要一个以
t = 10000
开头的函数,在前面的每一行上继续执行new_row
公式,直到达到所需的迭代次数。我选择了一个递归策略来实现这一点,并在每个递归步骤将每个new_row
保存到一个数据帧中。在最后,由于我将
t = 10000
设置为t
,这意味着第一个t1
值不正确直接设置在10000
。在update()
函数的末尾,我们将第一个t1
值设置回0
。在相关问题 更多 >
编程相关推荐