我正在为我的论文做一个项目,这个项目与我拥有的一组公司的研发(R&D)费用的资本化有关。
对于那些不熟悉金融术语的人,我试图通过每段时间递减(或“折旧”)以下值来累积每年研发费用的价值。
我能够应用以下代码来获得操作的要点:
df['rd_capital'] = [(df['r&d_exp'].iloc[:i] * (1 - df['dep_rate'].iloc[:i]*np.arange(i)[::-1])).sum() for i in range(1,len(df)+1)]然而,这种方法有一个重大缺陷,那就是一旦价值达到零,它就会继续减去折旧率,因此进入负值区域。
例如,如果我们有5年的苹果研发费用,折旧率为20%,上面的代码给出了以下结果:
year r&d_exp dep_rate r&d_capital
0 1999 10 0.2 10
1 2000 8 0.2 16
2 2001 12 0.2 24.4
3 2002 7 0.2 25.4
4 2003 15 0.2 33
5 2004 8 0.2 30.6
6 2005 11 0.2 29.6但是,2005年的值是错误的,因为它应该是31.6!
如果不清楚,则通过以下方式检索r&d_capital:
2000 = 10*(1-0.2) + 8
2001 = 10*(1-0.4) + 8*(1-0.2) + 12
2002 = 10*(1-0.6) + 8*(1-0.4) + 12*(1-0.2) + 7
2003 = 10*(1-0.8) + 8*(1-0.6) + 12*(1-0.4) + 7*(1-0.2) + 15关键问题出现在这里,因为上面的代码执行以下操作:
2004 = 10*(1-1) + 8*(1-0.8) + 12*(1-0.6) + 7*(1-0.4) + 15*(1-0.2) + 8
2005 = 10*(1-1.2) + 8*(1-1) + 12*(1-0.8) + 7*(1-0.6) + 15*(1-0.4) + 8*(0.2) + 11相反,一旦值达到零,它就应该丢弃这些值,就像这样:
2004 = 8*(1-0.8) + 12*(1-0.6) + 7*(1-0.4) + 15*(1-0.2) + 8
2005 = 12*(1-0.8) + 7*(1-0.6) + 15*(1-0.4) + 8*(0.2) + 11提前感谢您提供的任何帮助,非常感谢:)
发布于 2020-04-03 20:16:53
一种可能的方法是计算每项投资的残差部分。假设有一个有限的和已知的年数,在此之后,任何投资都会完全折旧。这里我将使用6年(5年就足够了,但它演示了如何避免负折旧):
# cumulated depreciation rates:
cum_rate = pd.DataFrame(index = df.index)
for i in range(2, 7):
cum_rate['cum_rate' + str(i)] = df['dep_rate'].rolling(i).sum().shift(1 - i)
cum_rate['cum_rate1'] = df['dep_rate']
cum_rate[cum_rate > 1] = 1 # avoid negative rates
# residual values
resid = pd.DataFrame(index = df.index)
for i in range(1, 7):
resid['r' + str(i)] = (df['r&d_exp'] * (1 - cum_rate['cum_rate' + str(i)])
).shift(i)
# compute the capital
df['r&d_capital'] = resid.apply('sum', axis=1) + df['r&d_exp']不出所料,它提供了:
year r&d_exp dep_rate r&d_capital
0 1999 10 0.2 10.0
1 2000 8 0.2 16.0
2 2001 12 0.2 24.4
3 2002 7 0.2 25.4
4 2003 15 0.2 33.0
5 2004 8 0.2 30.6
6 2005 11 0.2 31.6发布于 2020-04-03 21:30:57
你必须跟踪绝对折旧,并在资产价值达到零时停止折旧。请看下面的代码:
>>> exp = [10, 8, 12, 7, 15, 8, 11]
>>> dep = [0.2*x for x in exp]
>>> cap = [0]*7
>>> for i in range(7):
... x = exp[:i+1]
... for j in range(i):
... x[j] -=(i-j)*dep[j]
... x[j] = max(x[j], 0)
... cap[i] = sum(x)
...
>>> cap
[10, 16.0, 24.4, 25.4, 33.0, 30.599999999999998, 31.6]
>>> 在for循环中,我每年计算所有资产的剩余值(在变量x中)。当这个值达到零时,我就会停止折旧。这就是语句xj = max(xj,0)所做的事情。然后将所有资产的价值总和存储在资本充足率中。
https://stackoverflow.com/questions/61009790
复制相似问题