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

Мини-проект: магазин из трёх таблиц

Собрать данные магазина из заказов, справочника товаров и справочника клиентов, проверить соединение, сверить с готовой таблицей и посчитать то, чего раньше не было, — прибыль и маржу по городам и товарам, доставку по каналам.

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

Весь курс мы пользовались готовой таблицей shop_orders.csv. Теперь соберём её сами — из трёх таблиц, как они лежат в базе магазина: заказы, справочник товаров, справочник клиентов. А заодно получим то, чего в готовой таблице не было: себестоимость, а значит, и прибыль. Новых методов в проекте нет.

[ ]Три таблицы
import pandas as pd

orders = pd.read_csv("data/orders.csv")
products = pd.read_csv("data/products.csv")
customers = pd.read_csv("data/customers.csv")
print(orders.shape, products.shape, customers.shape)
orders.head(3)
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
(2448, 6) (20, 5) (240, 5)
order_id date customer_id product_id quantity channel
0 10001 2025-01-01 C095 P18 2 маркетплейс
1 10001 2025-01-01 C095 P09 1 маркетплейс
2 10002 2025-01-01 C059 P10 1 приложение

Шаг 1. Проверить ключи

Прежде чем соединять, убедимся, что в справочниках ключ не повторяется: иначе строки размножатся.

[ ]Упражнение 1Уникальны ли ключи решено

Сохраните в product_key_ok, уникальны ли значения product_id в таблице products; в customer_key_ok — уникальны ли customer_id в customers; в order_key_ok — уникальны ли order_id в orders.

product_key_ok = ...
customer_key_ok = ...
order_key_ok = ...

В справочниках ключи уникальны — так и должно быть. В заказах order_id повторяется, и это тоже нормально: заказ состоит из нескольких строк. Значит, оба соединения будут «многие к одному».

Шаг 2. Заказы и товары

[ ]Упражнение 2Выручка и прибыль строки решено

Соедините orders с products по product_id и сохраните в lines; попросите pandas проверить, что соединение «многие к одному». Добавьте столбцы revenue (цена × количество) и profit — прибыль: (цена − себестоимость) × количество.

lines = ...
# добавьте в lines столбцы revenue и profit

Шаг 3. Добавить покупателей

[ ]Упражнение 3Город и сегмент решено

Добавьте к lines город и сегмент покупателя и сохраните в full. Из справочника customers возьмите только три столбца: customer_id, city, segment.

full = ...

Шаг 4. Сверка

Собранную таблицу стоит сверить с чем-нибудь известным. У нас есть готовая shop_orders.csv — сравним выручку по городам:

[ ]Наша сборка против готовой таблицы
shop = pd.read_csv("data/shop_orders.csv")
shop["revenue"] = shop["price"] * shop["quantity"]
ours = full.groupby("city")["revenue"].sum()
theirs = shop.groupby("city")["revenue"].sum()
print((ours == theirs).all())
print(ours.sum(), theirs.sum())
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
True
3301420 3301420

Выручка каждого города совпала, общий итог тоже. У обоих Series одинаковые метки в одинаковом порядке (группировка сортирует города по алфавиту), поэтому их можно сравнить через ==; all() подтверждает, что совпало всё.

Шаг 5. Прибыль по городам

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

[ ]Упражнение 4Города решено

Сохраните в city_table таблицу по городам (город в индексе): revenue — выручка, profit — прибыль, margin — маржа, округлённая до трёх знаков. Отсортируйте по убыванию прибыли.

city_table = ...

Шаг 6. Прибыль по товарам

[ ]Упражнение 5Что приносит деньги решено

Сохраните в product_table плоскую таблицу по товарам со столбцами category, name, revenue, profit, margin (три знака). В top_profit сохраните три товара с наибольшей прибылью, в low_margin — три товара с наименьшей маржой.

product_table = ...
top_profit = ...
low_margin = ...

Шаг 7. Доставка по каналам

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

[ ]Упражнение 6Срок и оценка решено

Склейте файлы data/delivery_h1.csv и data/delivery_h2.csv в таблицу delivery. Соберите order_table: сверните full до заказов — плоская таблица order_id, channel, total (сумма revenue), — и присоедините к ней delivery по order_id с проверкой «один к одному». В channel_delivery сохраните средний срок (days) и среднюю оценку (rating) по каналам, округлённые до двух знаков.

delivery = ...
order_table = ...
channel_delivery = ...

Итог

[ ]Сводка
print("Выручка:", full["revenue"].sum(), "· прибыль:", full["profit"].sum(), "· маржа:", round(full["profit"].sum() / full["revenue"].sum(), 3))
print(city_table)
print(channel_delivery)
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
Выручка: 3301420 · прибыль: 1542150 · маржа: 0.467
                 revenue  profit  margin
city
Москва           1310110  612070   0.467
Санкт-Петербург   803720  375160   0.467
Казань            440150  204610   0.465
Екатеринбург      423350  198470   0.469
Новосибирск       324090  151840   0.469
             days  rating
channel
маркетплейс  5.25    3.33
приложение   3.99    3.78
сайт         3.95    3.76
Итог появится, когда решите все упражнения урока, — в нём ответы. Ячейку можно и выполнить.

Выводы

  • За год магазин заработал 1.54 млн ₽ прибыли с 3.3 млн ₽ выручки — маржа 47 %.
  • Маржа по городам одинакова: 46.5–46.9 %. Города отличаются объёмом, а не выгодностью.
  • Больше всего прибыли приносят кофе в пачках по 250 г. Килограммовые пачки продаются на те же суммы, но маржа у них самая низкая — около 40 %.
  • Маркетплейс везёт заказы на день с лишним дольше (5.3 дня против 4.0), и оценки у него ниже: 3.3 против 3.8. Возможно, поэтому на маркетплейс реже возвращаются.
Выводы с ответами появятся, когда решите все упражнения урока.

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

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

Практика по модулю

Задачи по pandas для самостоятельной практики появятся в разделе «Задачи → pandas».

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