pandasВременные рядыMediumБесплатно~8 мин

Сезонность: средние по дню недели и часу

// Условие

Таблица df: 8 000 заказов с точными timestamp-ами. В данных зашит реалистичный паттерн: больше заказов вечером (18–22) и в выходные.

Что нужно
Посчитай среднюю сумму заказа (mean(amount)) для каждой комбинации «день недели × час».
  • День недели: 0 = понедельник, 6 = воскресенье (dt.dayofweek).
  • Час: 0–23 (dt.hour).
Верни в result плоский DataFrame с колонками day_of_week, hour, avg_amount (float, округлено до 2 знаков). Сортировка по day_of_week asc, потом hour asc. Сброс индекса.

// Данные

df: order_id, order_ts (datetime), amount (float)
▶ Решить в pandas-тренажёре

// Решение

Подсказка

Извлеки день и час как отдельные колонки: df['dow'] = df['order_ts'].dt.dayofweek, df['hour'] = df['order_ts'].dt.hour.

Группировка по двум колонкам: df.groupby(['dow','hour'], as_index=False).agg(avg_amount=('amount','mean')).

Переименуй dow в day_of_week, округли avg_amount до 2 знаков, отсортируй по ['day_of_week','hour'] и сбрось индекс.

Сначала попробуй сам → Показать решение
df = load_data()

df['dow'] = df['order_ts'].dt.dayofweek
df['hour'] = df['order_ts'].dt.hour

result = (
    df.groupby(['dow', 'hour'], as_index=False)
    .agg(avg_amount=('amount', 'mean'))
    .rename(columns={'dow': 'day_of_week'})
    .sort_values(['day_of_week', 'hour'])
    .reset_index(drop=True)
)
result['avg_amount'] = result['avg_amount'].round(2)

print(result.head(12))
print(f"shape: {result.shape}")
Сезонность по дню недели + часу — частая задача для load-prediction и retention. Альтернативное представление: сделай pivot_table в матрицу 7 × 24 через result.pivot(index='day_of_week', columns='hour', values='avg_amount') — удобно для heatmap-визуализации. На собесе важно: dt.dayofweek возвращает 0=Monday, 6=Sunday — не путай с dt.weekday (то же самое) и dt.day_name() (текстовое название). Ещё полезно: dt.is_weekend = dt.dayofweek >= 5.

// Похожие задачи