首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免折旧变成负值?

如何避免折旧变成负值?
EN

Stack Overflow用户
提问于 2020-04-03 18:25:55
回答 2查看 47关注 0票数 0

我正在为我的论文做一个项目,这个项目与我拥有的一组公司的研发(R&D)费用的资本化有关。

对于那些不熟悉金融术语的人,我试图通过每段时间递减(或“折旧”)以下值来累积每年研发费用的价值。

我能够应用以下代码来获得操作的要点:

代码语言:javascript
复制
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%,上面的代码给出了以下结果:

代码语言:javascript
复制
        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:

代码语言:javascript
复制
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

关键问题出现在这里,因为上面的代码执行以下操作:

代码语言:javascript
复制
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

相反,一旦值达到零,它就应该丢弃这些值,就像这样:

代码语言:javascript
复制
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

提前感谢您提供的任何帮助,非常感谢:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-03 20:16:53

一种可能的方法是计算每项投资的残差部分。假设有一个有限的和已知的年数,在此之后,任何投资都会完全折旧。这里我将使用6年(5年就足够了,但它演示了如何避免负折旧):

代码语言:javascript
复制
# 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']

不出所料,它提供了:

代码语言:javascript
复制
   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
票数 1
EN

Stack Overflow用户

发布于 2020-04-03 21:30:57

你必须跟踪绝对折旧,并在资产价值达到零时停止折旧。请看下面的代码:

代码语言:javascript
复制
>>> 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)所做的事情。然后将所有资产的价值总和存储在资本充足率中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61009790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档