Moving averages help smooth out data to see trends better. They reduce noise from random ups and downs.
Moving averages in ML Python
Start learning this pattern below
Jump into concepts and practice - no test required
or
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
Syntax
ML Python
def moving_average(data, window_size): return [sum(data[i:i+window_size]) / window_size for i in range(len(data) - window_size + 1)]
The window_size is how many data points you average at once.
The output list is shorter than the input because the window slides over the data.
Examples
ML Python
data = [1, 2, 3, 4, 5] window_size = 3 averages = moving_average(data, window_size) print(averages)
ML Python
data = [10, 20, 30, 40, 50, 60] window_size = 2 averages = moving_average(data, window_size) print(averages)
Sample Model
This program smooths daily temperature data using a moving average with a window size of 3.
ML Python
def moving_average(data, window_size): return [sum(data[i:i+window_size]) / window_size for i in range(len(data) - window_size + 1)] # Example data: daily temperatures temperatures = [22, 24, 19, 23, 25, 21, 20] window = 3 smoothed = moving_average(temperatures, window) print(f"Original temperatures: {temperatures}") print(f"Smoothed temperatures with window {window}: {smoothed}")
Important Notes
Choosing a larger window size smooths data more but can hide quick changes.
Moving averages work best with evenly spaced data points.
There are different types like simple, weighted, and exponential moving averages.
Summary
Moving averages help see trends by smoothing data.
They average a fixed number of points called the window size.
Useful for preparing and understanding time series data.
Practice
1. What is the main purpose of using a
moving average in data analysis?easy
Solution
Step 1: Understand the role of moving averages
Moving averages smooth data by averaging nearby points, reducing short-term ups and downs.Step 2: Identify the main goal
The goal is to reveal longer-term trends by reducing noise, not to remove noise completely or predict exact values.Final Answer:
To smooth out short-term fluctuations and highlight longer-term trends -> Option AQuick Check:
Moving average = smoothing trends [OK]
Hint: Moving averages smooth data to show trends clearly [OK]
Common Mistakes:
- Thinking moving averages increase data points
- Believing moving averages remove all noise
- Assuming moving averages predict exact future values
2. Which of the following Python code snippets correctly computes a simple moving average with window size 3 for a list
data?easy
Solution
Step 1: Understand moving average calculation
A simple moving average with window 3 averages each group of 3 consecutive elements.Step 2: Check each option's correctness
[(data[i] + data[i+1] + data[i+2]) / 3 for i in range(len(data)-2)] correctly sums three consecutive elements and divides by 3, iterating till len(data)-2.
[sum(data[i:i+3]) for i in range(len(data)-3)] sums but does not divide by 3.
[sum(data[i:i+3]) / 3 for i in range(len(data)-3)] divides but uses range(len(data)-3), which is too short.
[data[i] / 3 for i in range(len(data))] divides single elements by 3, not averaging groups.Final Answer:
[(data[i] + data[i+1] + data[i+2]) / 3 for i in range(len(data)-2)] -> Option DQuick Check:
Sum 3 elements / 3, range correct = [(data[i] + data[i+1] + data[i+2]) / 3 for i in range(len(data)-2)] [OK]
Hint: Sum 3 elements and divide by 3, loop till len-2 [OK]
Common Mistakes:
- Forgetting to divide by window size
- Using wrong range length causing index errors
- Averaging single elements instead of groups
3. Given the code below, what is the output?
data = [2, 4, 6, 8, 10] window = 2 moving_avg = [sum(data[i:i+window]) / window for i in range(len(data) - window + 1)] print(moving_avg)
medium
Solution
Step 1: Calculate moving averages manually
Window size is 2, so average pairs:
(2+4)/2=3.0
(4+6)/2=5.0
(6+8)/2=7.0
(8+10)/2=9.0Step 2: Confirm output list length and values
Length is len(data)-window+1 = 5-2+1=4, matching 4 values above.Final Answer:
[3.0, 5.0, 7.0, 9.0] -> Option CQuick Check:
Pairs averaged = [3.0, 5.0, 7.0, 9.0] [OK]
Hint: Average pairs sliding by one, length = len - window + 1 [OK]
Common Mistakes:
- Confusing window size with output length
- Calculating sums but forgetting to divide
- Off-by-one errors in range length
4. The following code is intended to compute a moving average with window size 3, but it misses the last window. What is the problem?
data = [1, 2, 3, 4, 5] window = 3 moving_avg = [sum(data[i:i+window]) / window for i in range(len(data)-window)] print(moving_avg)
medium
Solution
Step 1: Analyze the range length
Range is len(data)-window = 5-3=2, but to cover all windows it should be len(data)-window+1 = 3.Step 2: Understand impact of incorrect range
Using len(data)-window misses the last valid window slice, causing incomplete results.Final Answer:
The range should be len(data) - window + 1 to include the last window -> Option AQuick Check:
Range length = len - window + 1 [OK]
Hint: Use range(len(data) - window + 1) for full coverage [OK]
Common Mistakes:
- Using len(data) - window instead of +1
- Thinking sum() can't handle slices
- Misplacing division outside comprehension
5. You have daily sales data for 10 days:
[10, 12, 11, 14, 13, 15, 16, 14, 13, 12]. You want to smooth this data using a moving average with window size 4 but only want to keep averages where the window's average is greater than 13. Which Python code correctly computes this filtered moving average?hard
Solution
Step 1: Understand window size and range
Window size 4 means averaging groups of 4 elements, so range is len(data)-3 = 10-3=7.Step 2: Filter averages greater than 13
[avg for i in range(len(data)-3) if (avg := sum(data[i:i+4])/4) > 13] uses assignment expression to compute average once and filter if > 13.
[sum(data[i:i+4])/4 for i in range(len(data)-4) if sum(data[i:i+4])/4 > 13] uses wrong range (len(data)-4=6), missing last window.
[sum(data[i:i+4])/4 for i in range(len(data)-3) if sum(data[i:i+4]) > 13] filters sum > 13, not average > 13.
[sum(data[i:i+4])/4 for i in range(len(data)-3) if sum(data[i:i+4])/4 < 13] filters averages less than 13, opposite condition.Final Answer:
[avg for i in range(len(data)-3) if (avg := sum(data[i:i+4])/4) > 13] -> Option BQuick Check:
Use assignment expression to filter averages > 13 [OK]
Hint: Use assignment expression (walrus) to filter averages [OK]
Common Mistakes:
- Using wrong range length missing last windows
- Filtering sum instead of average
- Using wrong comparison operator
