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

Ratio

Ratio(*, rules)

Отношение результатов двух формул для одного объекта. Каждое правило перебирается независимо.

Использование

transactions — обучающая таблица событий с бинарным target, одинаковым внутри каждого клиента.

from featminer import RelativeTime, one_to_many_pipeline
from featminer.formulas import Ratio, RatioRule, RatioSide, WindowSum

FORMULAS = (
    Ratio(rules=[
        RatioRule(
            numerator=RatioSide(formulas=[WindowSum(days=7)]),
            denominator=RatioSide(formulas=[WindowSum(days=30)]),
            same_column=True,
            columns=["amount"],
        ),
    ]),
)

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=FORMULAS,
)

Ratio задаёт отношение сумм за 7 и 30 дней по колонке amount. features содержит признаки, прошедшие отбор по таргету. age_days — возраст события в днях; меньший возраст означает более позднее событие (ascending=False).

Пример результата

Таблица событий df: client_id — ключ объекта, age_days — возраст события в днях относительно момента прогноза (0 — этот момент). Расчёт без дополнительной фильтрации строк. amount — сумма платежа. Пример: отношение сумм за 7 и 30 дней.

client_id age_days amount
0 1 2 100
1 1 10 200
2 1 40 300

Значение этого кандидата по клиентам:

Ratio
client_id
1 0.333333
Эквивалентный расчёт на pandas

recent и history — строки в окнах 7 и 30 дней; numerator — числитель, denominator — знаменатель. При нулевом знаменателе результат NaN.

recent = df.loc[df["age_days"].between(0, 7)]
history = df.loc[df["age_days"].between(0, 30)]
numerator = recent.groupby("client_id")["amount"].sum()
denominator = history.groupby("client_id")["amount"].sum()
numerator = numerator.reindex(denominator.index, fill_value=0)
result = numerator / denominator.where(denominator.ne(0))

Параметры

rules — обязательная непустая последовательность RatioRule.

Поддерживаются Sum, Count, Mean, Ews, EwsCount, EwaFraction, WindowSum, WindowCount, WindowFraction, WindowMean.

RatioRule

RatioRule(
    *, numerator, denominator,
    columns=None, same_column=False, same_family=True,
)

Настраивает допустимые пары внутри одного правила. Передаётся в Ratio(rules=[...]).

Параметры

Параметр По умолчанию Назначение
numerator Обязательный RatioSide для числителя
denominator Обязательный RatioSide для знаменателя
columns None Общие колонки при same_column=True; None разрешает все совместимые
same_column False False — разные колонки, True — одна колонка с обеих сторон
same_family True Разрешать только совместимые семейства агрегаций

По умолчанию совместимы Sum ↔ WindowSum, Count ↔ WindowCount, Mean ↔ WindowMean, а также одинаковые семейства Ews, EwsCount, EwaFraction, WindowFraction. Несовместимые пары пропускаются. Для отношения разных семейств укажите same_family=False.

RatioSide

RatioSide(*, formulas=None, columns=None)

Описывает одну сторону отношения.

Параметры

Параметр По умолчанию Назначение
formulas None Использовать стандартный набор этой стороны, описанный ниже
columns None Все совместимые колонки; для ограничения передайте список имён

При formulas=None набор содержит Sum(), Ews(half_life_days=...) с периодами 1, 7, 30, 90, 365 и WindowSum(days=...) с окнами 1, 7, 30, 90, 365, 730, 1095 дней.

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