Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 32 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,37 @@
4. Найденный в соответствии с условием задачи месяц должен выводиться на английском языке в нижнем регистре. Если месяцев несколько, то на вывод они все подаются на английском языке в нижнем регистре в порядке их следования в течение года.

## Автор решения

Коршкова Анастасия
## Описание реализации

Импорт модулей:
- json используется для загрузки данных из файла формата JSON.
- defaultdict создание словарей, которые автоматически создают значения, если ключ отсутствует.
- datetime обработка времени и даты
Открытие файла и загрузка данных:
- Файл открывается в режиме чтения с помощью with open(file, 'r') as f
- Данные загружаются из файла в формате JSON с помощью json.load(f)
- user_monthly_spending = defaultdict(lambda: defaultdict(float)) создается вложенный словарь,при помощи анонимной функции lambda, где первый уровень ключей — идентификаторы пользователей, а второй уровень — названия месяцев в нижнем регистре. Значения по умолчанию для внутренних словарей установлены как float , чтобы можно было сразу суммировать расходы
- for entry in data:— цикл транзакции
- ordered = datetime.fromisoformat(entry['ordered_at']) превращает строку даты в объект datetime.
- month = ordered.strftime('%B').lower() преобразует дату в строку с названием месяца в нижнем регистре
- if entry['status'] in ['COMPLETED'] проверка статуса транзакции, чтобы убедиться, что она завершена
- user_monthly_spending[entry['user_id']][month] += float(entry['total']) добавляет сумму к пользователю и месяцу
- Создаются две переменные: max_spending_months = set() и max_spending = 0 для вычисления максимальной суммы покупки по месяцу
- for user, monthly_spending in user_monthly_spending.items проход по всем пользователям и их покупкам
- for month, spending in monthly_spending.items() проход по всем месяцам и расходам
- if spending > max_spending: если расходы в текущем месяце больше, чем текущий максимум, этот месяц становится новым по расходам
- elif spending == max_spending: если расходы равны текущему максимуму, добавляется еще один месяц в max_spending_months
- max_spending_months = {month} и max_spending = spending если текущие расходы больше максимальных, пересоздается набор max_spending_months, и устанавливается новое значение max_spending.
- return {'months': list(max_spending_months) возвращение результата в виде списка месяцев, в которых зафиксирован максимальный расход
## Инструкция по сборке и запуску решения
- Создайте папку проекта с помощью команды:
mkdir <name>
- Перейдите в каталог проекта с помощью команды:
cd <name>
- Склонируйте репозиторий на свой локальный компьютер с помощью команды:
git clone <URL_репозитория>
- Убедитесь, что у вас установлен Python и библиотеки json и datetime. Если нет, установите их с помощью команды:
pip3 install json datetime -y
- Запустите скрипт с помощью команды:
python3 spending_analysis.py
- Результат будет выведен в консоль.
24 changes: 24 additions & 0 deletions spending_analysis.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import json
from collections import defaultdict
from datetime import datetime
def calculate(file):
with open(file, 'r') as f:
data = json.load(f)
user_monthly_spending = defaultdict(lambda: defaultdict(float))
for entry in data:
ordered = datetime.fromisoformat(entry['ordered_at'])
month = ordered.strftime('%B').lower()
if entry['status'] in ['COMPLETED']:
user_monthly_spending[entry['user_id']][month] += float(entry['total'])
max_spending_months = set()
max_spending = 0
for user, monthly_spending in user_monthly_spending.items():
for month, spending in monthly_spending.items():
if spending > max_spending:
max_spending_months = {month}
max_spending = spending
elif spending == max_spending:
max_spending_months.add(month)
return {'months': list(max_spending_months)}

print(calculate('format.json'))