time series calculation in list comprehension?
Lonnie Princehouse
finite.automaton at gmail.com
Fri Mar 10 21:35:50 CET 2006
Well, you could iterate over an index into the list:
from __future__ import division
def moving_average(sequence, n):
return [sum(sequence[i:i+n])/n for i in
xrange(len(sequence)-n+1)]
Of course, that's hardly efficient. You really want to use the value
calculated for the i_th term in the (i+1)th term's evaluation. While
it's not easy (or pretty) to store state between iterations in a list
comprehension, this is the perfect use for a generator:
def generator_to_list(f):
return lambda *args,**keywords: list(f(*args,**keywords))
@generator_to_list
def moving_average(sequence, n):
assert len(sequence) >= n and n > 0
average = sum(sequence[:n]) / n
yield average
for i in xrange(1, len(sequence)-n+1):
average += (sequence[i+n-1] - sequence[i-1]) / n
yield average
More information about the Python-list
mailing list