Кофейная лавка продаёт зерно и чай оптом и в розницу. Нужен прайс-лист: для каждого товара — цена при покупке 1, 5, 10 и 50 штук. Таблица — товары × количества, и у каждого набора исходных чисел своя «форма»:
- себестоимость — у каждого товара своя: столбец (по строке на товар);
- количество штук
amounts— 1, 5, 10, 50: строка (по столбцу на количество); - скидка за объём — своя у каждого количества: тоже строка;
- наценка — своя у каждого товара: снова столбец.
import numpy as np
goods = ["эспрессо-смесь 1 кг", "колумбия 250 г", "эфиопия 250 г", "чёрный чай 100 г", "фильтры"]
cost = np.array([870, 380, 430, 150, 250]) # себестоимость штуки, ₽
markup = np.array([1.5, 1.6, 1.6, 2.0, 2.2]) # наценка товара
amounts = np.array([1, 5, 10, 50]) # варианты количества
volume_discount = np.array([0, 0.05, 0.10, 0.20]) # скидка за объём
print(cost.shape, markup.shape, amounts.shape, volume_discount.shape)(5,) (5,) (4,) (4,)
Шаг 1. Себестоимость партии
Сохраните в base таблицу себестоимости партии: строка — товар, столбец — количество из amounts.
cost[:, np.newaxis]; количество — строкой.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
base = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
base = cost[:, np.newaxis] * amountsШаг 2. Скидка за объём
Скидки за объём — в volume_discount (0.05 — 5 %). Сохраните в discounted таблицу base со скидками:
каждый столбец умножается на 1 - скидка своего количества.
np.newaxis.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
discounted = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
discounted = base * (1 - volume_discount)Шаг 3. Наценка
Наценка каждого товара — множитель в markup. Сохраните в price цену для покупателя: discounted, умноженная
на наценку своего товара.
markup[:, np.newaxis].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
price = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
price = discounted * markup[:, np.newaxis]Шаг 4. Целые рубли
Округлите price до целых рублей и сохраните в price_list массивом целого типа.
np.round(price) — округление, astype(int) — целый тип.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
price_list = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
price_list = np.round(price).astype(int)print(price[4, 1], "→", price_list[4, 1])2612.5 → 2612
Цена 2612.5 превратилась в 2612, а не в 2613: половинки округляются к чётному, как в уроке о статистике. Для прайс-листа это приемлемо, но в бухгалтерии правило округления задают явно.
Шаг 5. Цена за штуку
Сохраните в per_unit цену одной штуки в каждой ячейке прайс-листа: price_list, делённый на количество
своего столбца.
amounts: деление транслируется само.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
per_unit = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
per_unit = price_list / amountsШаг 6. Что влезает в бюджет
У покупателя 5000 ₽. Сохраните в affordable для каждого товара число вариантов количества, которые стоят
не больше 5000 ₽ (по price_list).
price_list <= 5000 — таблица того же размера.True в каждой строке — сумма по axis=1.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
affordable = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
affordable = (price_list <= 5000).sum(axis=1)Шаг 7. Сколько экономит скидка
Без скидок за объём цена была бы base * наценка. Сохраните в savings экономию покупателя при покупке
10 штук каждого товара (столбец с индексом 2): цена без скидки минус price.
base * markup[:, np.newaxis].[:, 2].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
savings = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
full = base * markup[:, np.newaxis]
savings = (full - price)[:, 2]Выводы
print("количество:", amounts)
for name, row in zip(goods, price_list):
print(f"{name:>20}: {row}") # :>20 — выровнять название по правому краю на 20 символов
print("экономия на 10 штуках всего ассортимента:", round(savings.sum()), "₽")количество: [ 1 5 10 50]
эспрессо-смесь 1 кг: [ 1305 6199 11745 52200]
колумбия 250 г: [ 608 2888 5472 24320]
эфиопия 250 г: [ 688 3268 6192 27520]
чёрный чай 100 г: [ 300 1425 2700 12000]
фильтры: [ 550 2612 4950 22000]
экономия на 10 штуках всего ассортимента: 3451 ₽Весь прайс-лист — четыре массива (два столбца и две строки) и одно выражение
cost[:, np.newaxis] * amounts * (1 - volume_discount) * markup[:, np.newaxis]. Добавится товар или новый
вариант количества — формула не изменится.