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

Быстрый старт

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}"
)