Быстрый старт
import numpy as np
import pandas as pd
from featminer import one_to_many_pipeline
n_rows = 10_000
client_id = np.random.randint(1000, 2000, size=n_rows)
amount = np.random.gamma(shape=2.0, scale=250.0, size=n_rows).round(2)
channel = np.random.choice(["branch", "web", "mobile"], size=n_rows)
product_code = np.random.choice([10, 20, 30], size=n_rows)
target = ((amount > 800) | (channel == "mobile")).astype(int)
transactions = pd.DataFrame({
"client_id": client_id,
"amount": amount,
"channel": channel,
"product_code": product_code,
"target": target,
})
features = one_to_many_pipeline(
df=transactions,
aggregation_key="client_id",
target_col="target",
cat_features=["channel", "product_code"],
open_browser=False,
)
print(features.head().to_string())
Параметр cat_features явно указывает, что channel и целочисленные коды
product_code нужно обрабатывать как категориальные колонки, а не как
числовые признаки.
В исходной таблице 10 тысяч транзакций. Pipeline схлопывает их в одну строку на клиента, генерирует кандидаты признаков и оставляет прошедшие отбор. Вывод будет выглядеть примерно так:
amount__channel__mobile__max amount__channel__branch__mean amount__std target
client_id
1000 1127.49 412.85 301.42 1
1001 934.30 506.11 248.70 1
1002 801.04 377.29 283.14 1
1003 719.85 455.02 219.67 1
1004 1055.63 536.40 351.88 1
featminer также сохраняет в каталог featminer-report/<дата-и-время>/
самостоятельный Python-скрипт с кодом расчёта отобранных признаков. Чтобы
применить его к новым данным без повторного запуска featminer, достаточно
указать пути DATASET_PATH и OUTPUT_PATH.
Для этого примера сгенерированный скрипт выглядит так:
# This file was generated automatically. Do not edit manually.
# To run: edit DATASET_PATH and OUTPUT_PATH below.
import pandas as pd
DATASET_PATH = "path/to/dataset.parquet"
OUTPUT_PATH = "path/to/features.parquet"
df = pd.read_parquet(DATASET_PATH)
features = pd.DataFrame(index=df["client_id"].drop_duplicates())
features["amount__channel__web__max"] = (
df["amount"][df["channel"] == "web"].groupby(df["client_id"]).max()
)
features["amount__channel__branch__sum"] = (
df["amount"][df["channel"] == "branch"].groupby(df["client_id"]).sum()
)
features["amount__std"] = df["amount"].groupby(df["client_id"]).std()
features.to_parquet(OUTPUT_PATH, index=True)
print(
f"Saved {len(features)} rows, "
f"{len(features.columns)} features to {OUTPUT_PATH}"
)