From 51174302539da1e65cc8a43273609d9aba2370e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B0=D0=BD=D0=B0=20=D0=94=D0=B7=D1=83=D1=86=D0=B5?= =?UTF-8?q?=D0=B2=D0=B0?= Date: Tue, 30 Apr 2024 11:09:51 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=D0=B0=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B8=D0=BA=20=D1=81=20=D1=80?= =?UTF-8?q?=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 main.py diff --git a/main.py b/main.py new file mode 100644 index 0000000..f087df1 --- /dev/null +++ b/main.py @@ -0,0 +1,24 @@ +import json +from dateutil.parser import parse +import calendar + + +def solve(): + with open('format.json', 'r') as f: + data = json.loads(f.read()) + total_expenses = [0] * 12 + for expense in data: + if expense['status'] == 'COMPLETED': + date_ = parse(expense['ordered_at']) + total_expenses[date_.month - 1] += float(expense['total']) + + max_expense = max(total_expenses) + report = {'months': []} + for i in range(12): + if total_expenses[i] == max_expense: + report['months'].append(calendar.month_name[i + 1].lower()) + + return json.dumps(report) + + +print(solve()) From cacc17fc0ade4418064be887b5eca5bccdfed23d Mon Sep 17 00:00:00 2001 From: Lana Date: Tue, 30 Apr 2024 11:36:26 +0300 Subject: [PATCH 2/2] update readme and add requirements.txt --- README.md | 63 +++++++++++++++++++++++++++++++++++++++-------- requirements.txt | Bin 0 -> 88 bytes 2 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 requirements.txt diff --git a/README.md b/README.md index ee9d69b..9d71a89 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,79 @@ # Тестовое задание для отбора на Летнюю ИТ-школу КРОК по разработке ## Условие задания -Один развивающийся и перспективный маркетплейс активно растет в настоящее время. Текущая команда разработки вовсю занята тем, что развивает ядро системы. Помимо этого, перед CTO маркетплейса стоит задача — разработать подсистему аналитики, которая на основе накопленных данных формировала бы разнообразные отчеты и статистику. -Вы — компания подрядчик, с которой маркетплейс заключил рамочный договор на выполнение работ по разработке этой подсистемы. В рамках первого этапа вы условились провести работы по прототипированию и определению целевого технологического стека и общих подходов к разработке. +Один развивающийся и перспективный маркетплейс активно растет в настоящее время. Текущая команда разработки вовсю занята +тем, что развивает ядро системы. Помимо этого, перед CTO маркетплейса стоит задача — разработать подсистему аналитики, +которая на основе накопленных данных формировала бы разнообразные отчеты и статистику. -На одном из совещаний с Заказчиком вы определили задачу, на которой будете выполнять работы по прототипированию. В качестве такой задачи была выбрана разработка отчета о периодах наибольших трат со стороны пользователей. +Вы — компания подрядчик, с которой маркетплейс заключил рамочный договор на выполнение работ по разработке этой +подсистемы. В рамках первого этапа вы условились провести работы по прототипированию и определению целевого +технологического стека и общих подходов к разработке. + +На одном из совещаний с Заказчиком вы определили задачу, на которой будете выполнять работы по прототипированию. В +качестве такой задачи была выбрана разработка отчета о периодах наибольших трат со стороны пользователей. + +Аналитики со стороны маркетплейса предоставили небольшой срез массива данных (файл format.json) о покупках +пользователей, на примере которого вы смогли бы ознакомиться с форматом входных данных. Каждая запись данного среза +содержит следующую информацию: -Аналитики со стороны маркетплейса предоставили небольшой срез массива данных (файл format.json) о покупках пользователей, на примере которого вы смогли бы ознакомиться с форматом входных данных. Каждая запись данного среза содержит следующую информацию: - Идентификатор пользователя; - Дата и время оформления заказа; - Статус заказа; - Сумма заказа. В пояснительной записке к массиву данных была уточняющая информация относительно статусов заказов: + - COMPLETED (Завершенный заказ); - CANCELED (Отмененный заказ); - CREATED (Созданный заказ, еще не оплаченный); - DELIVERY (Созданный и оплаченный заказ, который доставляется). -Необходимо разработать отчет, вычисляющий по полученному массиву данных месяц, когда пользователи тратили больше всего. Если максимальная сумма пользовательских трат была в более, чем одном месяце, отчет должен показывать все такие месяцы. В отчете должны учитываться только завершенные заказы. +Необходимо разработать отчет, вычисляющий по полученному массиву данных месяц, когда пользователи тратили больше всего. +Если максимальная сумма пользовательских трат была в более, чем одном месяце, отчет должен показывать все такие месяцы. +В отчете должны учитываться только завершенные заказы. Требования к реализации: -1. Реализация должна содержать, как минимум, одну процедуру (функцию/метод), отвечающую за формирование отчета, и должна быть описана в readme.md в соответствии с чек-листом; -2. В качестве входных данных программа использует json-файл (input.json), соответствующий структуре, описанной в условиях задания; + +1. Реализация должна содержать, как минимум, одну процедуру (функцию/метод), отвечающую за формирование отчета, и должна + быть описана в readme.md в соответствии с чек-листом; +2. В качестве входных данных программа использует json-файл (input.json), соответствующий структуре, описанной в + условиях задания; 3. Процедура (функция/метод) формирования отчета должна возвращать строку в формате json следующего формата: - - {«months»: [«march»]} - - {«months»: [«march», «december»]} -4. Найденный в соответствии с условием задачи месяц должен выводиться на английском языке в нижнем регистре. Если месяцев несколько, то на вывод они все подаются на английском языке в нижнем регистре в порядке их следования в течение года. + - {«months»: [«march»]} + - {«months»: [«march», «december»]} +4. Найденный в соответствии с условием задачи месяц должен выводиться на английском языке в нижнем регистре. Если + месяцев несколько, то на вывод они все подаются на английском языке в нижнем регистре в порядке их следования в + течение года. ## Автор решения +Дзуцева Лана Сергеевна + ## Описание реализации +0. использовала стандартные библиотеки + dateutil +1. ввиду размера задания решила не создавать отдельную модель данных, а просто распарсить как словарик (ясное дело что в + проме надо создавать модели и работать с ними) +2. также лучше использовать пандас, так как он быстрее справится с такими операциями на большом датасете, + но учитывая что школа будет вообще по джаве, то думаю, что тут и без него можно +3. Постаралась сделать код максимально лаконичным. Использую список для записи месяцев, работает так же как создавать, + допустим, словарь, а по памяти ест меньше + ## Инструкция по сборке и запуску решения + +почитала как по-человечески делиться питон-проектами(обычно в проектах на питоне просто открывала и вручную ставила все +нехватающие +библиотеки) +https://stackoverflow.com/questions/51863155/do-we-need-to-upload-virtual-env-on-github-too +Если не сработает, то создайте новую виртуальную среду в текущей папке и выполните в терминале +pip install python-dateutil + +## Пара мыслей + +Я очень извиняюсь, что кидаю на следующий день после дедлайна. По личным причинам очень загналась и совсем забыла про +отбор, а по факту написала код за 40 минут. +Еще я не удержалась и глянула другие форки, а там так страшно😱 Некоторые ребята создают километровые проекты и +подписывают каждую строчку или делают сабстринг +вместо того чтобы десериализовать, поэтому думаю мои 25 строчек кода не сильно вас напрягут) +Хорошего дня \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..7f999b8ce3cd4f59963f96a1ba4295213ca87187 GIT binary patch literal 88 zcmezWuYjSFp@boWA)g_SL6;$gArZ(+Whe!bnG87$wm@japvPbd#0EfI0902Dlrv!9 XW#9s`G8rnsY7BvLh74w4RUjDvI^ho9 literal 0 HcmV?d00001