Загрузка данных
# 1. Качество прогноза модели
import pandas as pd
import numpy as np
from sklearn.metrics import mean_absolute_error, r2_score
# ------------------------------------------------------------
# 1. Разделение на train/test
# ------------------------------------------------------------
train_end = pd.Timestamp('2025-02-01')
train_df = df[df[date_col] < train_end].copy()
test_df = df[df[date_col] >= train_end].copy()
# ------------------------------------------------------------
# 2. Бенчмарк на TRAIN (средневзвешенное)
# ------------------------------------------------------------
benchmark_value = np.average(
train_df[target].values,
weights=train_df[weight_col].values
)
print(f"Бенчмарк (средневзвешенное на train): {benchmark_value:.5f}")
# ------------------------------------------------------------
# 3. Функция расчёта метрик для одного сравнения
# ------------------------------------------------------------
def calc_metrics(comp, benchmark_value):
"""Возвращает словарь с метриками для модели и бенчмарка."""
if len(comp) == 0:
return None
y_true = comp[target].values
y_pred = comp[pred_col].values
weights = comp[f'{weight_col}_fact'].values
# Метрики для модели
model_wmae = np.average(np.abs(y_true - y_pred), weights=weights)
model_r2 = r2_score(y_true, y_pred)
# Метрики для бенчмарка (константа)
benchmark_pred = np.full_like(y_true, benchmark_value)
bench_wmae = np.average(np.abs(y_true - benchmark_pred), weights=weights)
bench_r2 = r2_score(y_true, benchmark_pred)
return {
'model_wmae': model_wmae,
'model_r2': model_r2,
'bench_wmae': bench_wmae,
'bench_r2': bench_r2
}
# ------------------------------------------------------------
# 4. Сбор данных для всех сегментов + общего портфеля
# ------------------------------------------------------------
segments = ['mass', 'mid', 'prem']
results = []
# Общий портфель (train и test)
for label, df_part in [('Train', train_df), ('Test', test_df)]:
comp = get_comparison(df_part)
if len(comp) > 0:
metrics = calc_metrics(comp, benchmark_value)
if metrics:
results.append({
'Выборка': f'{label} (весь портфель)',
'Модель wMAE': metrics['model_wmae'],
'Модель R2': metrics['model_r2'],
'Бенчмарк wMAE': metrics['bench_wmae'],
'Бенчмарк R2': metrics['bench_r2']
})
# По сегментам (train и test)
for seg in segments:
for label, df_part in [('Train', train_df), ('Test', test_df)]:
df_seg = df_part[df_part['segment'] == seg].copy()
if len(df_seg) == 0:
continue
comp = get_comparison(df_seg)
if len(comp) > 0:
metrics = calc_metrics(comp, benchmark_value)
if metrics:
results.append({
'Выборка': f'{label} ({seg})',
'Модель wMAE': metrics['model_wmae'],
'Модель R2': metrics['model_r2'],
'Бенчмарк wMAE': metrics['bench_wmae'],
'Бенчмарк R2': metrics['bench_r2']
})
# ------------------------------------------------------------
# 5. Создание и вывод итоговой таблицы
# ------------------------------------------------------------
df_metrics = pd.DataFrame(results).round(4)
# Переставляем столбцы для удобства
columns_order = ['Выборка', 'Модель wMAE', 'Модель R2', 'Бенчмарк wMAE', 'Бенчмарк R2']
df_metrics = df_metrics[columns_order]
print("=== МЕТРИКИ КАЧЕСТВА ПРОГНОЗА ===")
print(f"Бенчмарк (средневзвешенное на train): {benchmark_value:.5f}")
print()
display(df_metrics)