feat(generator): добавлена команда слепков заказов

- Зачем:
  - задача #92 добавляет второй источник и показывает слепок как чистую функцию зерна и дня.
- Что:
  - добавлены окно, состояние на границе суток и канонические байты с настоящими миллисекундами.
  - добавлены команда snapshot, сдвиг D → D−1 и переиспользование проигранных дней.
  - опись дополнена хешами слепков и поведенческими тестами.
- Проверка:
  - в generator выполнены make lint, make typecheck и make test: 427 тестов.
This commit is contained in:
ddadmin committed 2026-08-18 17:12:49 +03:00
1 parent c11da3b252
commit 8e21381e13
11 files changed
+740 -46

No files matched your search

@@ -151,6 +151,10 @@ class Purchases:
# та самая, что уехала в событие как `purchaseRevenue`. Бэкенд назовёт
# её `items_total` — у двух источников свои имена одному числу.
revenue: NDArray[np.int64]
# Когда покупка подтверждена — та же абсолютная метка, что уехала в
# событие. У заказа она станет секундой `created_at`: строка в базе
# источника создаётся синхронно с покупкой.
moment: NDArray[np.datetime64]
def __len__(self) -> int:
return self.person_id.size
@@ -185,6 +189,7 @@ _NO_PURCHASES = Purchases(
quantity=(),
coupon=(),
revenue=np.empty(0, dtype=np.int64),
moment=np.empty(0, dtype="datetime64[s]"),
)
@@ -666,6 +671,7 @@ def _purchases(
quantity=tuple(draws.quantity[group] for group in bought),
coupon=tuple(coupons[mine].tolist()),
revenue=revenue[mine],
moment=rows["UTCEventTime"][here],
)