Загрузка данных


# Прогноз по формуле (используем ранее созданные F и функцию predict_prolongation)
df['prediction'] = predict_prolongation(df, coeff_dict, features, F)

# Агрегация прогнозов
pred_agg = aggregate_weighted(df, 'end_month_plan', 'prediction', 'portfolio_share')
comparison = tf.merge(pred_agg, on='end_month_plan', suffixes=('_fact', '_pred'))

# Расчёт метрик
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
y_true = comparison['renewed_fact_rate']
y_pred = comparison['prediction']
weights = comparison['portfolio_share_fact']

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(y_true, 1e-6))) * 100
r2 = r2_score(y_true, y_pred)

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(y_true,1e-6)), weights=weights)*100

print(f"MAE: {mae:.5f}, RMSE: {rmse:.5f}, MAPE: {mape:.2f}%, R2: {r2:.5f}")
print(f"Взвешенные: wMAE: {wmae:.5f}, wRMSE: {wrmse:.5f}, wMAPE: {wmape:.2f}%")