如何避免折旧变为负值?
How to avoid that depreciation goes negative?
我正在为我的论文做一个项目,它与我拥有的一组公司的研发 (R&D) 费用的资本化有关。
对于那些不熟悉财务术语的人,我试图通过每个时间段的衰减值(或"depreciating"它)将每年的研发费用的值与以下值累加。
我能够应用以下代码来了解操作的要点:
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)]
但是,这种方法有一个很大的缺陷,那就是一旦价值达到零,它就会继续带走折旧率,因此进入负值区域。
例如,如果我们有 Apple 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
预先感谢您提供的任何帮助,非常感谢:)
一种可能的方法是计算每项投资的剩余部分。假设在有限且已知的年数之后,任何投资都将完全折旧。在这里我将使用 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
您必须跟踪绝对折旧并在资产达到零值时停止折旧。看下面的代码:
>>> 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 中)。当它达到零时,我就停止贬值。这就是语句 x[j] = max(x[j], 0) 所做的。然后将所有资产的价值总和存储在 cap[i].
我正在为我的论文做一个项目,它与我拥有的一组公司的研发 (R&D) 费用的资本化有关。
对于那些不熟悉财务术语的人,我试图通过每个时间段的衰减值(或"depreciating"它)将每年的研发费用的值与以下值累加。
我能够应用以下代码来了解操作的要点:
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)]
但是,这种方法有一个很大的缺陷,那就是一旦价值达到零,它就会继续带走折旧率,因此进入负值区域。
例如,如果我们有 Apple 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
预先感谢您提供的任何帮助,非常感谢:)
一种可能的方法是计算每项投资的剩余部分。假设在有限且已知的年数之后,任何投资都将完全折旧。在这里我将使用 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
您必须跟踪绝对折旧并在资产达到零值时停止折旧。看下面的代码:
>>> 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 中)。当它达到零时,我就停止贬值。这就是语句 x[j] = max(x[j], 0) 所做的。然后将所有资产的价值总和存储在 cap[i].