Problem 1. Python / Generator functions

Следующая функция возвращает текущее и предыдущее значения в цикле:


In [1]:
def this_and_prev(iterable):
    iterator = iter(iterable)
    prev_item = None
    curr_item = next(iterator)
    for next_item in iterator:
        yield (prev_item, curr_item)
        prev_item = curr_item
        curr_item = next_item
    yield (prev_item, curr_item)

In [2]:
for i,j in this_and_prev( range(5) ): print i,j


None 0
0 1
1 2
2 3
3 4

По аналогии требуется написать функцию, которая будет возвращать текущее и следующее значения.

Type your code below


In [ ]:

Problem 2. SQL / Python

Есть следующая SQL таблица sample_table:

column namedriver_id start_timestamp status
data type(String)(String)(String)
1driver_id_12017-01-21 00:05driving
2driver_id_12017-01-21 00:09waiting
............
k x ndriver_id_n2017-01-21 23:49transporting
  • driver_id_i -- идентификатор i-го водителя
  • start_timestamp -- время начала статуса, в котором находился водитель
  • status -- статус, в котором находился водитель

Для простоты предположим, что по каждому водителю в таблице одинаковое число записей k.


Табличка хранится в СУБД, которая умеет применять к данным функции, написанные на Python. Например, следующий код выполняет функцию ROW_NUMBER():


In [3]:
def row_number(driver_id, input_data):
    sorted_data = sorted(input_data, lambda x: x[0]) # сортируем список входных данных по дате
    result = []
    row_number = 0
    while row_number <= range( 0, len(input_data) ):
        row_data = {'row_number': row_number
                    , 'driver_id': driver_id
                    , 'start_timestamp': sorted_data[row_number][0]
                    , 'status': sorted_data[row_number][1]
                    }
        row_number += 1
        result.append(row_data)
    return result

In [ ]:
$row_number = Python::row_number(driver_id, input_data);

$raw = (
    SELECT 
            driver_id
            , start_timestamp
            , status
    FROM    sample_table
    );

$reduced = (
    REDUCE $raw
       ON  driver_id
    USING  $row_number((start_timestamp, status))
    );

SELECT * FROM $reduced;


Результат выполненного запроса будет выглядеть как:

column namerow_numberdriver_id start_timestamp status
data type(Int32)(String)(String)(String)
11driver_id_12017-01-21 00:05driving
22driver_id_12017-01-21 00:09waiting
...............
k x nkdriver_id_n2017-01-21 23:49transporting


Вопрос: как нужно переписать код, чтобы реализовать функцию LEAD(), т.е. добавить запись следующего статуса водителя в соседней колонке? Для выполнения задания требуется переписать код.

Type your code below


In [ ]:

Problem 4. SQL

Есть следующая таблица с заказами клиентов:

column nameid client_id driver_id timestamp cost payment_type status
data type(String) (String) (String) (String) (Double) (String) (String)
1some_id some_client_id some_driver_id 2016-01-21 12:03 123.0 cash completed
2some_id some_client_id some_driver_id 2016-01-21 11:42 99.0 card rider_canceled
...... ... ... ... ... ... ...
nsome_id some_client_id some_driver_id 2016-01-21 15:16 0.0 card driver_canceled

Нужно посчитать следующие метрики:

1. Как процент выполнения заказов зависит от типа оплаты?
2. Какой процент активных водителей совершает в неделю более 30 поездок?
3. Какой процент клиентов, совершивших первую поездку за наличные впоследствии переходит на оплату картой?

Type your answer below


In [ ]:

Problem 5. Algorithms

Город порезан на "квадраты". В момент t возникает точка на карте в пределах выделенной зоны (большого квадрата). Определить в какой из малых квадратов она попадет можно, например, с помощью перебора (bruteforce), который в среднем будет решать задачу за линейное время. Какой более эффективный алгоритм можно предложить для решения данной задачи и за какое время он будет ее решать?

Для выполнения задания не требуется писать код, можно описать логику алгоритма в 5-10 предложениях.

Type your answer below


In [ ]:

Problem 6. A/B Testing

Необходимо понять, как прохождение обучения работе с приложением влияет на конверсию водителей из заявки на сайте (лид) в первую поездку (начало работы). Среди 1200 лидов прошедших обучение первую поездку сделали 370, среди группы не прошедшей обучение поехали 1250 из 4500 водителей. Какое решение вы бы приняли и почему?

Допустим, эксперимент показал, что конверсия выросла. Рассматривается возможность сделать обучение обязательным. Как это повлияет на показатели привлечения? Можно ли принимать это решение основываясь только на конверсии?

Следующий шаг эксперимента - в дополнение к конверсии нужно сравнить выручку, которую приносит водитель за первый месяц работы. Как правильно рассчитать эту выручку? Допустим, в группе с обучением, средняя выручка составила 52к рублей, а в группе без обучения 49к. Как бы вы принимали это решение основываясь на выручке и конверсии? Какой KPI на ваш взгляд важнее и почему? Меняется ли что-то в статистическом подходе к сравнению при переходе от конверсии к выручке?

Type your answer below


In [ ]:

Problem 7. Efficiency

В часы пик количество желающих воспользоваться такси резко возрастает и машин начинает не хватать. Для того чтобы обеспечить надежность сервиса в платформу заложен механизм балансировки спроса и предложения через динамическое ценообразование (surge pricing).

  1. От чего должен зависеть повышающий коэффициент (surge) и почему? Предложите алгоритм управления surge коэффициентом.
  2. Какие граничные условия вы бы предложили в качестве целевых (если коэффициент слишком низкий многие люди не могут уехать; если коэффициент слишком высокий - никто не хочет ехать)?
  3. Какие метрики нужно отслеживать чтобы понять, что алгоритм А работает лучше чем алгоритм Б?

Type your answer below


In [ ]: