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
Настраивает допустимые пары внутри одного правила. Передаётся в 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 дней.