Bird
Raised Fist0
ML Pythonml~10 mins

Moving averages in ML Python - Interactive Code Practice

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to calculate the simple moving average of a list of numbers.

ML Python
def simple_moving_average(data, window_size):
    moving_averages = []
    for i in range(len(data) - window_size + 1):
        window = data[i:i + window_size]
        average = sum(window) / [1]
        moving_averages.append(average)
    return moving_averages
Drag options to blanks, or click blank then click option'
Ai
Blen(data)
Cwindow_size
Dlen(window)
Attempts:
3 left
💡 Hint
Common Mistakes
Using the length of the whole data list instead of the window size.
Dividing by the index variable instead of the window size.
2fill in blank
medium

Complete the code to calculate the exponential moving average (EMA) smoothing factor.

ML Python
def calculate_ema_smoothing_factor(window_size):
    smoothing_factor = 2 / ([1] + 1)
    return smoothing_factor
Drag options to blanks, or click blank then click option'
Awindow_size * 2
Bwindow_size - 1
Cwindow_size + 1
Dwindow_size
Attempts:
3 left
💡 Hint
Common Mistakes
Subtracting 1 instead of adding 1 to the window size.
Multiplying the window size instead of adding.
3fill in blank
hard

Fix the error in the code to update the EMA value correctly.

ML Python
def update_ema(current_value, previous_ema, smoothing_factor):
    ema = [1] * current_value + (1 - smoothing_factor) * previous_ema
    return ema
Drag options to blanks, or click blank then click option'
Asmoothing_factor
Bprevious_ema
Ccurrent_value
D1 - smoothing_factor
Attempts:
3 left
💡 Hint
Common Mistakes
Using previous EMA instead of smoothing factor for the current value.
Using current value without multiplying by smoothing factor.
4fill in blank
hard

Fill both blanks to create a dictionary of moving averages for each window size.

ML Python
def moving_averages_dict(data, window_sizes):
    averages = {size: simple_moving_average(data, [1]) for size in [2]
    return averages
Drag options to blanks, or click blank then click option'
Asize
Bdata
Cwindow_sizes
Daverages
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'data' instead of 'window_sizes' in the loop.
Using 'averages' inside the comprehension which is not defined yet.
5fill in blank
hard

Fill all three blanks to filter data points and compute their moving averages.

ML Python
filtered_data = [x for x in data if x [1] threshold]
moving_avg = simple_moving_average(filtered_data, [2])
result = {i: moving_avg[i] for i in range(len(moving_avg)) if moving_avg[i] [3] 0}
Drag options to blanks, or click blank then click option'
A>
Bwindow_size
D<
Attempts:
3 left
💡 Hint
Common Mistakes
Using '<' instead of '>' for filtering data points.
Using wrong variable for window size.
Filtering moving averages less than zero instead of greater.

Practice

(1/5)
1. What is the main purpose of using a moving average in data analysis?
easy
A. To smooth out short-term fluctuations and highlight longer-term trends
B. To increase the number of data points in a dataset
C. To remove all noise from the data completely
D. To predict exact future values without error

Solution

  1. Step 1: Understand the role of moving averages

    Moving averages smooth data by averaging nearby points, reducing short-term ups and downs.
  2. 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.
  3. Final Answer:

    To smooth out short-term fluctuations and highlight longer-term trends -> Option A
  4. Quick 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
A. [data[i] / 3 for i in range(len(data))]
B. [sum(data[i:i+3]) for i in range(len(data)-3)]
C. [sum(data[i:i+3]) / 3 for i in range(len(data)-3)]
D. [(data[i] + data[i+1] + data[i+2]) / 3 for i in range(len(data)-2)]

Solution

  1. Step 1: Understand moving average calculation

    A simple moving average with window 3 averages each group of 3 consecutive elements.
  2. 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.
  3. Final Answer:

    [(data[i] + data[i+1] + data[i+2]) / 3 for i in range(len(data)-2)] -> Option D
  4. Quick 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
A. [2.0, 4.0, 6.0, 8.0, 10.0]
B. [3.0, 5.0, 7.0]
C. [3.0, 5.0, 7.0, 9.0]
D. [6.0, 8.0, 10.0]

Solution

  1. 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.0
  2. Step 2: Confirm output list length and values

    Length is len(data)-window+1 = 5-2+1=4, matching 4 values above.
  3. Final Answer:

    [3.0, 5.0, 7.0, 9.0] -> Option C
  4. Quick 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
A. The range should be len(data) - window + 1 to include the last window
B. The window size is too large for the data list
C. sum() cannot be used on list slices
D. Division by window size should be outside the list comprehension

Solution

  1. 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.
  2. Step 2: Understand impact of incorrect range

    Using len(data)-window misses the last valid window slice, causing incomplete results.
  3. Final Answer:

    The range should be len(data) - window + 1 to include the last window -> Option A
  4. Quick 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
A. [sum(data[i:i+4])/4 for i in range(len(data)-4) if sum(data[i:i+4])/4 > 13]
B. [avg for i in range(len(data)-3) if (avg := sum(data[i:i+4])/4) > 13]
C. [sum(data[i:i+4])/4 for i in range(len(data)-3) if sum(data[i:i+4]) > 13]
D. [sum(data[i:i+4])/4 for i in range(len(data)-3) if sum(data[i:i+4])/4 < 13]

Solution

  1. 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.
  2. 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.
  3. Final Answer:

    [avg for i in range(len(data)-3) if (avg := sum(data[i:i+4])/4) > 13] -> Option B
  4. Quick 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