Jump to content

Averages/Simple moving average: Difference between revisions

→‎{{header|Python}}: Add class-based solution and sample output.
(→‎{{header|Python}}: Add class-based solution and sample output.)
Line 829:
{{Works with|Python|3.x}}
 
===Procedural===
<lang python>from collections import deque
 
Line 845 ⟶ 846:
return summ / n
 
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]:
print ("\nSIMPLE MOVING AVERAGE (procedural): PERIOD =", 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):
print (" Next number = %-2g, SMA = %g " % (i, sma(i)))
Line 857 ⟶ 888:
print (" Next number = %-2g, SMA = %g " % (i, sma(i)))</lang>
 
'''Sample output'''
<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 = 2 , SMA = 1.5
Line 870 ⟶ 925:
Next number = 1 , SMA = 2
 
SIMPLE MOVING AVERAGE (class based): PERIOD = 5
Next number = 1 , SMA = 1
Next number = 2 , SMA = 1.5
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.