From ac767a3c215a537e688582fe9b8ebb8225c1971b Mon Sep 17 00:00:00 2001 From: N1KE4 Date: Mon, 29 Apr 2024 00:27:09 +0300 Subject: [PATCH 1/6] Implemented algorithm --- README.md | 35 +++-------------------------------- format.json | 38 -------------------------------------- main.py | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 70 deletions(-) delete mode 100644 format.json create mode 100644 main.py diff --git a/README.md b/README.md index ee9d69b..74e37e3 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,7 @@ -# Тестовое задание для отбора на Летнюю ИТ-школу КРОК по разработке - -## Условие задания -Один развивающийся и перспективный маркетплейс активно растет в настоящее время. Текущая команда разработки вовсю занята тем, что развивает ядро системы. Помимо этого, перед CTO маркетплейса стоит задача — разработать подсистему аналитики, которая на основе накопленных данных формировала бы разнообразные отчеты и статистику. - -Вы — компания подрядчик, с которой маркетплейс заключил рамочный договор на выполнение работ по разработке этой подсистемы. В рамках первого этапа вы условились провести работы по прототипированию и определению целевого технологического стека и общих подходов к разработке. - -На одном из совещаний с Заказчиком вы определили задачу, на которой будете выполнять работы по прототипированию. В качестве такой задачи была выбрана разработка отчета о периодах наибольших трат со стороны пользователей. - -Аналитики со стороны маркетплейса предоставили небольшой срез массива данных (файл format.json) о покупках пользователей, на примере которого вы смогли бы ознакомиться с форматом входных данных. Каждая запись данного среза содержит следующую информацию: -- Идентификатор пользователя; -- Дата и время оформления заказа; -- Статус заказа; -- Сумма заказа. - -В пояснительной записке к массиву данных была уточняющая информация относительно статусов заказов: -- COMPLETED (Завершенный заказ); -- CANCELED (Отмененный заказ); -- CREATED (Созданный заказ, еще не оплаченный); -- DELIVERY (Созданный и оплаченный заказ, который доставляется). - -Необходимо разработать отчет, вычисляющий по полученному массиву данных месяц, когда пользователи тратили больше всего. Если максимальная сумма пользовательских трат была в более, чем одном месяце, отчет должен показывать все такие месяцы. В отчете должны учитываться только завершенные заказы. - -Требования к реализации: -1. Реализация должна содержать, как минимум, одну процедуру (функцию/метод), отвечающую за формирование отчета, и должна быть описана в readme.md в соответствии с чек-листом; -2. В качестве входных данных программа использует json-файл (input.json), соответствующий структуре, описанной в условиях задания; -3. Процедура (функция/метод) формирования отчета должна возвращать строку в формате json следующего формата: - - {«months»: [«march»]} - - {«months»: [«march», «december»]} -4. Найденный в соответствии с условием задачи месяц должен выводиться на английском языке в нижнем регистре. Если месяцев несколько, то на вывод они все подаются на английском языке в нижнем регистре в порядке их следования в течение года. - ## Автор решения - +Клочков Никита Сергеевич ## Описание реализации +Реализация представлена в следующем виде: +- Для формирования отчета нужно импортировать модули `json` и `datetime` ## Инструкция по сборке и запуску решения diff --git a/format.json b/format.json deleted file mode 100644 index 94aad31..0000000 --- a/format.json +++ /dev/null @@ -1,38 +0,0 @@ -[ - { - "user_id": "3acfb0b7-04bd-4978-be4c-3929372277c1", - "ordered_at": "2023-01-16T13:56:39.492", - "status": "COMPLETED", - "total": "1917.00" - }, - { - "user_id": "25b003b9-ab22-4a24-a616-dd0303f983d8", - "ordered_at": "2023-03-05T08:34:21.123", - "status": "COMPLETED", - "total": "13990.00" - }, - { - "user_id": "e1470ada-fcbb-4424-8c46-065b6409ca4b", - "ordered_at": "2016-03-16T13:56:39.492", - "status": "COMPLETED", - "total": "215.50" - }, - { - "user_id": "081a47a5-b7bf-462c-a11a-68002a179152", - "ordered_at": "2023-12-08T21:36:59.281", - "status": "COMPLETED", - "total": "49499.00" - }, - { - "user_id": "0999c6aa-1bac-4ded-9a54-92fff4f34d69", - "ordered_at": "2023-12-14T11:10:29.408", - "status": "CANCELED", - "total": "13650.00" - }, - { - "user_id": "0999c6aa-1bac-4ded-9a54-92fff4f34d69", - "ordered_at": "2023-12-14T11:15:31.108", - "status": "COMPLETED", - "total": "14760.00" - } -] \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..69b9fa6 --- /dev/null +++ b/main.py @@ -0,0 +1,34 @@ +import json +from datetime import datetime + + +def make_report(input_file): + with open(input_file, 'r') as file: + data = json.load(file) + + month_earnings = {} + + for order in data: + if order['status'] == 'COMPLETED' or order['status'] == 'DELIVERY': + order_date = datetime.strptime(order['ordered_at'], "%Y-%m-%dT%H:%M:%S.%f") + month_name = order_date.strftime('%B').lower() + + if month_name not in month_earnings: + month_earnings[month_name] = 0.0 + + month_earnings[month_name] += float(order['total']) + + if len(month_earnings.values()) == 0: + max_month_names = [] + else: + max_earning = max(month_earnings.values()) + max_month_names = [month for month, spending in month_earnings.items() if spending == max_earning] + + result = {'months': max_month_names} + return json.dumps(result) + + +if __name__ == '__main__': + input_file = 'input.json' + report = make_report(input_file) + print(report) From 59fd8c6001150d04e4706af47442ecb3fa892f19 Mon Sep 17 00:00:00 2001 From: N1KE4 Date: Mon, 29 Apr 2024 02:43:01 +0300 Subject: [PATCH 2/6] Update READ.ME --- README.md | 16 ++++++++++++++-- format.json | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 format.json diff --git a/README.md b/README.md index 74e37e3..f0a7566 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,19 @@ ## Автор решения Клочков Никита Сергеевич ## Описание реализации -Реализация представлена в следующем виде: +Импортирование модулей `json` и `datetime`; -- Для формирования отчета нужно импортировать модули `json` и `datetime` +Функция `make_report` принимает json-файл в качестве переменной: +- Функция открывает `input.json`, записывает информацию из него в переменную `data`; +- Следующий цикл парсит дату заказов со статусом `COMPLETED` и `DELIVERY`, конвертирует её в объект `datetime`, извлекает имя месяца в нижнем регистре, а после записывает прибыль каждого месяца в `month_earnings`; +- Если данные по заказам имеются (`month_earnings.values()` != 0), функция находит максимальную выручку `max_earning` среди всех месяцев, записывает в `max_month_names` названия месяцев с максимальной выручкой; +- Функция формирует отчет `result` в нужном формате, конвертирует его в json; + + +- Если в файле `input.json` отсутствуют данные (пустой список), функция выведет пустой список (`max_month_names` = [ ]); + +После вызова функции результат выводится в командную строку ## Инструкция по сборке и запуску решения +Запуск происходит следюущим образом: +- Разместить `main.py` и `input.json` в выбранной директории +- Используя командную строку, перейти в эту директорию и ввести команду `python3 main.py` \ No newline at end of file diff --git a/format.json b/format.json new file mode 100644 index 0000000..94aad31 --- /dev/null +++ b/format.json @@ -0,0 +1,38 @@ +[ + { + "user_id": "3acfb0b7-04bd-4978-be4c-3929372277c1", + "ordered_at": "2023-01-16T13:56:39.492", + "status": "COMPLETED", + "total": "1917.00" + }, + { + "user_id": "25b003b9-ab22-4a24-a616-dd0303f983d8", + "ordered_at": "2023-03-05T08:34:21.123", + "status": "COMPLETED", + "total": "13990.00" + }, + { + "user_id": "e1470ada-fcbb-4424-8c46-065b6409ca4b", + "ordered_at": "2016-03-16T13:56:39.492", + "status": "COMPLETED", + "total": "215.50" + }, + { + "user_id": "081a47a5-b7bf-462c-a11a-68002a179152", + "ordered_at": "2023-12-08T21:36:59.281", + "status": "COMPLETED", + "total": "49499.00" + }, + { + "user_id": "0999c6aa-1bac-4ded-9a54-92fff4f34d69", + "ordered_at": "2023-12-14T11:10:29.408", + "status": "CANCELED", + "total": "13650.00" + }, + { + "user_id": "0999c6aa-1bac-4ded-9a54-92fff4f34d69", + "ordered_at": "2023-12-14T11:15:31.108", + "status": "COMPLETED", + "total": "14760.00" + } +] \ No newline at end of file From eb98bb335789ff22b67737a91fe106cf9fe4a762 Mon Sep 17 00:00:00 2001 From: N1KE4 Date: Mon, 29 Apr 2024 02:45:22 +0300 Subject: [PATCH 3/6] Update READ.ME --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f0a7566..11e9756 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,6 @@ После вызова функции результат выводится в командную строку ## Инструкция по сборке и запуску решения -Запуск происходит следюущим образом: +Запуск происходит следующим образом: - Разместить `main.py` и `input.json` в выбранной директории - Используя командную строку, перейти в эту директорию и ввести команду `python3 main.py` \ No newline at end of file From 8bb4475a4a5305c8c135e00af5ae1f3c7f4c7614 Mon Sep 17 00:00:00 2001 From: N1KE4 Date: Mon, 29 Apr 2024 02:52:36 +0300 Subject: [PATCH 4/6] Update README --- README.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/README.md b/README.md index 11e9756..5739944 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## Автор решения Клочков Никита Сергеевич ## Описание реализации From de3e038a80a5f607151329501c4e095067d3305c Mon Sep 17 00:00:00 2001 From: N1KE4 Date: Mon, 29 Apr 2024 02:54:31 +0300 Subject: [PATCH 5/6] Update README --- README.md | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/README.md b/README.md index 5739944..11e9756 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ## Автор решения Клочков Никита Сергеевич ## Описание реализации From 24e303f3045acd5c95e7a68a2a93e9889cb555be Mon Sep 17 00:00:00 2001 From: N1KE4 Date: Mon, 29 Apr 2024 02:56:23 +0300 Subject: [PATCH 6/6] Changed file name --- format.json => input.json | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename format.json => input.json (100%) diff --git a/format.json b/input.json similarity index 100% rename from format.json rename to input.json