hjstern
hjstern

Reputation: 117

Calculate all compound growth rates from a list of values

I have a list of growth rates and would like to calculate all available compounded growth rates:

l = [0.3, 0.2, 0.1]

Output (as a list):

o = [0.56, 0.716]

calculation detail about the compounded growth rates:

0.56 = (1 + 0.3) * (1 + 0.2) - 1

0.716 = (1 + 0.3) * (1 + 0.2) * (1 + 0.1) - 1

The function should be flexible to the length of the input list.

Upvotes: 1

Views: 171

Answers (1)

unutbu
unutbu

Reputation: 879591

You could express the computation with list comprehensions / generator expressions and using itertools.accumulate to handle the compounding:

import itertools as IT
import operator

def compound_growth_rates(l):
    result = [xy-1 for xy in 
              IT.islice(IT.accumulate((1+x for x in l), operator.mul), 1, None)]
    return result

l = [0.3, 0.2, 0.1]
print(compound_growth_rates(l))

prints

[0.56, 0.7160000000000002]

Or, equivalently, you could write this with list-comprehensions and a for-loop:

def compound_growth_rates(l):
    add_one = [1+x for x in l]
    products = [add_one[0]]
    for x1 in add_one[1:]:
        products.append(x1*products[-1])
    result = [p-1 for p in products[1:]]
    return result

I think the advantage of using itertools.accumulate is that it expresses the intent of the code better than the for-loop. But the for-loop may be more readable in the sense that it uses more commonly known syntax.

Upvotes: 2

Related Questions