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(): |
|||
⚫ | |||
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''' |
|||
⚫ | |||
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 |