From f9c4d986271e1ed85eee0f82b4e510c7b05aa429 Mon Sep 17 00:00:00 2001 From: proxod3 <63583253+proxod3-first@users.noreply.github.com> Date: Sun, 28 Apr 2024 18:34:26 +0300 Subject: [PATCH 1/2] Add and modify files new file: src/input.json new file: src/report.py --- src/input.json | 38 +++++++++++++++++++++++++++++++ src/report.py | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 src/input.json create mode 100644 src/report.py diff --git a/src/input.json b/src/input.json new file mode 100644 index 0000000..ccf6e11 --- /dev/null +++ b/src/input.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" + } +] diff --git a/src/report.py b/src/report.py new file mode 100644 index 0000000..f41d3f6 --- /dev/null +++ b/src/report.py @@ -0,0 +1,62 @@ +# Импортируем необходимые модули для работы скрипта +from collections import defaultdict +from datetime import datetime +import json + + +def generate_report(data): + """Функция для создания отчета о расходах за месяц. + + Args: + data (list): список словарей, содержащих записи о расходах. + + Returns: + str: строка в формате JSON, представляющая месяц(-ы) с самыми высокими расходами. + """ + + # Создаем словарь, где ключами будут названия месяцев, а значениями - суммарные расходы за каждый месяц + monthly_expenses = defaultdict(float) + + # Проходимся по каждой записи данных + for record in data: + # Проверяем, является ли заказ завершенным + if record["status"] == "COMPLETED": + # Получаем дату заказа из записи и преобразуем ее в объект datetime + order_date = datetime.fromisoformat(record["ordered_at"]) + # Получаем название месяца из даты заказа и приводим его к нижнему регистру + month = order_date.strftime("%B").lower() + # Увеличиваем суммарные расходы за соответствующий месяц + monthly_expenses[month] += float(record["total"]) + + # Находим максимальный расход из всех суммарных расходов + max_expense = max(monthly_expenses.values()) + + # Получаем список месяцев, в которых был максимальный расход + max_months = [ + month for month, expense in monthly_expenses.items() if expense == max_expense + ] + + # Возвращаем JSON-строку с месяцем(-ами) с максимальным расходом, отсортированных по порядку следования в году + return json.dumps({"months": sorted(max_months, key=lambda x: max_months.index(x))}) + + +def perform_report(): + """Функция для выполнения процесса формирования отчета. + + Считывает данные из входного файла, формирует отчет и выводит результат. + """ + + # Открываем файл в формате JSON с данными + with open("./src/input.json", "r") as f: + data = json.load(f) + + # Генерируем отчет на основе данных + report = generate_report(data) + + # Выводим результат отчета + print(report) + + +if __name__ == "__main__": + # Выполняем функцию выполнения процесса формирования отчета. + perform_report() \ No newline at end of file From eda816fcf35301b4b20c41cde1aca5e7cdf1bce6 Mon Sep 17 00:00:00 2001 From: proxod3 <63583253+proxod3-first@users.noreply.github.com> Date: Sun, 28 Apr 2024 18:55:02 +0300 Subject: [PATCH 2/2] Update README.md --- README.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/README.md b/README.md index ee9d69b..94f7eae 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,39 @@ 4. Найденный в соответствии с условием задачи месяц должен выводиться на английском языке в нижнем регистре. Если месяцев несколько, то на вывод они все подаются на английском языке в нижнем регистре в порядке их следования в течение года. ## Автор решения +Проходцев Сергей Олегович ## Описание реализации +1. Импортирует необходимые модули: `defaultdict` из `collections`, `datetime` из `datetime` и `json`. +2. Открывает файл с данными `input.json`. +3. Считывает данные из файла в формате JSON и сохраняет их в переменную `data`. +4. Функция `generate_report(data)` генерирует отчет о расходах за месяц на основе данных из `data`. + - Создает словарь `monthly_expenses`, где ключами являются названия месяцев, а значениями - суммарные расходы за каждый месяц. + - Проходит по каждой записи в `data`. + - Если статус заказа равен "COMPLETED", извлекает дату заказа, получает название месяца и увеличивает суммарные расходы для этого месяца. + - Находит месяц(ы) с наибольшими расходами. + - Возвращает JSON-представление месяц(-ев) с максимальными расходами, отсортированные по порядку в исходном списке. +5. Функция `perform_report()` выполняет отчет: + - Читает данные из файла и сохраняет их в переменную `data`. + - Генерирует отчет вызовом функции `generate_report(data)`. + - Выводит результат отчета на экран. +6. Если скрипт запущен непосредственно (а не импортирован как модуль), вызывает функцию `perform_report()` для выполнения отчета. + +Это позволяет пользователю запустить программу и получить отчет о месяцах с наибольшими расходами на основе данных из файла `input.json`. ## Инструкция по сборке и запуску решения +1. Откройте терминал или командную строку. +2. Перейдите в директорию, в которой вы хотите клонировать репозиторий. +3. Введите ниже команду для клонирования репозитория. + + ```bash + git clone https://github.com/proxod3-first/school2024-test-task1.git + ``` + +4. Более того, необходимо разместить файл `input.json` с данными о заказах в той же директории, в которой находится основной python-скрипт (`report.py`). Если он не найден, то необходимо нужно его составить по соответствующей структуре из ТЗ. +5. Запустите python-скрипт для выполнения процесса составления отчета (ниже приведены команды для его запуска). + + ```bash + cd src + python report.py + ```