Считайте истинный ДРР и ставку биддера по SKU
Кросс-маркетплейсный compute-движок для управления рекламой: истинный ДРР с маржой, автостоп убыточных SKU, распределение бюджета по ABC, расчёт target-ставки. Pure pandas, без сети — детерминизм для горячего пути биддера (тик 15 мин). Применение решений в Ozon/WB/ЯМ — через гайд-навыки маркетплейсов.
Как агент работает
Контракты входа заданы жёстко, потому что от них зависит воспроизводимость: все денежные значения — в копейках, ABC-класс — строка 'A', 'B' или 'C' без учёта регистра, неклассифицированный SKU подаётся как 'C', поле exploration_until — это pd.Timestamp с таймзоной UTC или pd.NaT, target_drr передаётся процентом вида 12.0, а conversion rate — долей от нуля до единицы, где 0.04 означает четыре процента.
Функция compute_sku_pnl возвращает копию входного DataFrame с тремя числовыми колонками: pnl_kopeks в копейках, а также true_drr и margin_pct, округлённые до двух знаков. Поиск убыточных товаров устроен по-другому: find_loss_makers выдаёт по одной записи на каждое сработавшее правило, так что один SKU может встретиться несколько раз — negative_margin, drr_overshoot, ad_spend_above_margin, с severity high или medium.
Решения об остановке детерминированы порядком правил: apply_pause_rules даёт ровно один результат на SKU, и побеждает первое сработавшее — exploration, затем negative_margin, затем oos_lt_7d, затем returns_above_15pct, и только если ничего не сработало, статус ok. Функция propose_lineup тоже отдаёт один результат на SKU со стратегией push, hold, pause или exploration, причём для pause бюджет и ставка равны нулю.
Ставка считается функцией compute_target_bid, которая возвращает целое число в копейках. SKU на cold-start получает EXPLORATION_BID_KOPEKS, то есть 5000 копеек или 50 рублей. Если сигнала по конверсии нет, текущая ставка не трогается, только придерживается минимальным флором. В остальных случаях результат клампится в пределах плюс-минус 50% от current_bid — это страховка от качелей на коротких пятнадцатиминутных тиках.
Ядро сознательно ничего не умеет за пределами расчёта: оно не ходит в сеть и не вызывает API Ozon, Wildberries или Яндекс Маркета, не пишет в базу и не считает себестоимость, комиссии и логистику с нуля — они должны уже лежать в поданном DataFrame. Чтение и применение решений на площадке — работа гайд-навыков маркетплейсов, маппинг типов списаний — задача юнит-экономики, а выбор авто или ручной кампании — стратегии рекламы.
Примеры задач
Истинный ДРР с учётом маржи
По каждому SKU считается P&L: выручка минус себестоимость, комиссия, логистика, возвраты и реклама — ДРР от прибыли, а не от оборота.
Автостоп убыточных SKU
Товары, которые жгут рекламный бюджет или продаются в минус, находятся автоматически — со степенью серьёзности и причиной по каждому.
Бюджет по ABC-классам
Рекламный бюджет распределяется по вкладу товаров в прибыль: класс A получает масштабирование, класс C — минимум или отключение.
Вопросы и ответы
Почему расчёты детерминированные?
Ядро — чистые pandas-функции без сети и без LLM-арифметики: один и тот же вход всегда даёт один и тот же результат. Это требование горячего пути биддера с тиком в 15 минут.
С какими маркетплейсами работает ядро?
С любыми — оно кросс-платформенное и не знает о конкретной площадке. Применение решений (смена ставок, остановка кампаний) выполняется через гайд-навыки WB, Ozon и Яндекс Маркета.
В каком формате подаются данные?
DataFrame по SKU: выручка, себестоимость, комиссия, логистика, возвраты, расходы на рекламу — суммы в копейках, чтобы исключить ошибки округления.
Marketplace Ads — Compute Core (cross-MP)
Кросс-маркетплейсный compute-движок для биддера. Pure pandas — без сети, без знания о конкретном маркетплейсе. Один вход — DataFrame, один выход — DataFrame или list[dict] с детерминированным результатом.
Контракты входа
- Все денежные значения — в копейках (int или float). Если на руках рубли — умножь на 100.
- ABC-класс — строка
'A' | 'B' | 'C'(case-insensitive). Если SKU не классифицирован, передай'C'. exploration_until—pd.Timestamp(UTC-aware) илиpd.NaT. SKU считается cold-start, пока значение в будущем.target_drr— процент (12.0, не0.12).cr(conversion rate) — доля0..1(например,0.04= 4%).
Контракты выхода
compute_sku_pnl: копия входа + три числовые колонки (pnl_kopeksв копейках,true_drrиmargin_pctокруглены до 2 знаков).find_loss_makers: один SKU может встречаться несколько раз — по одному элементу на каждое сработавшее правило (negative_margin,drr_overshoot,ad_spend_above_margin);severity∈{high, medium}.apply_pause_rules: ровно один результат на SKU; первое сработавшее правило побеждает (exploration→negative_margin→oos_lt_7d→returns_above_15pct→ok).propose_lineup: ровно один результат на SKU;strategy∈{push, hold, pause, exploration}. Дляpauseбюджет и ставка = 0.compute_target_bid: возвращаетint. Cold-start →EXPLORATION_BID_KOPEKS = 5000(50 ₽). Без CR-сигнала → не трогаемcurrent_bid(с минимальным флором). Иначе клампим в ±50% отcurrent_bid(страховка от качелей при коротких тиках).
Что этот скилл НЕ делает
- Не ходит в сеть. Не вызывает Ozon/WB/ЯМ API. Если нужно прочитать данные — это работа гайд-навыка маркетплейса.
- Не пишет в БД. Только compute.
- Не решает «авто или ручная кампания». Это методологический выбор →
marketplace_ads_strategy_ru. - Не считает COGS / комиссии / логистику с нуля — ожидает их уже в DataFrame. Маппинг типов списаний — задача
unit_economics_ru.
Похожие навыки
Попробуйте этот навык
Зарегистрируйтесь и используйте навык «Биддер: compute-ядро (cross-MP)» бесплатно.