К новому году «Кофейная лавка» пересматривает цены. Владелец прислал правила:
- Цены растут по категориям: кофе — на 8 %, чай — на 5 %, сладости — на 12 %, посуда и аксессуары — на 3 %.
- Новые цены округляются до десятков рублей.
- Товары, которые уже стоят 1500 ₽ и больше, не дорожают.
Нужно собрать новый прайс-лист и показать, что изменилось. Новых методов в проекте нет — только приёмы этого модуля.
import numpy as np
import pandas as pd
price_list = pd.read_csv("data/products.csv")
growth = {"Кофе": 1.08, "Чай": 1.05, "Сладости": 1.12, "Посуда": 1.03, "Аксессуары": 1.03}
price_list.head(3)| product_id | name | category | price | cost | |
|---|---|---|---|---|---|
| 0 | P01 | Эспрессо-смесь 1 кг | Кофе | 1450 | 870 |
| 1 | P02 | Колумбия 250 г | Кофе | 690 | 380 |
| 2 | P03 | Эфиопия 250 г | Кофе | 790 | 430 |
Шаг 1. Множитель для каждого товара
В словаре growth — множитель цены для каждой категории. Добавьте в price_list столбец factor — множитель
товара по его категории.
map столбца category.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
# добавьте в price_list столбец factorУпражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
price_list["factor"] = price_list["category"].map(growth)Шаг 2. Новая цена
Метод round умеет округлять не только до знаков после запятой. Отрицательное число знаков округляет
до десятков, сотен и так далее: round(-1) — до десятков, round(-2) — до сотен.
print(round(1566.4, -1))
print(pd.Series([1566.4, 745.2, 273.0]).round(-1).tolist())1570.0 [1570.0, 750.0, 270.0]
Добавьте в price_list столбец new_price: прежняя цена, умноженная на множитель и округлённая до десятков
рублей.
(price_list["price"] * price_list["factor"]).round(-1).Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
# добавьте в price_list столбец new_priceУпражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
price_list["new_price"] = (price_list["price"] * price_list["factor"]).round(-1)Шаг 3. Дорогие товары не дорожают
Сохраните в is_costly маску товаров с прежней ценой (price) от 1500 ₽. Затем запишите этим товарам
в new_price их прежнюю цену.
price_list.loc[is_costly, "new_price"].price_list.loc[is_costly, "price"].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
is_costly = ...
# верните прежнюю цену дорогим товарамУпражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
is_costly = price_list["price"] >= 1500
price_list.loc[is_costly, "new_price"] = price_list.loc[is_costly, "price"]Шаг 4. Что изменилось
Добавьте в price_list столбец change — на сколько рублей выросла цена (новая минус прежняя) — и столбец
status: «подорожал», если change больше нуля, и «без изменений» в остальных случаях. В n_up сохраните
число подорожавших товаров.
np.where(price_list["change"] > 0, "подорожал", "без изменений").price_list["status"] == "подорожал".Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
# добавьте в price_list столбцы change и status
n_up = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
price_list["change"] = price_list["new_price"] - price_list["price"]
price_list["status"] = np.where(price_list["change"] > 0, "подорожал", "без изменений")
n_up = (price_list["status"] == "подорожал").sum()Шаг 5. Прайс-лист для печати
Сохраните в final таблицу для печати: столбцы category, name, price, new_price, change — в этом
порядке; категории по алфавиту, внутри категории — от дорогих товаров к дешёвым по новой цене.
price_list.sort_values(["category", "new_price"], ascending=[True, False]).Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
final = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
final = price_list.sort_values(["category", "new_price"], ascending=[True, False])[["category", "name", "price", "new_price", "change"]]final.head(8)| category | name | price | new_price | change | |
|---|---|---|---|---|---|
| 17 | Аксессуары | Кофемолка ручная | 3200 | 3200.0 | 0.0 |
| 19 | Аксессуары | Термокружка | 1150 | 1180.0 | 30.0 |
| 18 | Аксессуары | Фильтры бумажные | 240 | 250.0 | 10.0 |
| 0 | Кофе | Эспрессо-смесь 1 кг | 1450 | 1570.0 | 120.0 |
| 3 | Кофе | Бразилия 1 кг | 1290 | 1390.0 | 100.0 |
| 2 | Кофе | Эфиопия 250 г | 790 | 850.0 | 60.0 |
| 4 | Кофе | Кофе без кофеина 250 г | 720 | 780.0 | 60.0 |
| 1 | Кофе | Колумбия 250 г | 690 | 750.0 | 60.0 |
Новые цены показаны с дробной частью (3200.0): после умножения на множитель столбец стал дробным,
и округление этого не меняет. Для печати его можно вернуть к целым — .astype("int64").
Шаг 6. Главное для владельца
Сохраните в top5 пять товаров с наибольшим ростом цены в рублях — столбцы name и change. В avg_growth
сохраните, на какую долю вырос прайс-лист в целом: сумма новых цен, делённая на сумму прежних, минус 1.
price_list.nlargest(5, "change")[["name", "change"]].price_list["new_price"].sum() / price_list["price"].sum() - 1.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
top5 = ...
avg_growth = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
top5 = price_list.nlargest(5, "change")[["name", "change"]]
avg_growth = price_list["new_price"].sum() / price_list["price"].sum() - 1print("товаров:", len(price_list), "· подорожало:", n_up)
print("сумма прайс-листа:", price_list["price"].sum(), "→", int(price_list["new_price"].sum()), "₽")
print("рост в целом:", round(avg_growth * 100, 1), "%")
print(price_list["status"].value_counts())товаров: 20 · подорожало: 17 сумма прайс-листа: 18160 → 18850 ₽ рост в целом: 3.8 % status подорожал 17 без изменений 3 Name: count, dtype: int64
Выводы
Подорожали 17 товаров из 20; три самых дорогих остались при прежней цене. Сильнее всего в рублях выросли килограммовые пачки кофе: 8 % от большой цены — это сто рублей и больше. В процентах заметнее всего подорожали сладости, но в рублях это 20–40 ₽. В целом прайс-лист вырос на 3.8 % — меньше любого из множителей, кроме «посудного»: три замороженные цены — самые крупные в списке, и они тянут общий рост вниз.
По пути мы сделали всё, чему учит модуль: добавили столбцы, перевели категории в числа словарём, изменили
часть значений через loc, построили столбец по условию и отсортировали результат.