pandas rolling: скользящее среднее и размер окна

rolling в pandas вычисляет показатель в скользящем окне. window задаёт размер окна, а min_periods — минимальное число непустых наблюдений для результата; до этого порога получается NaN.

Почему важен порядок строк

Для окна window=3 без явного min_periods обычно требуется три наблюдения: первые две позиции дают NaN. При min_periods=1 расчёт начнётся с первой заполненной позиции. Это разные требования к полноте данных, а не просто оформление вывода.

Перед расчётом временного показателя отсортируйте строки по времени. Целочисленное окно считает строки, а окно вроде "7D" использует временной интервал при подходящем индексе. Для нескольких независимых объектов не смешивайте их наблюдения в одном общем окне.

Пример на других данных

import pandas as pd
s = pd.Series([2., 4., 6., 8.])
full = s.rolling(window=3).mean()
partial = s.rolling(window=3, min_periods=1).mean()
print(int(full.isna().sum()))
print(partial.tolist())

Результат:

2
[2.0, 3.0, 4.0, 6.0]

Попробуйте сами

Ниже — отдельное упражнение: напишите код и запустите проверку. Другие упражнения по этой теме. Для обучения по порядку откройте бесплатный курс NumPy и pandas.

Скользящее среднее и сумма: window, min_periods и проверка NaN

Вы получаете временной ряд показателей датчика. Нужно:

  • отсортировать данные по дню;
  • вычислить скользящее среднее и скользящую сумму с заданным окном;
  • вывести количество строк с NaN в каждом из двух новых столбцов.

Что уже дано

Проверяющая система запускает вашу программу и подаёт данные через stdin. Никаких заранее созданных переменных нет — вы читаете всё сами.

Что нужно сделать

Напишите программу, которая:

  1. Читает из stdin два целых числа n и w — количество строк и размер скользящего окна.
  2. Читает следующие n строк; каждая содержит два токена через пробел: day (целое число) и value (целое число). Строки могут быть в произвольном порядке.
  3. Создаёт pd.DataFrame со столбцами 'day' и 'value'.
  4. Сортирует DataFrame по 'day' через sort_values и сбрасывает индекс через reset_index(drop=True). Сохраняет результат обратно в df.
  5. Добавляет столбец 'roll_mean' — скользящее среднее 'value' с window=w (параметр min_periods оставьте по умолчанию, то есть равным w).
  6. Добавляет столбец 'roll_sum' — скользящую сумму 'value' с window=w (параметр min_periods оставьте по умолчанию).
  7. Выводит в stdout ровно три строки:
  • строка 1: nan_mean=<k> — число строк с NaN в 'roll_mean';
  • строка 2: nan_sum=<k> — число строк с NaN в 'roll_sum';
  • строка 3: значения 'roll_mean' через пробел, округлённые до 2 знаков; NaN выводится как строка nan.

Ввод и вывод

Программа читает stdin и пишет в stdout.

Ограничения: n >= 1, w >= 1.

Формат ввода

n w
day1 value1
day2 value2
...

Формат вывода

nan_mean=<k>
nan_sum=<k>
<roll_mean через пробел, NaN как 'nan'>

Пример

Ввод
5 3
3 30
1 10
5 50
2 20
4 40
Вывод
nan_mean=2
nan_sum=2
nan nan 20.00 30.00 40.00
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи