import numpy as np
import pandas as pd
# ------------------------------------------------------------
# 1. Коэффициенты из таблицы (в порядке, соответствующем признакам)
# ------------------------------------------------------------
# Внимание: порядок признаков должен совпадать с тем, что использовалось при обучении!
# В таблице указаны:
# Intercept, duration_months, pr_p_n, prem_pr_p_n, mid_pr_p_n,
# new_delta, prem_new_delta, svo_feb, svo_mar, svo_apr
# Создаём словарь коэффициентов
coeff_dict = {
'intercept': -0.0037,
'duration_months': -0.0028,
'pr_p_n': 0.0682,
'prem_pr_p_n': -0.0342,
'mid_pr_p_n': -0.0088,
'new_delta': 0.0223,
'prem_new_delta': 0.0333,
'svo_feb': -0.1156,
'svo_mar': -0.0925,
'svo_apr': -0.0781
}
# Список признаков в том же порядке (без intercept)
features = ['duration_months', 'pr_p_n', 'prem_pr_p_n', 'mid_pr_p_n',
'new_delta', 'prem_new_delta', 'svo_feb', 'svo_mar', 'svo_apr']
# ------------------------------------------------------------
# 2. Построение KDE на тренировочных данных (если F ещё нет)
# ------------------------------------------------------------
# Выберите период для обучения KDE (например, все данные до 2024-07-01)
train_end = pd.Timestamp('2024-07-01')
train_df = df[df['end_month_plan'] < train_end].copy()
# Целевая переменная и веса (используйте тот же weight_col, что и в модели)
target = 'renewed_fact_rate'
weight_col = 'portfolio_share' # или 'sum_total_out' – смотрите, что использовалось
y_train = train_df[target].values
w_train = train_df[weight_col].values
# Построение KDE (выберите bandwidth, который использовался, например, 0.02)
bandwidth = 0.02
F, p = kde_cdf_factory(y_train, weights=w_train, bandwidth=bandwidth)
# ------------------------------------------------------------
# 3. Функция прогнозирования по формуле
# ------------------------------------------------------------
def predict_prolongation(df, coeff_dict, features, F):
"""
Вычисляет прогноз доли пролонгации по формуле linear + KDE.
df: DataFrame с признаками
coeff_dict: словарь коэффициентов (включая 'intercept')
features: список признаков (без intercept) в том же порядке, как в coeff_dict
F: функция распределения из KDE
"""
# Вычисляем z = intercept + sum(coef_i * feature_i)
z = coeff_dict['intercept']
for feat in features:
z += coeff_dict[feat] * df[feat].values
# Преобразуем z в вероятность через CDF
pred = F(z)
return pred
# Применяем ко всему DataFrame
df['prediction_fixed'] = predict_prolongation(df, coeff_dict, features, F)