Сезонность: средние по дню недели и часу
// Условие
Таблица 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)// Решение
Подсказка
Извлеки день и час как отдельные колонки: 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.