Содержание
Остатки не разворачиваются через pivot: найдите повторные пары
В аналитической копии остатков нужно получить строки по SKU и колонки по складам, но pandas сообщает: «Index contains duplicate entries, cannot reshape». Прежде чем заменять операцию на суммирование, выясните, что означает одна строка исходного файла.
Зафиксируйте срез и ключ
Подготовьте таблицу stocks с полями sku, warehouse и qty. Названия условные: замените их на свои. Оставьте один магазин и один момент снимка. Не смешивайте вчерашние и сегодняшние остатки, разные единицы измерения или доступный остаток с физическим. Сохраните исходную выгрузку отдельно.
По документации pandas, pivot меняет форму таблицы без агрегирования. Повторная комбинация значений индекса и будущих колонок вызывает ValueError. Для нашей задачи это пара sku и warehouse.
Выведите все конфликтующие строки
keys = ["sku", "warehouse"]
if stocks[keys].isna().any().any():
raise ValueError("Сначала разберите пустые SKU и склады")
conflicts = stocks.loc[
stocks.duplicated(keys, keep=False)
].sort_values(keys)
conflicts.to_csv("stock_conflicts.csv", index=False)
Откройте сохранённые строки вместе с датой снимка, номером партии и видом остатка, если они есть в исходнике. Пустой файл конфликтов подтверждает уникальность выбранных пар, но сам по себе не подтверждает правильность количеств.
Выберите действие по смыслу строки
| Что обнаружили | Следующее действие |
|---|---|
| Разные моменты снимка | Выберите один согласованный срез, не складывайте снимки |
| Несколько магазинов с одинаковыми обозначениями SKU | Отберите магазин либо включите его в ключ |
| Независимые партии одного товара | Решите, нужен ли отчёт по партиям или согласованный суммарный остаток |
| Повторная загрузка одной записи | Устраните причину дубля и сформируйте чистую копию |
Не удаляйте строки только по совпадению пары: две партии могут быть законными частями остатка. Не выбирайте случайное первое значение ради успешного запуска. Суммирование допустимо лишь после подтверждения, что строки действительно складываются в один показатель.
Повторите разворот и сверьте результат
Когда в stocks осталась ровно одна запись на пару, выполните:
assert not stocks.duplicated(keys).any()
wide = stocks.pivot(index="sku", columns="warehouse", values="qty")
Возьмите несколько реальных пар из разных складов и сопоставьте их значения до и после разворота. Отдельно проверьте товар, который был в конфликтном файле. Пустую ячейку не заменяйте нулём автоматически: отсутствие записи требует своего правила учёта.
Сохраните матрицу вместе с моментом снимка, магазином и решением по каждой группе конфликтов. Результат готов для сравнения складов, когда можно восстановить происхождение значения каждой выбранной ячейки. Это аналитическая проверка файла, а не команда обновления остатков на площадке.
Комментарии 0