pandas rolling: скользящая сумма после сортировки таблицы

Series.rolling(window=w).sum() считает сумму по окну из w последовательных строк. Для целочисленного окна по умолчанию min_periods=w: пока в окне недостаточно непропущенных значений, результат равен NaN.

Сортировка по региону не создаёт группировку

В этой задаче условие требует rolling по всей таблице после сортировки, без groupby. На границе регионов окно может включать строки из разных регионов. Это отличается от скользящей суммы отдельно внутри каждой группы. Следуйте условию, а перед вычислением упорядочьте строки по указанным ключам.

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

import pandas as pd
df = pd.DataFrame({"team": ["A", "A", "B"], "month": [2, 1, 1], "sales": [20, 10, 100]})
df = df.sort_values(["team", "month"]).reset_index(drop=True)
print(df["sales"].tolist())
print(df["sales"].rolling(window=2).sum().tolist())
print(df["sales"].rolling(window=2, min_periods=1).sum().tolist())

Результат:

[10, 20, 100]
[nan, 30.0, 120.0]
[10.0, 30.0, 120.0]

Решите задачу

Ниже — условие и редактор Python с проверкой без регистрации. Пример выше показывает приём на других данных; для задачи соблюдайте её формат ввода и результата. Курс NumPy и pandas помогает пройти темы по порядку.

Скользящая сумма по регионам: сортировка, rolling и NaN-диагностика

Вы получаете таблицу ежемесячных продаж по одному или нескольким регионам. Нужно:

  • отсортировать данные по региону и месяцу;
  • вычислить скользящую сумму по всему DataFrame (не по группам) с заданным окном;
  • подсчитать и вывести количество NaN в результате;
  • вывести значения скользящей суммы в порядке сортировки.

Что уже дано

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

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

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

  1. Читает из stdin два целых числа n и w — количество строк и размер скользящего окна.
  2. Читает следующие n строк; каждая содержит три токена через пробел: region (строка без пробелов), month (целое число) и sales (целое число). Строки могут быть в произвольном порядке.
  3. Создаёт pd.DataFrame со столбцами 'region', 'month', 'sales'.
  4. Сортирует DataFrame по ['region', 'month'] через sort_values и сбрасывает индекс через reset_index(drop=True). Сохраняет результат обратно в df.
  5. Добавляет столбец 'roll_sum' — скользящую сумму 'sales' с window=w и min_periods по умолчанию (равным w).
  6. Выводит в stdout ровно три строки:
  • строка 1: nan_count=<k> — число строк с NaN в 'roll_sum';
  • строка 2: значения 'roll_sum' через пробел в порядке отсортированного DataFrame; NaN выводится как строка nan; числовые значения выводятся как целые (без дробной части, например 300, а не 300.0);
  • строка 3: regions=<список регионов> — уникальные значения столбца 'region' в отсортированном порядке, через запятую без пробелов (например regions=Восток,Запад).

Ввод и вывод

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

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

Формат ввода

n w
region1 month1 sales1
region2 month2 sales2
...

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

nan_count=<k>
<roll_sum через пробел, NaN как 'nan', числа целыми>
regions=<регион1,регион2,...>

Пример

Ввод
6 3
Запад 2 150
Восток 1 100
Запад 1 200
Восток 3 300
Восток 2 400
Запад 3 250
Вывод
nan_count=2
nan nan 800 900 650 600
regions=Восток,Запад
РешениеPython

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

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

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