(Решение проблемы SQL с использованием Pandas) из заданного фрейма данных pandas найдите общую скорость принятия запросов, округленную до 2 знаков после запятой

#python #pandas

#python #pandas

Вопрос:

Я ставлю перед собой задачу решить проблему обработки данных SQL с использованием Pandas. Ниже приведены фреймы данных Pandas;

 friend_request = pd.DataFrame({'sender_id':[1,1,1,2,3],
                               'send_to_id':[2,3,4,3,4],
                               'request_date':['2016_06-01','2016_06-01','2016_06-01','2016_06-02','2016_06-09']})

request_accepted = pd.DataFrame({'requester_id':[1,1,2,3,3],
                                 'accepter_id':[2,3,3,4,4],
                                 'accept_date':['2016_06-03','2016_06-08','2016_06-08','2016_06-09','2016_06-10']})
  

Вы бы преобразовали ‘request_date’ и ‘accept_date’ в переменные Pandas datetime.

 friend_request['request_date']=friend_request['request_date'].replace(to_replace='_',value = '-',regex=True)
request_accepted['accept_date']=request_accepted['accept_date'].replace(to_replace='_',value = '-',regex=True)
  

Таким образом, у вас есть фреймы данных pandas с соответствующими dtypes. Теперь, как бы вы поступили, чтобы получить общую скорость принятия запросов, округленную до 2 десятичных знаков, что является числом принятия, разделенным на количество запросов?

Используя синтаксис SQL,

 SELECT 
    ROUND(
        ifnull(
        (SELECT COUNT(*)
        FROM (SELECT DISTINCT requester_id,accepter_id
              FROM request_accepted) as numerator)/
        (SELECT COUNT(*)
        FROM (SELECT DISTINCT sender_id,send_to_id
              FROM friend_request) as denominator),0),2
            ) AS acceptance_rate
  

Это просмотр всех уникальных пар (requester_id,accepter_id) и сравнение их с (sender_id, send_to_id).
Теперь, будет ли аналогичный способ решить эту проблему с использованием Pandas?

Ожидаемый результат равен 0,80

Ответ №1:

Вы можете использовать:

 numerator = len(request_accepted.groupby(['requester_id', 'accepter_id']))
denominator = len(friend_request.groupby(['sender_id', 'send_to_id']))

print('{:.2f}'.format(round(numerator/denominator, 2)) if numerator/denominator else 0)

0.80