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
63 changes: 53 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
@@ -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 строчек кода не сильно вас напрягут)
Хорошего дня
24 changes: 24 additions & 0 deletions main.py
Original file line number Diff line number Diff line change
@@ -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())
Binary file added requirements.txt
Binary file not shown.