Skip to content

Commit f85de83

Browse files
committed
add finance module with net_present_value function
1 parent 5d0d9f7 commit f85de83

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

climada/util/finance.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"""
2+
Finance functionalities.
3+
"""
4+
import logging
5+
6+
LOGGER = logging.getLogger(__name__)
7+
8+
def net_present_value(years, disc_rates, val_years):
9+
"""Compute net present value.
10+
11+
Parameters:
12+
years (np.array): array with the sequence of years to consider.
13+
disc_rates (np.array): discount rate for every year in years.
14+
val_years (np.array): chash flow at each year.
15+
16+
Returns:
17+
float
18+
"""
19+
if years.size != disc_rates.size or years.size != val_years.size:
20+
LOGGER.error('Wrong input sizes %s, %s, %s.', years.size,
21+
disc_rates.size, val_years.size)
22+
raise ValueError
23+
24+
npv = val_years[-1]
25+
for val, disc in zip(val_years[-2::-1], disc_rates[-2::-1]):
26+
npv = val + npv/(1+disc)
27+
28+
return npv

climada/util/test/test_finance.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
"""
2+
Test of finance module
3+
"""
4+
import unittest
5+
import numpy as np
6+
7+
import climada.util.finance as u_fin
8+
9+
class TestNetpresValue(unittest.TestCase):
10+
"""Test date functions """
11+
def test_net_pres_val_pass(self):
12+
""" Test net_present_value against MATLAB reference"""
13+
years = np.arange(2018, 2041)
14+
disc_rates = np.ones(years.size)*0.02
15+
val_years = np.ones(years.size)*6.512201157564418e9
16+
res = u_fin.net_present_value(years, disc_rates, val_years)
17+
18+
self.assertEqual(1.215049630691397e+11, res)
19+
20+
# Execute Tests
21+
TESTS = unittest.TestLoader().loadTestsFromTestCase(TestNetpresValue)
22+
unittest.TextTestRunner(verbosity=2).run(TESTS)

0 commit comments

Comments
 (0)