Moving Average Of 3 Elements By C Or Python
I want to calculate the moving average of 3 elements. For example, I have a 25 elements of sales data. I need to calculate the moving average taken from averaging these 25 element
Solution 1:
The best (and fastest, by far) way to approach this is convolution. Using numpy's convolve:
import numpy as np
x = np.asarray([7.0, 9.0, 5.0, 1.0, 3.0])
# create what's known as the convolution 'kernel'# note that this sums to 1, which results in an average
kernel = np.ones(3) / 3# do the convolution to compute the moving average
moving_avg = np.convolve(x, kernel, mode='valid')
You can view the convolution operation as the kernel "sliding" over the data sequence. Every point moving_avg[k]
in the output of the convolution will be the area under the product between your data and the kernel, when the kernel is centered at that point k
.
This is an animation (from the wikipedia article linked above) illustrating the principle for the square kernel used in moving average computation:
Solution 2:
A list comprehension is a pythonic way to do this, that does not require any import:
>>> a[7, 9, 5, 1, 3]
>>> [(a[i]+a[i+1]+a[i+2])/3.0 for i in xrange(len(a)-2)]
[7.0, 5.0, 3.0]
Solution 3:
You could use a Python deque
for doing this as follows:
from collections import deque
prices = [7.0, 9.0, 5.0, 1.0, 3.0]
moving_average = deque()
total = 0.0
days = 3
averages = []
for price in prices:
moving_average.append(price)
total += price
iflen(moving_average) > days: # Length of moving average
total -= moving_average.popleft()
averages.append(total / float(len(moving_average)))
print averages
This would display the following output:
[7.0, 8.0, 7.0, 5.0, 3.0]
Or you could skip the initial entries as follows:
print averages[days-1:]
Giving:
[7.0, 5.0, 3.0]
Post a Comment for "Moving Average Of 3 Elements By C Or Python"