11"""
2- Calculates exponential moving average (EMA) on the series of numbers
2+ Calculate the exponential moving average (EMA) on the series of numbers.
33 Wikipedia Reference: https://en.wikipedia.org/wiki/Exponential_smoothing
4- Reference: https://www.investopedia.com/terms/e/ema.asp#toc-what-is-an-exponential-moving-average-ema
4+ https://www.investopedia.com/terms/e/ema.asp#toc-what-is-an-exponential
5+ -moving-average-ema
56
67 Exponential moving average is used in finance to analyze changes stock prices.
78 EMA is used in conjunction with Simple moving average (SMA), EMA reacts to the
1213
1314
1415def exponential_moving_average (
15- series_generator : Iterator [float ], window_size : int
16+ series : Iterator [float ], window_size : int
1617) -> Iterator [float ]:
1718 """
1819 Returns the generator which generates exponential moving average of the given
19- series generator
20- >>> list(exponential_moving_average((ele for ele in [2, 5, 3, 8.2, 6, 9, 10]), 3))
20+ series
21+ >>> list(exponential_moving_average(iter( [2, 5, 3, 8.2, 6, 9, 10]), 3))
2122 [2.0, 3.5, 3.25, 5.725, 5.8625, 7.43125, 8.715625]
2223
23- :param series_generator : Generator which generates numbers
24+ :param series : Generator which generates numbers
2425 :param window_size: Window size for calculating average (window_size > 0)
2526 :return: Returns generator of which returns exponentially averaged numbers
2627
2728 Formula:
2829
2930 st = alpha * xt + (1 - alpha) * st_prev
30- alpha = 2/(1 + window_size) - smoothing factor
31+
32+ Where,
33+ st : Exponential moving average at timestamp t
34+ xt : Datapoint in series at timestamp t
35+ st_prev : Exponential moving average at timestamp t-1
36+ alpha : 2/(1 + window_size) - smoothing factor
3137
3238 Exponential moving average (EMA) is a rule of thumb technique for
3339 smoothing time series data using the exponential window function.
@@ -40,22 +46,28 @@ def exponential_moving_average(
4046 alpha = 2 / (1 + window_size )
4147
4248 # Defining timestamp t
43- t = 0
49+ timestamp = 0
4450
4551 # Exponential average at timestamp t
46- st = 0.0
52+ exponential_average = 0.0
4753
48- for xt in series_generator :
49- if t <= window_size :
54+ for datapoint in series :
55+ if timestamp <= window_size :
5056 # Assigning simple moving average till the window_size for the first time
5157 # is reached
52- st = float (xt ) if t == 0 else (st + xt ) * 0.5
58+ exponential_average = (
59+ float (datapoint )
60+ if timestamp == 0
61+ else (exponential_average + datapoint ) * 0.5
62+ )
5363 else :
5464 # Calculating exponential moving average based on current timestamp data
5565 # point and previous exponential average value
56- st = (alpha * xt ) + ((1 - alpha ) * st )
57- t += 1
58- yield st
66+ exponential_average = (alpha * datapoint ) + (
67+ (1 - alpha ) * exponential_average
68+ )
69+ timestamp += 1
70+ yield exponential_average
5971
6072
6173if __name__ == "__main__" :
@@ -64,9 +76,10 @@ def exponential_moving_average(
6476 doctest .testmod ()
6577
6678 test_series = [2 , 5 , 3 , 8.2 , 6 , 9 , 10 ]
67- test_generator = (ele for ele in test_series )
6879 test_window_size = 3
69- result = exponential_moving_average (test_generator , test_window_size )
80+ result = exponential_moving_average (
81+ series = iter (test_series ), window_size = test_window_size
82+ )
7083 print ("Test series: " , test_series )
7184 print ("Window size: " , test_window_size )
7285 print ("Result: " , list (result ))
0 commit comments