Нашли ошибку?
Скачать чистый
мини-проект≈ 25 минупражнения: 0 из 6

Итоговый проект: данные

Собрать рабочую таблицу магазина из четырёх файлов: заказы, справочник товаров, грязная выгрузка клиентов и журнал возвратов. Почистить, убрать дубли, соединить с проверками, посчитать выручку с учётом возвратов и прибыль, сверить итог.

Python запустится при первом выполнении

Итоговый проект курса — в двух частях. В этой части вы соберёте данные, в следующей — напишете отчёт.

Год закончился, и владелец «Кофейной лавки» хочет знать, сколько магазин на самом деле заработал: с учётом себестоимости и возвратов. Готовой таблицы для этого нет. Есть четыре файла, как они лежат в разных системах магазина:

Файл Что в нём Состояние
orders.csv строки заказов: заказ, дата, покупатель, товар, количество, канал чистый
products.csv справочник товаров: название, категория, цена, себестоимость чистый
customers_raw.csv выгрузка клиентов из CRM грязный: пробелы, регистр, дубли
returns_raw.csv журнал возвратов грязный: дубли

Новых методов нет — только то, что вы уже умеете. Подсказок меньше, чем обычно: это проверка себя.

Шаг 1. Загрузка

[ ]Упражнение 1Четыре файла решено

Загрузите файлы в таблицы orders, products, customers_raw, returns_raw. Столбец date в orders должен быть настоящей датой.

import pandas as pd

orders = ...
products = ...
customers_raw = ...
returns_raw = ...

[ ]Грязные выгрузки
print(customers_raw.head(4))
print(returns_raw.head(4))
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
  customer_id         name          city signup_date     segment  \
0        C001    Сергей Ю.           Екб  2025-06-12  постоянный
1        C002   Сергей В.   екатеринбург  2025-01-14      новый
2        C003    Максим С.           Екб  2025-05-19       новый
3        C004    Андрей Д.        москва  2023-09-15       НОВЫЙ

                     email  bonus
0  client001@lavka.example    120
1  client002@lavka.example  2 400
2  client003@lavka.example     50
3  client004@lavka.example   1900
  return_id  order_id product_id return_date  quantity               reason
0      R001     10001        P18  17.01.2025         2                 брак
1      R002     10010        P16  2025-01-19         1  повреждена упаковка
2      R003     10012        P01  21.01.2025         2            передумал
3      R004     10018        P03  2025-01-15         5   не понравился вкус

Шаг 2. Клиенты

Из выгрузки клиентов для отчёта нужны три столбца: код, город и сегмент. Все три нужно почистить — вы уже делали это в модуле об очистке.

[ ]Упражнение 2Чистый справочник клиентов решено

Соберите таблицу customers из трёх столбцов — customer_id, city, segment: коды без пробелов и с заглавной буквой; города — пять названий без сокращений (словарь short уже есть); сегменты — три значения строчными буквами. Один клиент — одна строка; индекс с нуля.

short = {"Спб": "Санкт-Петербург", "С.-Петербург": "Санкт-Петербург", "Екб": "Екатеринбург"}
customers = ...

Шаг 3. Возвраты

В журнале возвратов два вида дублей: записи, сохранённые дважды, и возвраты, оформленные повторно под новым номером. Возврат — это позиция заказа: пара «заказ, товар».

[ ]Упражнение 3Чистый журнал возвратов решено

Соберите таблицу returns: по одной строке на возвращённую позицию, столбцы order_id, product_id и returned (число возвращённых штук — переименованный столбец quantity); индекс с нуля.

returns = (
    returns_raw
    # допишите шаги цепочки
)

Шаг 4. Соединение

Три соединения — и каждое стоит проверить параметром validate: заказы с товарами и с клиентами — «многие к одному», с возвратами — «один к одному» по двум ключам. Возвраты есть не у всех позиций.

[ ]Упражнение 4Одна таблица решено

Соедините orders с products, customers и returns и сохраните в data. Все 2448 строк заказов должны остаться.

data = (
    orders
    # допишите три соединения
)

Если бы в справочнике клиентов остались дубли, validate остановил бы соединение ошибкой — и это лучше, чем размноженные строки и завышенная выручка.

Шаг 5. Деньги

[ ]Упражнение 5Выручка, возвраты, прибыль решено

В столбце returned замените пропуски нулями и сделайте его целым. Добавьте в data три столбца:

  • revenue — выручка: цена × количество;
  • net — выручка за вычетом возвратов: цена × (количество − возвращено);
  • profit — прибыль с проданного и не возвращённого: (цена − себестоимость) × (количество − возвращено).
# заполните пропуски в data["returned"] и добавьте столбцы revenue, net, profit

Шаг 6. Проверка

Собранной таблице нельзя верить на слово. Три проверки: сверка с известным итогом, отсутствие пропусков и здравый смысл.

[ ]Упражнение 6Сходится ли решено

У нас есть готовая таблица shop — сверим с ней выручку по городам. Сохраните в ours выручку (revenue) по городам в data, в theirs — в shop. В cities_match — одно значение True или False: совпали ли все города. В no_gaps — True, если во всей таблице data нет ни одного пропуска. В lost — сколько рублей выручки ушло в возвраты.

shop = pd.read_csv("data/shop_orders.csv")
shop["revenue"] = shop["price"] * shop["quantity"]
ours = ...
theirs = ...
cities_match = ...
no_gaps = ...
lost = ...

[ ]Рабочая таблица
print(data.shape)
print(list(data.columns))
data[["date", "name", "city", "segment", "quantity", "returned", "revenue", "net", "profit"]].head(4)
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
(2448, 16)
['order_id', 'date', 'customer_id', 'product_id', 'quantity', 'channel', 'name', 'category', 'price', 'cost', 'city', 'segment', 'returned', 'revenue', 'net', 'profit']
date name city segment quantity returned revenue net profit
0 2025-01-01 Кофемолка ручная Москва новый 2 2 6400 0 0
1 2025-01-01 Травяной сбор 50 г Москва новый 1 0 260 260 160
2 2025-01-01 Шоколад горький Москва постоянный 1 0 180 180 90
3 2025-01-01 Чёрный чай 100 г Москва постоянный 1 0 350 350 200
Итог появится, когда решите все упражнения урока, — в нём ответы. Ячейку можно и выполнить.

Что получилось

Из четырёх файлов — одна таблица: 2448 строк, 16 столбцов, ни одного пропуска. Выручка по городам совпала с известной. Возвраты уменьшили выручку на 142 тысячи рублей — 4.3 %.

Выводы с ответами появятся, когда решите все упражнения урока.

По дороге были сделаны все шаги, которые отличают аккуратную работу от «как-нибудь»:

  • грязные таблицы почищены до соединения;
  • дубли удалены по правильному ключу;
  • каждое соединение проверено: тип связи и число строк;
  • пропуски после соединения заполнены осмысленно;
  • итог сверен с независимым источником.

В следующем уроке эта таблица станет отчётом.

Подробнее в справочнике

Нашли ошибку?