Перейти к содержанию

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 = 30
history = df.loc[df["age_days"].ge(0)]
w = 0.5 ** (history["age_days"] / half_life_days)
weighted_sum = (history["amount"] * w).groupby(history["client_id"]).sum()
result = weighted_sum / w.groupby(history["client_id"]).sum()

Параметры

half_life_days — обязательное положительное целое число дней, за которое вес уменьшается вдвое. Значения по умолчанию нет; в готовых наборах: 1, 7, 30, 90, 365.

Каталог формул.