Source code for cashflows.depreciation

"""
Asset depreciation
===============================================================================

"""


from cashflows.gtimeseries import TimeSeries, cashflow, interest_rate, verify_eq_time_range





[docs]def depreciation_sl(costs, life, salvalue=None, delay=None, noprint=True): """Computes the depreciation of an asset using straight line depreciation method. Args: cost (TimeSeries): the cost per period of the assets. life (TimeSeries): number of depreciation periods for the asset. salvalue(TimeSeries): salvage value as a percentage of cost. noprint (bool): when True, the procedure prints a depreciation table. Returns: depreciation, accum_depreciation (TimeSeries, TimeSeries). **Examples.** >>> costs1 = cashflow(const_value=0, nper=16, spec=(0, 1000), pyr=4) >>> costs2 = cashflow(const_value=0, nper=16, spec=[(0, 1000), (8, 1000)], pyr=4) >>> life1 = cashflow(const_value=0, nper=16, spec=(0, 4), pyr=4) >>> life2 = cashflow(const_value=0, nper=16, spec=[(0, 4), (8, 4)], pyr=4) >>> delay12 = cashflow(const_value=0, nper=16, spec=(0, 2), pyr=4) >>> delay22 = cashflow(const_value=0, nper=16, spec=[(0, 2), (8, 2)], pyr=4) >>> depreciation_sl(costs=costs1, life=life1) # doctest: +NORMALIZE_WHITESPACE Qtr0 Qtr1 Qtr2 Qtr3 0 0.00 250.00 250.00 250.00 1 250.00 0.00 0.00 0.00 2 0.00 0.00 0.00 0.00 3 0.00 0.00 0.00 0.00 >>> depreciation_sl(costs=costs1, life=life1, delay=delay12) # doctest: +NORMALIZE_WHITESPACE Qtr0 Qtr1 Qtr2 Qtr3 0 0.00 0.00 0.00 250.00 1 250.00 250.00 250.00 0.00 2 0.00 0.00 0.00 0.00 3 0.00 0.00 0.00 0.00 >>> depreciation_sl(costs=costs2, life=life2) # doctest: +NORMALIZE_WHITESPACE Qtr0 Qtr1 Qtr2 Qtr3 0 0.00 250.00 250.00 250.00 1 250.00 0.00 0.00 0.00 2 0.00 250.00 250.00 250.00 3 250.00 0.00 0.00 0.00 >>> depreciation_sl(costs=costs2, life=life2, delay=delay22) # doctest: +NORMALIZE_WHITESPACE Qtr0 Qtr1 Qtr2 Qtr3 0 0.00 0.00 0.00 250.00 1 250.00 250.00 250.00 0.00 2 0.00 0.00 0.00 250.00 3 250.00 250.00 250.00 0.00 >>> depreciation_sl(costs=costs2, life=life2, delay=delay22, noprint=False) # doctest: +NORMALIZE_WHITESPACE t Beg. Cost Depre. Accum. End. Book Depre. Book Value Value ---------------------------------------------- (0, 0) 0.00 1000.00 0.00 0.00 1000.00 (0, 1) 1000.00 0.00 0.00 0.00 1000.00 (0, 2) 1000.00 0.00 0.00 0.00 1000.00 (0, 3) 1000.00 0.00 250.00 250.00 750.00 (1, 0) 750.00 0.00 250.00 500.00 500.00 (1, 1) 500.00 0.00 250.00 750.00 250.00 (1, 2) 250.00 0.00 250.00 1000.00 0.00 (1, 3) 0.00 0.00 0.00 1000.00 0.00 (2, 0) 0.00 1000.00 0.00 1000.00 1000.00 (2, 1) 1000.00 0.00 0.00 1000.00 1000.00 (2, 2) 1000.00 0.00 0.00 1000.00 1000.00 (2, 3) 1000.00 0.00 250.00 1250.00 750.00 (3, 0) 750.00 0.00 250.00 1500.00 500.00 (3, 1) 500.00 0.00 250.00 1750.00 250.00 (3, 2) 250.00 0.00 250.00 2000.00 0.00 (3, 3) 0.00 0.00 0.00 2000.00 0.00 """ verify_eq_time_range(costs, life) if salvalue is not None: verify_eq_time_range(costs, salvalue) else: salvalue = [0] * len(costs) if delay is not None: verify_eq_time_range(costs, delay) else: delay = [0] * len(costs) depr = [0] * len(costs) adepr = [0] * len(costs) begbook = [0] * len(costs) endbook = [0] * len(costs) for index, _ in enumerate(costs): if costs[index] == 0: continue if delay[index] == 0: ValueError('Depreciation with delay 0') xdepr = [(costs[index] * (100 - salvalue[index]) / 100) / life[index]] * life[index] for time in range(life[index]): if index + time + delay[index] + 1 < len(costs): depr[index + time + delay[index] + 1] += xdepr[time] else: break for time, _ in enumerate(depr): if time > 0: adepr[time] = adepr[time - 1] + depr[time] else: adepr[time] = depr[time] for time, _ in enumerate(depr): if time > 0: begbook[time] = endbook[time - 1] endbook[time] = begbook[time] - depr[time] + costs[time] if noprint is True: retval = costs.copy() for index, _ in enumerate(costs): retval[index] = depr[index] return retval print_depr(depr, adepr, costs, begbook, endbook)
[docs]def depreciation_soyd(costs, life, salvalue=None, delay=None, noprint=True): """Computes the depreciation of an asset using the sum-of-year's-digits method. Args: cost (TimeSeries): the cost per period of the assets. life (TimeSeries): number of depreciation periods for the asset. salvalue(TimeSeries): salvage value as a percentage of cost. noprint (bool): when True, the procedure prints a depreciation table. Returns: A tuple (dep, accum) of lists (tuple): depreciation per period and accumulated depreciation per period **Examples.** >>> costs1 = cashflow(const_value=0, nper=16, spec=(0, 1000), pyr=4) >>> costs2 = cashflow(const_value=0, nper=16, spec=[(0, 1000), (8, 1000)], pyr=4) >>> life1 = cashflow(const_value=0, nper=16, spec=(0, 4), pyr=4) >>> life2 = cashflow(const_value=0, nper=16, spec=[(0, 4), (8, 4)], pyr=4) >>> delay12 = cashflow(const_value=0, nper=16, spec=(0, 2), pyr=4) >>> delay22 = cashflow(const_value=0, nper=16, spec=[(0, 2), (8, 2)], pyr=4) >>> depreciation_soyd(costs=costs1, life=life1) # doctest: +NORMALIZE_WHITESPACE Qtr0 Qtr1 Qtr2 Qtr3 0 0.00 400.00 300.00 200.00 1 100.00 0.00 0.00 0.00 2 0.00 0.00 0.00 0.00 3 0.00 0.00 0.00 0.00 >>> depreciation_soyd(costs=costs1, life=life1, delay=delay12) # doctest: +NORMALIZE_WHITESPACE Qtr0 Qtr1 Qtr2 Qtr3 0 0.00 0.00 0.00 400.00 1 300.00 200.00 100.00 0.00 2 0.00 0.00 0.00 0.00 3 0.00 0.00 0.00 0.00 >>> depreciation_soyd(costs=costs2, life=life2) # doctest: +NORMALIZE_WHITESPACE Qtr0 Qtr1 Qtr2 Qtr3 0 0.00 400.00 300.00 200.00 1 100.00 0.00 0.00 0.00 2 0.00 400.00 300.00 200.00 3 100.00 0.00 0.00 0.00 >>> depreciation_soyd(costs=costs2, life=life2, delay=delay22) # doctest: +NORMALIZE_WHITESPACE Qtr0 Qtr1 Qtr2 Qtr3 0 0.00 0.00 0.00 400.00 1 300.00 200.00 100.00 0.00 2 0.00 0.00 0.00 400.00 3 300.00 200.00 100.00 0.00 >>> depreciation_soyd(costs=costs2, life=life2, delay=delay22, noprint=False) # doctest: +NORMALIZE_WHITESPACE t Beg. Cost Depre. Accum. End. Book Depre. Book Value Value ---------------------------------------------- (0, 0) 0.00 1000.00 0.00 0.00 1000.00 (0, 1) 1000.00 0.00 0.00 0.00 1000.00 (0, 2) 1000.00 0.00 0.00 0.00 1000.00 (0, 3) 1000.00 0.00 400.00 400.00 600.00 (1, 0) 600.00 0.00 300.00 700.00 300.00 (1, 1) 300.00 0.00 200.00 900.00 100.00 (1, 2) 100.00 0.00 100.00 1000.00 0.00 (1, 3) 0.00 0.00 0.00 1000.00 0.00 (2, 0) 0.00 1000.00 0.00 1000.00 1000.00 (2, 1) 1000.00 0.00 0.00 1000.00 1000.00 (2, 2) 1000.00 0.00 0.00 1000.00 1000.00 (2, 3) 1000.00 0.00 400.00 1400.00 600.00 (3, 0) 600.00 0.00 300.00 1700.00 300.00 (3, 1) 300.00 0.00 200.00 1900.00 100.00 (3, 2) 100.00 0.00 100.00 2000.00 0.00 (3, 3) 0.00 0.00 0.00 2000.00 0.00 """ verify_eq_time_range(costs, life) if salvalue is not None: verify_eq_time_range(costs, salvalue) else: salvalue = [0] * len(costs) if delay is not None: verify_eq_time_range(costs, delay) else: delay = [0] * len(costs) depr = [0] * len(costs) adepr = [0] * len(costs) begbook = [0] * len(costs) endbook = [0] * len(costs) for index, _ in enumerate(costs): sumdig = life[index] * (life[index] + 1) / 2 xdepr = [(costs[index] * (100 - salvalue[index]) / 100) * (life[index] - time) / sumdig for time in range(life[index])] for time in range(life[index]): if index + time + delay[index] + 1 < len(costs): depr[index + time + delay[index] + 1] += xdepr[time] else: break for time, _ in enumerate(depr): if time > 0: adepr[time] = adepr[time - 1] + depr[time] else: adepr[time] = depr[time] for time, _ in enumerate(depr): if time > 0: begbook[time] = endbook[time - 1] endbook[time] = begbook[time] - depr[time] + costs[time] if noprint is True: retval = costs.copy() for index, _ in enumerate(costs): retval[index] = depr[index] return retval print_depr(depr, adepr, costs, begbook, endbook)
[docs]def depreciation_db(costs, life, salvalue=None, factor=1, convert_to_sl=True, delay=None, noprint=True): """Computes the depreciation of an asset using the declining balance method. Args: cost (TimeSeries): the cost per period of the assets. life (TimeSeries): number of depreciation periods for the asset. salvalue(TimeSeries): salvage value as a percentage of cost. factor (float): acelerating factor for depreciation. convert_to_sl (bool): converts to straight line method? noprint (bool): when True, the procedure prints a depreciation table. Returns: A tuple (dep, accum) of lists (tuple): depreciation per period and accumulated depreciation per period **Examples.** >>> costs1 = cashflow(const_value=0, nper=16, spec=(0, 1000), pyr=4) >>> costs2 = cashflow(const_value=0, nper=16, spec=[(0, 1000), (8, 1000)], pyr=4) >>> life1 = cashflow(const_value=0, nper=16, spec=(0, 4), pyr=4) >>> life2 = cashflow(const_value=0, nper=16, spec=[(0, 4), (8, 4)], pyr=4) >>> delay12 = cashflow(const_value=0, nper=16, spec=(0, 2), pyr=4) >>> delay22 = cashflow(const_value=0, nper=16, spec=[(0, 2), (8, 2)], pyr=4) >>> depreciation_db(costs=costs1, life=life1, factor=1.5, convert_to_sl=False) # doctest: +NORMALIZE_WHITESPACE Qtr0 Qtr1 Qtr2 Qtr3 0 0.00 375.00 234.38 146.48 1 91.55 0.00 0.00 0.00 2 0.00 0.00 0.00 0.00 3 0.00 0.00 0.00 0.00 >>> depreciation_db(costs=costs1, life=life1, factor=1.5, convert_to_sl=False, noprint=False) # doctest: +NORMALIZE_WHITESPACE t Beg. Cost Depre. Accum. End. Book Depre. Book Value Value ---------------------------------------------- (0, 0) 0.00 1000.00 0.00 0.00 1000.00 (0, 1) 1000.00 0.00 375.00 375.00 625.00 (0, 2) 625.00 0.00 234.38 609.38 390.62 (0, 3) 390.62 0.00 146.48 755.86 244.14 (1, 0) 244.14 0.00 91.55 847.41 152.59 (1, 1) 152.59 0.00 0.00 847.41 152.59 (1, 2) 152.59 0.00 0.00 847.41 152.59 (1, 3) 152.59 0.00 0.00 847.41 152.59 (2, 0) 152.59 0.00 0.00 847.41 152.59 (2, 1) 152.59 0.00 0.00 847.41 152.59 (2, 2) 152.59 0.00 0.00 847.41 152.59 (2, 3) 152.59 0.00 0.00 847.41 152.59 (3, 0) 152.59 0.00 0.00 847.41 152.59 (3, 1) 152.59 0.00 0.00 847.41 152.59 (3, 2) 152.59 0.00 0.00 847.41 152.59 (3, 3) 152.59 0.00 0.00 847.41 152.59 >>> depreciation_db(costs=costs1, life=life1, delay=delay12, factor=1.5, convert_to_sl=False) # doctest: +NORMALIZE_WHITESPACE Qtr0 Qtr1 Qtr2 Qtr3 0 0.00 0.00 0.00 375.00 1 234.38 146.48 91.55 0.00 2 0.00 0.00 0.00 0.00 3 0.00 0.00 0.00 0.00 >>> depreciation_db(costs=costs2, life=life2, factor=1.5, convert_to_sl=False) # doctest: +NORMALIZE_WHITESPACE Qtr0 Qtr1 Qtr2 Qtr3 0 0.00 375.00 234.38 146.48 1 91.55 0.00 0.00 0.00 2 0.00 375.00 234.38 146.48 3 91.55 0.00 0.00 0.00 >>> depreciation_db(costs=costs2, life=life2, delay=delay22, factor=1.5, convert_to_sl=False) # doctest: +NORMALIZE_WHITESPACE Qtr0 Qtr1 Qtr2 Qtr3 0 0.00 0.00 0.00 375.00 1 234.38 146.48 91.55 0.00 2 0.00 0.00 0.00 375.00 3 234.38 146.48 91.55 0.00 >>> depreciation_db(costs=costs2, life=life2, delay=delay22, factor=1.5, convert_to_sl=False, noprint=False) # doctest: +NORMALIZE_WHITESPACE t Beg. Cost Depre. Accum. End. Book Depre. Book Value Value ---------------------------------------------- (0, 0) 0.00 1000.00 0.00 0.00 1000.00 (0, 1) 1000.00 0.00 0.00 0.00 1000.00 (0, 2) 1000.00 0.00 0.00 0.00 1000.00 (0, 3) 1000.00 0.00 375.00 375.00 625.00 (1, 0) 625.00 0.00 234.38 609.38 390.62 (1, 1) 390.62 0.00 146.48 755.86 244.14 (1, 2) 244.14 0.00 91.55 847.41 152.59 (1, 3) 152.59 0.00 0.00 847.41 152.59 (2, 0) 152.59 1000.00 0.00 847.41 1152.59 (2, 1) 1152.59 0.00 0.00 847.41 1152.59 (2, 2) 1152.59 0.00 0.00 847.41 1152.59 (2, 3) 1152.59 0.00 375.00 1222.41 777.59 (3, 0) 777.59 0.00 234.38 1456.79 543.21 (3, 1) 543.21 0.00 146.48 1603.27 396.73 (3, 2) 396.73 0.00 91.55 1694.82 305.18 (3, 3) 305.18 0.00 0.00 1694.82 305.18 """ verify_eq_time_range(costs, life) if salvalue is not None: verify_eq_time_range(costs, salvalue) else: salvalue = [0] * len(costs) if delay is not None: verify_eq_time_range(costs, delay) else: delay = [0] * len(costs) if not isinstance(factor, (int, float)): raise TypeError('Invalid type for `factor`') if not isinstance(convert_to_sl, bool): raise TypeError('Invalid type for `convert_to_sl`') depr = [0] * len(costs) adepr = [0] * len(costs) begbook = [0] * len(costs) endbook = [0] * len(costs) for index, _ in enumerate(costs): if costs[index] == 0: continue xfactor = factor / life[index] rem_cost = costs[index] xdepr = [0] * life[index] sl_depr = (costs[index] - salvalue[index]) / life[index] for time in range(life[index]): xdepr[time] = rem_cost * xfactor if convert_to_sl is True and xdepr[time] < sl_depr: xdepr[time] = sl_depr rem_cost -= xdepr[time] if rem_cost < salvalue[index]: rem_cost += xdepr[time] xdepr[time] = rem_cost - salvalue[index] rem_cost = salvalue[index] for time in range(life[index]): if index + time + delay[index] + 1 < len(costs): depr[index + time + delay[index] + 1] += xdepr[time] else: break for time, _ in enumerate(depr): if time > 0: adepr[time] = adepr[time - 1] + depr[time] else: adepr[time] = depr[time] for time, _ in enumerate(depr): if time > 0: begbook[time] = endbook[time - 1] endbook[time] = begbook[time] - depr[time] + costs[time] if noprint is True: retval = costs.copy() for index, _ in enumerate(costs): retval[index] = depr[index] return retval print_depr(depr, adepr, costs, begbook, endbook)
if __name__ == "__main__": import doctest doctest.testmod()