- у нас есть пользователи от которых мы получаем некоторые данные
- мы получаем данные каждый день, таким образом каждая точка данных соответствует некоторой дате
- в рамках этой задачи будем считать что все данные имеют тип float
- в результате сбора данных мы имеем массивы вида [{"date": ..., "value": ...}, {"date": ..., "value": ...}, ...]
- видов (например шаги, средняя частота пульса и тп) данных может быть много, в рамках этой задачи будем считать, что они однозначно различаются по строковому названию (см. примеры запросов к АПИ ниже)
- как данные попадают к нам и как они технически храняться - за рамками данной задачи
- Реализовать HTTP веб-сервис. Сервис должен предоставлять HTTP API с помощью которого можно посчитать корреляцию по Пирсону между 2 векторами данных разных типов
- При расчете корреляции требуется сопоставить потоки между собой с учетом дат, то есть мы "сравниваем" два показателя за одну и ту же дату, а не как попало
- Полученные результаты должны сохраняться в базу данных.
- Данные сохраненные в БД также должны быть впоследствии доступны в через API.
-
POST /calculate
- вычисляет и сохраняет в БД метрику
Принимает входные данные в JSON-формате:
{
"user_id": int,
"data": {
"x_data_type": str,
"y_data_type": str,
"x": [
{
"date": YYYY-MM-DD,
"value": float,
},
...
],
"y": [
{
"date": YYYY-MM-DD,
"value": float,
},
...
]
}
}
-
GET /correlation?x_data_type=str&y_data_type=str&user_id=int
- Отдает посчитанную метрику для конкретного пользователя и конкретных типов данных
- Если для данной комбинации рассчитанных данных нет - возвращает 404
Формат ответа в случае HTTP 200:
{
"user_id": int,
"x_data_type": str,
"y_data_type": str,
"correlation": {
"value": float,
"p_value": float,
}
}
- данные могут быть кривые - пропуски, неверный тип и тд (к сожалению реальный мир жесток и враждебен :))
- для одной комбинации пользователь - тип данных A - тип данных Б может быть несколько расчетов, в таком случае просто обновляем метрику на основе последнего расчета, с версиями заморачиваться не нужно, все таки задача тестовая
- язык Python (HTTP фреймворк любой, обоснованный выбор - плюс вам)
- PEP8
- данные хранятся персистентно в рамках сервиса (БД любая, обоснованный выбор - плюс вам)
- сборка через docker compose: отдельно БД, отдельно сервис
- наличие README.md с минимально необходимыми инструкциями для запуска сервиса в Docker
- результат - это ссылка на github репозиторий
- расчет производится в фоновых процессах через очереди (не блокирует АПИ)
- все это дело покрыто тестами
- есть авторизация через токены
- руководствуйтесь здравым смыслом
- если вы что-то сделаете по-своему (на основании собственных допущений), но, опять же, это будет обоснованно и логично - это не минус, это часто наоборот плюс
- если необходимо, можно написать нашему рекрутеру Дарье в Telegram - @mentafres
{
"user_id": 42,
"data": {
"x_data_type": "sleep_hours",
"y_data_type": "morning_pulse",
"x": [
{
"date": "2022-01-14",
"value": 9.7
},
{
"date": "2022-01-08",
"value": 9.0
},
{
"date": "2022-02-01",
"value": 6.5
},
{
"date": "2022-01-11",
"value": 8.6
},
{
"date": "2022-01-25",
"value": 6.0
},
{
"date": "2022-01-04",
"value": 9.9
},
{
"date": "2022-01-27",
"value": 5.2
},
{
"date": "2022-01-03",
"value": 5.3
},
{
"date": "2022-01-02",
"value": 7.7
},
{
"date": "2022-01-19",
"value": 6.0
},
{
"date": "2022-01-12",
"value": 6.4
},
{
"date": "2022-01-26",
"value": 5.2
},
{
"date": "2022-01-18",
"value": 5.6
},
{
"date": "2022-01-16",
"value": 9.0
},
{
"date": "2022-01-23",
"value": 5.4
},
{
"date": "2022-01-09",
"value": 5.6
},
{
"date": "2022-01-06",
"value": 6.9
},
{
"date": "2022-01-17",
"value": 9.3
},
{
"date": "2022-01-15",
"value": 9.1
},
{
"date": "2022-01-13",
"value": 7.3
}
],
"y": [
{
"date": "2022-01-16",
"value": 96
},
{
"date": "2022-01-31",
"value": 77
},
{
"date": "2022-01-01",
"value": 45
},
{
"date": "2022-01-05",
"value": 60
},
{
"date": "2022-01-08",
"value": 47
},
{
"date": "2022-02-01",
"value": 97
},
{
"date": "2022-01-26",
"value": 93
},
{
"date": "2022-01-23",
"value": 68
},
{
"date": "2022-01-13",
"value": 49
},
{
"date": "2022-01-06",
"value": 44
},
{
"date": "2022-01-29",
"value": 75
},
{
"date": "2022-01-10",
"value": 88
},
{
"date": "2022-01-20",
"value": 54
},
{
"date": "2022-01-11",
"value": 82
},
{
"date": "2022-01-27",
"value": 62
},
{
"date": "2022-01-19",
"value": 57
},
{
"date": "2022-01-18",
"value": 82
},
{
"date": "2022-01-17",
"value": 65
},
{
"date": "2022-01-03",
"value": 64
},
{
"date": "2022-01-28",
"value": 50
}
]
}
}