Skip to content

Instantly share code, notes, and snippets.

@sancau
Last active May 19, 2022 08:22
Show Gist options
  • Save sancau/41b11ddb5ffce1d0ae90d1df8948d0b1 to your computer and use it in GitHub Desktop.
Save sancau/41b11ddb5ffce1d0ae90d1df8948d0b1 to your computer and use it in GitHub Desktop.
Welltory Challenge (Python developer in Data Science)

Предлагается реализовать веб-сервис для обработки данных.

Контекст задачи:

  • у нас есть пользователи от которых мы получаем некоторые данные
  • мы получаем данные каждый день, таким образом каждая точка данных соответствует некоторой дате
  • в рамках этой задачи будем считать что все данные имеют тип float
  • в результате сбора данных мы имеем массивы вида [{"date": ..., "value": ...}, {"date": ..., "value": ...}, ...]
  • видов (например шаги, средняя частота пульса и тп) данных может быть много, в рамках этой задачи будем считать, что они однозначно различаются по строковому названию (см. примеры запросов к АПИ ниже)
  • как данные попадают к нам и как они технически храняться - за рамками данной задачи

ТЗ выглядит следующим образом:

  • Реализовать HTTP веб-сервис. Сервис должен предоставлять HTTP API с помощью которого можно посчитать корреляцию по Пирсону между 2 векторами данных разных типов
  • При расчете корреляции требуется сопоставить потоки между собой с учетом дат, то есть мы "сравниваем" два показателя за одну и ту же дату, а не как попало
  • Полученные результаты должны сохраняться в базу данных.
  • Данные сохраненные в БД также должны быть впоследствии доступны в через API.

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

Пример входных данных для /calculate

{
  "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
      }
    ]
  }
}
@Anshita-Dhoot
Copy link

Python program for simple calculator

Function to add two numbers

def addition(num1, num2):
return num1 + num2

Function to subtract two numbers

def subtraction(num1, num2):
return num1 - num2

Function to multiply two numbers

def multiplication(num1, num2):
return num1 * num2

Function to divide two numbers

def divide(num1, num2):
return num1 / num2

print("Please select operation -\n"
"1. Addition\n"
"2. Subtraction\n"
"3. Multiplication\n"
"4. Divide\n")

Take input from the user

select = int(input("Select operations form 1, 2, 3, 4 :"))

number_1 = int(input("Enter first number: "))
number_2 = int(input("Enter second number: "))

if select == 1:
print(number_1, "+", number_2, "=",
addition(number_1, number_2))

elif select == 2:
print(number_1, "-", number_2, "=",
subtraction(number_1, number_2))

elif select == 3:
print(number_1, "*", number_2, "=",
multiplication(number_1, number_2))

elif select == 4:
print(number_1, "/", number_2, "=",
divide(number_1, number_2))
else:
print("Invalid input")

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment