Ewa
Ewa(*, half_life_days: int)
Для каждого объекта вычисляет среднее с экспоненциальными весами: более свежие события имеют больший вес.
Использование
transactions — обучающая таблица событий с бинарным target, одинаковым внутри каждого клиента.
from featminer import RelativeTime, one_to_many_pipeline
from featminer.formulas import Ewa
features = one_to_many_pipeline(
df=transactions,
aggregation_key="client_id",
target_col="target",
event_times=("age_days",),
relative_time_columns=(
RelativeTime("age_days", unit="day", ascending=False),
),
formulas=(Ewa(half_life_days=30),),
)
Ewa(half_life_days=30) задаёт расчёт с периодом полураспада 30 дней. Pipeline выбирает подходящие числовые колонки и условия; features содержит прошедшие отбор признаки. age_days — возраст события в днях относительно момента прогноза; ascending=False задаёт обратный порядок: меньший возраст — более позднее событие.
Пример результата
Один кандидат: взвешенное среднее суммы платежа amount без дополнительного условия. Таблица событий df:
| client_id | age_days | amount | |
|---|---|---|---|
| 0 | 1 | 60 | 100 |
| 1 | 1 | 30 | 200 |
| 2 | 1 | 0 | 400 |
Веса w равны 0.25, 0.5, 1. Результат: (100 × 0.25 + 200 × 0.5 + 400) / 1.75 = 300.
Среднее по клиентам:
| Ewa | |
|---|---|
| client_id | |
| 1 | 300 |
Эквивалентный расчёт на pandas
history — события не позднее момента прогноза; w — веса, weighted_sum — сумма значений с этими весами. В примере нет пропусков.
Параметры
half_life_days — обязательное положительное целое число дней, за которое вес уменьшается вдвое. Значения по умолчанию нет; в готовых наборах: 1, 7, 30, 90, 365.