import pandas as pd
import numpy as np
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
# Извлекаем данные (предполагается, что comparison уже существует)
y_true = comparison[target].values
y_pred = comparison['prediction'].values
weights = comparison[f'{weight_col}_fact'].values # или _pred – они одинаковы
# Обычные метрики
mae = mean_absolute_error(y_true, y_pred)
rmse = np.sqrt(mean_squared_error(y_true, y_pred))
mape = np.mean(np.abs((y_true - y_pred) / np.maximum(np.abs(y_true), 1e-6))) * 100
r2 = r2_score(y_true, y_pred)
# Взвешенные метрики (без R2)
wmae = np.average(np.abs(y_true - y_pred), weights=weights)
wrmse = np.sqrt(np.average((y_true - y_pred)**2, weights=weights))
wmape = np.average(np.abs((y_true - y_pred) / np.maximum(np.abs(y_true), 1e-6)), weights=weights) * 100
# Создаём таблицу
metrics_table = pd.DataFrame({
'MAE': [mae, wmae],
'RMSE': [rmse, wrmse],
'MAPE (%)': [mape, wmape],
'R²': [r2, None] # для взвешенных R2 не считаем
}, index=['Обычные', 'Взвешенные'])
# Округляем до 5 знаков для единообразия
metrics_table = metrics_table.round(5)
print("Метрики качества прогноза:")
print(metrics_table.to_string())