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

Мини-проект: новый прайс-лист

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

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

К новому году «Кофейная лавка» пересматривает цены. Владелец прислал правила:

  1. Цены растут по категориям: кофе — на 8 %, чай — на 5 %, сладости — на 12 %, посуда и аксессуары — на 3 %.
  2. Новые цены округляются до десятков рублей.
  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. Множитель для каждого товара

[ ]Упражнение 1Множитель по категории решено

В словаре growth — множитель цены для каждой категории. Добавьте в price_list столбец factor — множитель товара по его категории.

# добавьте в price_list столбец factor

Шаг 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]
[ ]Упражнение 2Цена с округлением решено

Добавьте в price_list столбец new_price: прежняя цена, умноженная на множитель и округлённая до десятков рублей.

# добавьте в price_list столбец new_price

Шаг 3. Дорогие товары не дорожают

[ ]Упражнение 3Заморозить цены решено

Сохраните в is_costly маску товаров с прежней ценой (price) от 1500 ₽. Затем запишите этим товарам в new_price их прежнюю цену.

is_costly = ...
# верните прежнюю цену дорогим товарам

Шаг 4. Что изменилось

[ ]Упражнение 4Изменение и статус решено

Добавьте в price_list столбец change — на сколько рублей выросла цена (новая минус прежняя) — и столбец status: «подорожал», если change больше нуля, и «без изменений» в остальных случаях. В n_up сохраните число подорожавших товаров.

# добавьте в price_list столбцы change и status
n_up = ...

Шаг 5. Прайс-лист для печати

[ ]Упражнение 5Отсортировать и оставить нужное решено

Сохраните в final таблицу для печати: столбцы category, name, price, new_price, change — в этом порядке; категории по алфавиту, внутри категории — от дорогих товаров к дешёвым по новой цене.

final = ...

[ ]Начало прайс-листа
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. Главное для владельца

[ ]Упражнение 6Самые подорожавшие и общий рост решено

Сохраните в top5 пять товаров с наибольшим ростом цены в рублях — столбцы name и change. В avg_growth сохраните, на какую долю вырос прайс-лист в целом: сумма новых цен, делённая на сумму прежних, минус 1.

top5 = ...
avg_growth = ...

[ ]Итог
print("товаров:", 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, построили столбец по условию и отсортировали результат.

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

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

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

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