Содержание
Списки SKU и количества: раскройте позиции заказа без перемножения
В подготовленной выгрузке одна строка заказа может содержать два согласованных списка: артикулы и количества. Если раскрывать их по очереди, можно получить сочетания, которых не было в заказе. Ниже способ для аналитической копии данных с Python и pandas, где обе колонки уже содержат настоящие списки.
Проверьте формат до преобразования
Подготовьте orders с уникальным order_id, колонкой skus со списком артикулов и quantities со списком соответствующих количеств. Условие метода: первый артикул соответствует первому количеству, второй второму и так далее. Это должно следовать из формата вашего источника, а не из предположения аналитика.
Строка CSV вида «[артикул1, артикул2]» сама по себе не является списком Python. Сначала разберите документированный формат источника. Не применяйте eval к содержимому выгрузки. Сохраните исходный файл и работайте с копией.
Остановитесь на несогласованных строках
assert orders["order_id"].notna().all()
assert orders["order_id"].is_unique
for col in ["skus", "quantities"]:
if not orders[col].map(lambda x: isinstance(x, list)).all():
raise ValueError("Нужны списки в обеих колонках")
sizes = orders["skus"].map(len)
bad = (sizes != orders["quantities"].map(len)) | (sizes == 0)
if bad.any():
orders.loc[bad].to_json("orders_to_review.json", orient="records")
raise ValueError("Разберите длины и пустые списки")
Не дополняйте короткий список нулями: так получится выдуманное соответствие. Если список пуст, выясните, является ли это заказом без товарных строк, ошибкой подготовки или неполной выгрузкой.
Раскройте обе колонки одним вызовом
По документации pandas, explode может раскрывать несколько колонок одновременно, если длины списков в каждой строке совпадают. Пустой список даёт строку с пропуском, поэтому выше он вынесен на разбор.
expected_rows = int(sizes.sum())
lines = orders.explode(["skus", "quantities"], ignore_index=True)
assert len(lines) == expected_rows
Последовательные вызовы сначала для skus, затем для quantities раскрывают уже размноженные строки. Поэтому для позиционно связанных списков нужен совместный вызов. Новый индекс служит нумерацией результата и не заменяет идентификатор заказа.
Сохраните уровень показателей
Вынесите общую сумму заказа, стоимость доставки и другие показатели заказа в отдельную таблицу с одной строкой на order_id. При раскрытии они повторяются рядом с каждой позицией: суммировать такие повторения как новую выручку нельзя. Для расчёта суммы товарных строк нужны собственные цены и правила распределения скидок из источника.
Выберите реальные заказы с одной и несколькими позициями. Сравните каждый артикул и его количество с исходным списком в том же порядке. Проверьте число позиций по каждому заказу, а не только общий размер таблицы. Сохраните результат, исходную копию и файл отклонённых строк. К расчёту товарных показателей переходите после этой сверки.
Комментарии 0