# Moving average of a data series

How can I rework the code up that ema(x, 5) returns the data now in emaout? I'm trying to enclose everything in one def.

Right now its in a for loop and a def.

x = [32.47, 32.70, 32.77, 33.11, 33.25, 33.23, 33.23, 33.0, 33.04, 33.21]

def ema(series, period, prevma):
smoothing = 2.0 / (period + 1.0)
return prevma + smoothing * (series[bar] - prevma)

prevema = x[0]
emaout =[]

for bar, close in enumerate(x):
curema = ema(x, 5, prevema)
prevema = curema
emaout.append(curema)

print
print emaout


x could be a NumPy array.

1. ema uses series in one place, where it references series[bar]. But bar is a global variable which is frowned upon. Let's pass series[bar] instead of series to ema.
2. That would be series[bar] in the for loop, but series[bar] is the same thing as close, so let's pass that instead.
3. ema's period is only used to calculate smoothing. Let's calculate smoothing outside and pass it in.
4. But now ema's a single line, so let's inline it
5. Let's put all of that logic inside a function
6. We use enumerate in the for loop, but we don't use bar

Result:

x = [32.47, 32.70, 32.77, 33.11, 33.25, 33.23, 33.23, 33.0, 33.04, 33.21]

def function(x, period):
prevema = x[0]
emaout =[]

smoothing = 2.0 / (period + 1.0)
for close in x:
curema = prevma + smoothing * (close - prevma)
prevema = curema
emaout.append(curema)

return prevema
print
print function(x, 5)


We can better by using numpy.

def function(x, period):
smoothing = 2.0 / (period + 1.0)
current = numpy.array(x) # take the current value as a numpy array

previous = numpy.roll(x,1) # create a new array with all the values shifted forward

• @merlin, numpy.roll([1,2,3,4], 1) == numpy.array(4,1,2,3) It shifts all of the elements in the array by one. That way when I subtract the original and rolled arrays I get the difference from one to the next. – Winston Ewert Sep 11 '11 at 18:15