feat(generator): заказы дня — проекция покупок с деньгами магазина
- Зачем: - тикет #90: второй источник должен смотреть на торговую половину дня глазами бэкенда — заказ есть проекция покупки, а не второе порождение; учебный результат — два источника согласованы по построению, а не сверкой. - Что: - `commerce` отдаёт вторым выходом покупки дня: номер заказа, корзину, выручку клиента, промокод и человека за кукой; новых бросков в подпоток `COMMERCE` не добавилось, события дня не сдвинулись. - заведена заказная сторона: подпоток `ORDERS` на позиции 2 дерева зерна (прежнее мёртвое имя `DISCREPANCIES`), ветвление — по дню рождения заказа; `LATECOMERS` не тронут, его наполнит этап 6. - новый модуль `orders.py`: деньги заказа целыми копейками — `items_total` из корзины, `discount` по таблице «код → скидка» (округление вниз), `delivery` броском по таблице весов на полную длину дня, `total` = `items_total` − `discount` + `delivery`. - план состава завёл `person_id` — последним броском когорты, после паспортов: вторая кука пары повторяет ID своего человека, заказ показывает его как `user_id`, в событие Метрики он не попадает. - `world`: окно изменяемости `ORDER_WINDOW_DAYS` = 7 рядом с D0 и поясом, черновая таблица стоимости доставки. - слепок дня в тестах сторожит обе половины: заказы сравниваются наравне с потоком событий. - доки: имя подпотока заказной стороны и состав денег заказа записаны в `docs/architecture/orders`, README генератора знает про новый модуль. - Проверка: - из `generator/`: make lint, make typecheck, make test (417 тестов); в корне — make lint. - опись мира не покраснела: байты восьми дней те же, заказная сторона события не сдвинула. Closes #90 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+12
-6
@@ -7,8 +7,9 @@
|
||||
События уже есть и уже уезжают: день-функция отдаёт по паре (зерно, D)
|
||||
упорядоченный поток трёх видов — просмотр страницы, корзина, покупка, —
|
||||
канонический сериализатор превращает его в JSON, а проигрыватель гонит в файл
|
||||
или в Kafka. Клиентская сторона на этом целая; заказы бэкенда — за следующими
|
||||
этапами.
|
||||
или в Kafka. Клиентская сторона на этом целая. Второй источник строится:
|
||||
день отдаёт и заказы бэкенда — проекцию своих покупок с деньгами магазина, —
|
||||
а судьба заказа и отправка слепка идут следующими тикетами.
|
||||
|
||||
## Как это работает
|
||||
|
||||
@@ -30,7 +31,8 @@ D0 живёт предыстория, поэтому любой день соб
|
||||
значит сдвинуть все броски после него, а с ними и весь мир: события того же
|
||||
дня станут другими, счётчики канонического мира разойдутся с описью, и
|
||||
поймается это не ошибкой, а красным чеком. Ровно поэтому паспорта кук в
|
||||
`plan.cohort` бросаются последними.
|
||||
`plan.cohort` брошены последними, а личность человека приписана уже за ними:
|
||||
куки, пары и паспорта остались теми же до байта.
|
||||
|
||||
Случайность целочисленная — только диапазоны и выбор по целым весам: готовые
|
||||
распределения numpy расходятся между версиями и архитектурами, а обещано
|
||||
@@ -44,8 +46,8 @@ D0 живёт предыстория, поэтому любой день соб
|
||||
- `src/clickstream_generator/seeds.py` — иерархия зёрен: кто из какого
|
||||
подпотока берёт случайность. На ней держится весь детерминизм.
|
||||
- `src/clickstream_generator/plan.py` — план состава: кто есть в мире в
|
||||
день D. Когорты, приток, двухкуковые пары, паспорта кук и счётчики — до
|
||||
генерации событий.
|
||||
день D. Когорты, приток, двухкуковые пары, паспорта кук, человек за кукой
|
||||
и счётчики — до генерации событий.
|
||||
- `src/clickstream_generator/weights.py` — выбор по целым весам: один приём
|
||||
на весь генератор, чтобы дисциплина целочисленной случайности не жила
|
||||
копиями.
|
||||
@@ -56,10 +58,14 @@ D0 живёт предыстория, поэтому любой день соб
|
||||
`data/catalog/products.csv`, общего у генератора и словаря ClickHouse.
|
||||
- `src/clickstream_generator/day.py` — день-функция: визиты, страницы,
|
||||
атрибуция, устройство и гео. Там же правила резки визитов и шов, на
|
||||
который садятся торговые события.
|
||||
который садятся торговые события; прожитый день отдаёт обе половины —
|
||||
поток событий и заказы.
|
||||
- `src/clickstream_generator/commerce.py` — торговые события: что легло в
|
||||
корзину, что из этого куплено, деньги, номера заказов и сырой `ecommerce`.
|
||||
Своя случайность, поэтому правка торговли трафик не двигает.
|
||||
- `src/clickstream_generator/orders.py` — заказы бэкенда: вторая проекция
|
||||
покупки. Личность покупателя и деньги магазина — скидка по промокоду,
|
||||
доставка, итог; своя случайность, ветвящаяся по дню рождения заказа.
|
||||
- `src/clickstream_generator/ids.py` — номера событий: неповторяющиеся и
|
||||
ниже 2^53. Обещание одно на обе половины дня, поэтому и живёт отдельно.
|
||||
- `src/clickstream_generator/serialize.py` — канонический сериализатор:
|
||||
|
||||
Reference in New Issue
Block a user