Averages/Simple moving average: Difference between revisions

Content added Content deleted
(→‎{{header|Python}}: Add class-based solution and sample output.)
Line 829: Line 829:
{{Works with|Python|3.x}}
{{Works with|Python|3.x}}


===Procedural===
<lang python>from collections import deque
<lang python>from collections import deque


Line 845: Line 846:
return summ / n
return summ / n


return sma
return sma</lang>


===Class based===
<lang python>from collections import deque


class Simplemovingaverage():
if __name__ == '__main__':
def __init__(self, period):
assert period == int(period) and period > 0, "Period must be an integer >0"
self.period = period
self.stream = deque()
def __call__(self, n):
stream = self.stream
stream.append(n) # appends on the right
streamlength = len(stream)
if streamlength > self.period:
stream.popleft()
streamlength -= 1
if streamlength == 0:
average = 0
else:
average = sum( stream ) / streamlength

return average</lang>

'''Tests'''
<lang python>if __name__ == '__main__':
for period in [3, 5]:
for period in [3, 5]:
print ("\nSIMPLE MOVING AVERAGE: PERIOD =", period)
print ("\nSIMPLE MOVING AVERAGE (procedural): PERIOD =", period)
sma = simplemovingaverage(period)
sma = simplemovingaverage(period)
for i in range(1,6):
print (" Next number = %-2g, SMA = %g " % (i, sma(i)))
for i in range(5, 0, -1):
print (" Next number = %-2g, SMA = %g " % (i, sma(i)))
for period in [3, 5]:
print ("\nSIMPLE MOVING AVERAGE (class based): PERIOD =", period)
sma = Simplemovingaverage(period)
for i in range(1,6):
for i in range(1,6):
print (" Next number = %-2g, SMA = %g " % (i, sma(i)))
print (" Next number = %-2g, SMA = %g " % (i, sma(i)))
Line 857: Line 888:
print (" Next number = %-2g, SMA = %g " % (i, sma(i)))</lang>
print (" Next number = %-2g, SMA = %g " % (i, sma(i)))</lang>


Sample output
'''Sample output'''
<pre>SIMPLE MOVING AVERAGE: PERIOD = 3
<pre>SIMPLE MOVING AVERAGE (procedural): PERIOD = 3
Next number = 1 , SMA = 1
Next number = 2 , SMA = 1.5
Next number = 3 , SMA = 2
Next number = 4 , SMA = 3
Next number = 5 , SMA = 4
Next number = 5 , SMA = 4.66667
Next number = 4 , SMA = 4.66667
Next number = 3 , SMA = 4
Next number = 2 , SMA = 3
Next number = 1 , SMA = 2

SIMPLE MOVING AVERAGE (procedural): PERIOD = 5
Next number = 1 , SMA = 1
Next number = 2 , SMA = 1.5
Next number = 3 , SMA = 2
Next number = 4 , SMA = 2.5
Next number = 5 , SMA = 3
Next number = 5 , SMA = 3.8
Next number = 4 , SMA = 4.2
Next number = 3 , SMA = 4.2
Next number = 2 , SMA = 3.8
Next number = 1 , SMA = 3

SIMPLE MOVING AVERAGE (class based): PERIOD = 3
Next number = 1 , SMA = 1
Next number = 1 , SMA = 1
Next number = 2 , SMA = 1.5
Next number = 2 , SMA = 1.5
Line 870: Line 925:
Next number = 1 , SMA = 2
Next number = 1 , SMA = 2


SIMPLE MOVING AVERAGE: PERIOD = 5
SIMPLE MOVING AVERAGE (class based): PERIOD = 5
Next number = 1 , SMA = 1
Next number = 1 , SMA = 1
Next number = 2 , SMA = 1.5
Next number = 2 , SMA = 1.5