Раздел 42 · Аналитика данных с нуля

Python: условия, цикл и подсчёт покупок

junior~25 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Бран · продюсер «Хроник Пограничья»

В учебной выгрузке есть оплаты, возврат и незавершённая покупка. Посчитай оплаченные покупки Android от 100 рублей. Затем покажи, сколько оплат пришло с каждой платформы. Возврат не должен увеличить ни сумму, ни число оплат.

В предыдущем уроке ты собрал список словарей. Теперь научишь Python выбирать строки и повторять действие для каждой записи. Это знакомая идея WHERE, SUM и GROUP BY, только шаги ты укажешь явно.

Сначала проверка одной покупки

Начни с ячейки, которая ничего не берёт из предыдущих:

purchase = {"platform": "android", "amount_rub": 399, "status": "paid"}
print(purchase["status"] == "paid")
print(purchase["amount_rub"] >= 100)
print(purchase["platform"] == "ios")

Результат:

True
True
False

== сравнивает два значения. Не путай его с =: один знак присваивает значение имени, два знака проверяют равенство. >= означает «больше или равно».

Сравнение возвращает логическое значение, bool: True или False. Первую букву пиши заглавной, кавычки не нужны. Строка "False" была бы текстом, а не результатом сравнения.

Для чисел доступны <, <=, >, >=. Для неравенства есть !=: выражение purchase["status"] != "paid" в этой ячейке даст False.

Выполнить команду только при условии

Ещё одна отдельная ячейка, с одной покупкой:

purchase = {"amount_rub": 399, "status": "paid"}
if purchase["status"] == "paid":
    print(purchase["amount_rub"])
else:
    print(0)

Получишь 399. if читается как «если». После него идёт условие, затем двоеточие. Строка с отступом в четыре пробела выполняется только при True. else означает «иначе», тоже заканчивается двоеточием, но своего условия не имеет.

Отступ определяет, какие команды принадлежат ветке. В Jupyter и редакторе задач вводи четыре пробела, не смешивай пробелы с табуляцией. Если убрать отступ после if, Python сообщит IndentationError и не выполнит ячейку.

Можно различить и три состояния:

status = "refunded"
if status == "paid":
    print("оплата")
elif status == "refunded":
    print("возврат")
else:
    print("не завершена")

Вывод: возврат. elif читается как «иначе, если». Python проверяет ветки сверху вниз и выполняет первую подходящую. Здесь первая проверка ложна, вторая истинна, до else дело не доходит.

В этом учебном примере договор о данных допускает только paid, refunded и pending. Поэтому последняя ветка обозначает pending. Для настоящей выгрузки нельзя молча считать любой неизвестный статус незавершённой покупкой: сначала узнай допустимые значения.

Соединить условия

Одна покупка должна пройти сразу три проверки:

purchase = {"platform": "android", "amount_rub": 399, "status": "paid"}
include = (
    purchase["status"] == "paid"
    and purchase["platform"] == "android"
    and purchase["amount_rub"] >= 100
)
print(include)

Получишь True. Скобки позволяют перенести одно выражение на несколько строк. and соединяет условия по правилу «все выполнены».

Ещё две операции: or требует хотя бы одно истинное условие, not меняет True на False и наоборот. В этой ячейке обе строки дадут True:

platform = "ios"
is_refund = False
print(platform == "android" or platform == "ios")
print(not is_refund)

В SQL ты написал бы AND, OR, NOT. В Python эти слова строчные. Здесь они соединяют отдельные сравнения, каждое даёт одно логическое значение. Не переноси эту форму механически на столбцы будущей таблицы pandas: столбец содержит много значений, правила работы с ним будут другими.

урок из курса

Урок из курса «Аналитика данных с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.