Менеджер «Кофейной лавки» прислал список вопросов. На каждый можно ответить выборкой — приёмами этого модуля. Новых методов в проекте нет.
import pandas as pd
orders = pd.read_csv("data/shop_orders.csv")
orders.head(3)| order_id | date | customer_id | city | channel | category | product | price | quantity | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 10001 | 2025-01-01 | C095 | Москва | маркетплейс | Аксессуары | Кофемолка ручная | 3200 | 2 |
| 1 | 10001 | 2025-01-01 | C095 | Москва | маркетплейс | Чай | Травяной сбор 50 г | 260 | 1 |
| 2 | 10002 | 2025-01-01 | C059 | Москва | приложение | Сладости | Шоколад горький | 180 | 1 |
Вопрос 1. Крупные покупки в Казани
«Покажи строки из Казани, где одна позиция принесла 5000 ₽ и больше».
Столбца с выручкой в таблице нет — есть цена и количество. Но маску можно построить по любому Series той же длины, не только по столбцу таблицы: посчитаем выручку отдельно и сравним её с порогом.
Сохраните в revenue выручку каждой строки (цена × количество), а в kazan_big — строки таблицы orders,
где город — Казань и выручка строки не меньше 5000.
revenue >= 5000 — такая же маска, как от сравнения столбца.orders[(orders["city"] == "Казань") & (revenue >= 5000)].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
revenue = ...
kazan_big = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
revenue = orders["price"] * orders["quantity"]
kazan_big = orders[(orders["city"] == "Казань") & (revenue >= 5000)]Вопрос 2. Правда ли, что зимой чаще берут чай?
Нужно сравнить долю чая в зимних строках и в остальных. Зима — декабрь, январь и февраль. Даты в таблице пока хранятся текстом, но в формате «год-месяц-день» с ведущими нулями. Такие строки сравниваются правильно: текст сравнивается символ за символом слева направо, а слева стоит самое важное — год, потом месяц, потом день.
print(orders["date"].min(), orders["date"].max())
print("2025-02-28" < "2025-03-01")
print((orders["date"] >= "2025-12-01").sum())2025-01-01 2025-12-31 True 329
С настоящими датами работать удобнее — до них дойдём в модуле об очистке. Пока хватит сравнения строк.
И ещё одно: маской можно отбирать значения не только у таблицы, но и у любого Series той же длины —
в том числе у другой маски. Например, если is_big — маска крупных покупок, а is_kazan — маска строк Казани,
то is_big[is_kazan] — значения is_big только в строках Казани, а их среднее — доля крупных покупок среди
казанских.
Сохраните в is_winter маску зимних строк: дата раньше 1 марта или не раньше 1 декабря. В is_tea — маску
строк с категорией «Чай». Затем посчитайте tea_winter — долю чая среди зимних строк и tea_rest — долю чая
среди остальных.
(orders["date"] < "2025-03-01") | (orders["date"] >= "2025-12-01").Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
is_winter = ...
is_tea = ...
tea_winter = ...
tea_rest = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
is_winter = (orders["date"] < "2025-03-01") | (orders["date"] >= "2025-12-01")
is_tea = orders["category"] == "Чай"
tea_winter = is_tea[is_winter].mean()
tea_rest = is_tea[~is_winter].mean()Вопрос 3. Маркетплейс против сайта
«На маркетплейсе покупают более дорогие товары, чем на сайте?»
Сохраните в site_price среднюю цену товара в строках с каналом «сайт», в market_price — с каналом
«маркетплейс». В market_costly сохраните долю строк с ценой от 1000 ₽ среди строк маркетплейса.
orders.loc[orders["channel"] == "сайт", "price"] — цены в нужных строках; у них есть mean().Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
site_price = ...
market_price = ...
market_costly = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
site_price = orders.loc[orders["channel"] == "сайт", "price"].mean()
market_price = orders.loc[orders["channel"] == "маркетплейс", "price"].mean()
market_costly = (orders.loc[orders["channel"] == "маркетплейс", "price"] >= 1000).mean()Вопрос 4. Где покупают самое дорогое
Сохраните в pricey_cities, сколько строк с ценой выше 2000 приходится на каждый город, а в pricey_moscow —
число таких строк в Москве.
orders.loc[orders["price"] > 2000, "city"], затем value_counts().Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
pricey_cities = ...
pricey_moscow = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
pricey_cities = orders.loc[orders["price"] > 2000, "city"].value_counts()
pricey_moscow = pricey_cities["Москва"]Вопрос 5. Рекордная покупка
У Series, как и у таблицы, есть iloc: столбец.iloc[0] — первое по порядку значение.
Сохраните в record строку таблицы с наибольшим количеством штук — таблицей из одной строки. В record_city
сохраните город этой покупки — строкой текста.
orders["quantity"] == orders["quantity"].max().record["city"].iloc[0].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
record = ...
record_city = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
record = orders[orders["quantity"] == orders["quantity"].max()]
record_city = record["city"].iloc[0]Ответы менеджеру
print("крупных покупок в Казани:", len(kazan_big))
print("доля чая зимой:", round(tea_winter * 100, 1), "% · в остальное время:", round(tea_rest * 100, 1), "%")
print("средняя цена: сайт", round(site_price), "₽ · маркетплейс", round(market_price), "₽")
print("покупок дороже 2000 ₽ в Москве:", pricey_moscow, "из", pricey_cities.sum())
print("рекорд:", record["quantity"].iloc[0], "шт. —", record["product"].iloc[0], "·", record_city)крупных покупок в Казани: 5 доля чая зимой: 35.1 % · в остальное время: 24.6 % средняя цена: сайт 677 ₽ · маркетплейс 728 ₽ покупок дороже 2000 ₽ в Москве: 26 из 66 рекорд: 10 шт. — Кофе без кофеина 250 г · Новосибирск
Выводы
- Крупных покупок в Казани всего пять: кофемолки и оптовые партии кофе.
- Зимой чай действительно берут чаще: 35 % строк против 25 % в остальное время.
- На маркетплейсе средняя цена товара выше, чем на сайте: 728 ₽ против 677 ₽ — там чаще покупают дорогие позиции.
- Покупки дороже 2000 ₽ распределены по городам примерно так же, как все покупки: больше всего — в Москве.
Каждый ответ — это фильтр и простой итог. Но считать отдельно по каждому каналу и городу утомительно: три канала — три строки кода. В модуле о группировке pandas сделает это одной командой.