МастерскаяШкольникам, студентам и родителям

Аналитик данных или backend-разработчик: две задачи из работы с ответами

Аналитик считает покупки по таблице, backend-разработчик задаёт правила приёма заявок на сайте. Попробуйте обе задачи: вручную или на Python, с готовыми ответами для проверки.

Асадов Али10 мин чтения
Аналитик данных или backend-разработчик: две задачи из работы с ответами

«Люблю компьютеры» — пока слишком широкий ответ для выбора между аналитикой данных и backend-разработкой. Обе работы могут включать Python и таблицы. Разница становится заметнее, когда нужно что-то сделать: ответить на вопрос по данным или задать поведение программы.

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

Проба аналитика: что на самом деле купили

Организатор кружка спрашивает: «Какое направление принесло больше оплаченных продаж в этой таблице?» Сначала нужно уточнить два слова: продаж — количество заказов или сумма денег? В примере посчитаем оба показателя, чтобы не скрыть различие.

Скопируйте данные в электронную таблицу или обычный текстовый файл. Одна строка — один заказ. paid означает оплачен, cancelled — отменён, refunded — полностью возвращён. Для этой задачи учитываем только текущий статус paid; календаря платежей здесь нет.

order_id,subject,amount,status
101,math,1200,paid
102,python,1800,paid
103,math,1200,cancelled
104,python,1800,paid
105,design,1500,refunded
106,math,1200,paid
107,design,1500,paid
108,python,1800,cancelled

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

Можно начать вручную. Подчеркните оплаченные заказы, выпишите их номера и проверьте, что один номер не учтён дважды. Затем сложите суммы отдельно для каждого направления. Код понадобится, если захотите повторить вычисление автоматически.

Проверяемый результат

Направление Оплаченных заказов Сумма, ₽
Python 2 3 600
Математика 2 2 400
Дизайн 1 1 500
Всего 5 7 500

Python лидирует по сумме, а по количеству делит первое место с математикой. Из этих восьми строк нельзя сделать вывод, что направление прибыльнее: нет затрат. Нельзя узнать и долю покупателей среди всех, кому предложили курс: такого общего числа в таблице нет. Эту долю называют конверсией в покупку.

Это важная часть аналитической работы. Красивый график не исправит неправильно определённый показатель. Если включить отменённые и возвращённые заказы, получится сумма 12 000 ₽, которая не отвечает на поставленный вопрос.

Та же задача на Python и SQL

Если Python уже установлен, сохраните пример в файл trial.py и запустите python3 trial.py либо python trial.py — в зависимости от команды в вашей системе. В коде только стандартные модули; дополнительные пакеты не нужны.

import csv
import io
import sqlite3

data = """order_id,subject,amount,status
101,math,1200,paid
102,python,1800,paid
103,math,1200,cancelled
104,python,1800,paid
105,design,1500,refunded
106,math,1200,paid
107,design,1500,paid
108,python,1800,cancelled
"""
db = sqlite3.connect(":memory:")
db.execute("CREATE TABLE orders (id INTEGER PRIMARY KEY, subject TEXT, amount INTEGER, status TEXT)")
rows = csv.DictReader(io.StringIO(data))
db.executemany("INSERT INTO orders VALUES (?, ?, ?, ?)", [
    (int(r["order_id"]), r["subject"], int(r["amount"]), r["status"])
    for r in rows
])
query = """SELECT subject, COUNT(*), SUM(amount)
           FROM orders WHERE status = 'paid'
           GROUP BY subject ORDER BY SUM(amount) DESC"""
for result in db.execute(query):
    print(result)
db.close()

Ожидаемые строки вывода: ('python', 2, 3600), ('math', 2, 2400), ('design', 1, 1500).

Модуль csv в документации Python читает строки таблицы, а функции COUNT и SUM в SQLite считают количество и сумму. Условие WHERE задаёт, какие заказы попадут в расчёт. Попробуйте заменить статус заказа 108 на paid: для Python должно получиться три заказа на 5 400 ₽.

Проба backend-разработчика: что делать с заявкой

Теперь вопрос другой: «Как программа должна обработать новую заявку?» Нужно заранее определить входные данные, допустимые значения и ответы при ошибке.

В этой пробе доступны два направления: python и design, а запись открыта ученикам 7–11 классов. Это правила вымышленного кружка. На вход функция получает имя, класс и направление. Если всё подходит, возвращает код 201 и заявку, в которой убраны пробелы в начале и конце имени. Если нет — код 400 и понятную причину.

В вводном материале MDN среди задач серверного кода описаны проверка переданных данных и подготовка ответа клиенту. Ниже показана только небольшая часть такой логики: это обычная функция, без сайта, HTTP-сервера и сохранения заявок.

def prepare_application(payload):
    if not isinstance(payload, dict):
        return 400, {"error": "Нужен объект с полями заявки"}
    name = payload.get("name")
    grade = payload.get("grade")
    course = payload.get("course")
    if not isinstance(name, str) or not name.strip():
        return 400, {"error": "Укажите имя"}
    if type(grade) is not int or not 7 <= grade <= 11:
        return 400, {"error": "Нужен целый класс от 7 до 11"}
    if course not in ("python", "design"):
        return 400, {"error": "Такого направления нет"}
    return 201, {"name": name.strip(), "grade": grade, "course": course}

print(prepare_application({"name": " Маша ", "grade": 8, "course": "python"}))
print(prepare_application({"name": "", "grade": 8, "course": "python"}))

Первая строка должна вернуть код 201 и имя без пробелов по краям. Вторая — код 400 и сообщение «Укажите имя». Замените класс на 6, затем на строку "8". В обоих случаях ожидается ошибка класса: договорились принимать целое число, а не любой похожий текст.

Ваша самостоятельная правка: откройте запись шестиклассникам. Измените границу и текст ошибки. Проверьте классы 5, 6, 11 и 12. Правильный результат: ошибка, успех, успех, ошибка. Если изменился только текст сообщения, а шестой класс по-прежнему отклоняется, поведение программы ещё не исправлено.

Сравните, к чему хотелось вернуться

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

Не оценивайте себя только по скорости. Незнакомая команда может остановить человека, которому понравилась сама работа. А лёгкое выполнение готового примера не показывает, захочется ли долго заниматься этим направлением.

Следующий шаг — выбрать задачу чуть сложнее. Для аналитики добавить повтор заказа и придумать правило его обработки. Для разработки — добавить третье направление и проверить все ответы. Затем сравните программы по программированию или карточку Яндекс Практикума по составу практики, проверке работ и требованиям на старте. Название профессии станет понятнее, когда за ним уже стоят действия, которые вы попробовали.

Источники

  1. 1.
  2. 2.
  3. 3.

Инструменты по теме

Следующий шаг

Другие статьи по теме