Проблема
result = pd.merge(orders, products, on='product_id', how='left')
Что если в products дубликаты по product_id? result будет больше orders. Метрика SUM(revenue) станет в 2-3 раза больше.
Решение: validate
result = pd.merge(
orders, products,
on='product_id',
how='left',
validate='many_to_one'
)
Возможные значения:
- one_to_one — обе стороны без дубликатов
- one_to_many — слева 1:1, справа может быть много
- many_to_one — слева может быть много, справа 1:1
- many_to_many — никаких гарантий
indicator для проверки полноты
df = pd.merge(orders, users, on='user_id', how='left', indicator=True)
df._merge.value_counts()
# both 850000
# left_only 50000 ← orphans
Кейс из Kaspi Shop
Аналитик объединял orders × products × categories. Случайно products содержал 3 строки на один SKU. Result раздулся в 3 раза, отчёт показал revenue 30M вместо реальных 10M. CFO принял решение об инвестициях на этих данных.
После инцидента ввели правило: каждый merge() обязан иметь validate параметр.