Skip to content

Commit 699b4eb

Browse files
committed
Add moving average algorithm for sliding window data analysis
1 parent 02680c9 commit 699b4eb

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
"""
2+
Moving Average: Given a stream of integers and a window size k, calculate the
3+
moving average of all integers in the sliding window.
4+
5+
The moving average is the average of the last k elements in the stream.
6+
It is widely used in data analysis, finance, and signal processing to smooth
7+
out short-term fluctuations and highlight longer-term trends.
8+
9+
Reference: https://en.wikipedia.org/wiki/Moving_average
10+
"""
11+
12+
13+
def moving_average(data: list[float], window_size: int) -> list[float]:
14+
"""
15+
Calculate the moving average of a list of numbers given a window size.
16+
17+
Parameters
18+
----------
19+
data: list[float], the input list of numbers
20+
window_size: int, the size of the sliding window
21+
22+
Returns
23+
-------
24+
list[float]: list of moving averages for each window position
25+
26+
>>> moving_average([1, 2, 3, 4, 5], 3)
27+
[2.0, 3.0, 4.0]
28+
>>> moving_average([10, 20, 30, 40, 50], 2)
29+
[15.0, 25.0, 35.0, 45.0]
30+
>>> moving_average([5], 1)
31+
[5.0]
32+
>>> moving_average([1, 2, 3], 1)
33+
[1.0, 2.0, 3.0]
34+
>>> moving_average([1, 2, 3], 3)
35+
[2.0]
36+
>>> moving_average([], 3)
37+
Traceback (most recent call last):
38+
...
39+
ValueError: data cannot be empty
40+
>>> moving_average([1, 2, 3], 0)
41+
Traceback (most recent call last):
42+
...
43+
ValueError: window_size must be a positive integer
44+
>>> moving_average([1, 2, 3], 5)
45+
Traceback (most recent call last):
46+
...
47+
ValueError: window_size cannot be greater than the length of data
48+
"""
49+
if not data:
50+
raise ValueError("data cannot be empty")
51+
if window_size <= 0:
52+
raise ValueError("window_size must be a positive integer")
53+
if window_size > len(data):
54+
raise ValueError("window_size cannot be greater than the length of data")
55+
56+
result = []
57+
window_sum = sum(data[:window_size])
58+
result.append(window_sum / window_size)
59+
60+
for i in range(window_size, len(data)):
61+
window_sum += data[i] - data[i - window_size]
62+
result.append(window_sum / window_size)
63+
64+
return result
65+
66+
67+
if __name__ == "__main__":
68+
import doctest
69+
70+
doctest.testmod()
71+
72+
data = [10, 20, 30, 40, 50, 60, 70]
73+
window = 3
74+
print(f"Data: {data}")
75+
print(f"Window size: {window}")
76+
print(f"Moving averages: {moving_average(data, window)}")

0 commit comments

Comments
 (0)