Ошибка в объединении таблиц и вывода разницы среднего чека, при использовании Pandas
Задача: Есть две таблицы:
- поездки (order_id, user_id, order_dt, order_cost) - все поездки в Uber.
- пользователи (user_id, gender) - таблица пользователей, где размечен пол пользователя (М/Ж)
Нужно:
Посчитать разницу среднего чека для М/Ж пользователей за какой-то период (любым способом в SQL, Python).
Объяснить, почему он может отличаться.
Решил её двумя способами, но мне пишут, что имеется ошибка и не говорят где и в чём именно (может в логике решения).
Помогите найти.
Мой вариант решения:
- на питоне:
import pandas as pd
# загружаем данные
taxi = pd.read_csv('taxi.csv')
users = pd.read_csv('users.csv')
# объединяем таблицы по user_id
df = pd.merge(taxi, users, on='user_id')
# фильтруем записи по дате заказа (промежуток взял 2022 год)
start_date = pd.to_datetime('2022-01-01')
end_date = pd.to_datetime('2022-12-31')
df = df[(df['order_dt'] >= start_date) & (df['order_dt'] <= end_date)]
# вычисляем средний чек для каждой группы
result = df.groupby('gender')['order_cost'].mean()
# вычисляем разницу между средними чеками для мужчин и женщин
diff = result.loc['М'] - result.loc['Ж']
# выводим результат
print(diff)
- на SQL
Этот запрос возвращает средний чек для каждой группы пользователей
SELECT gender, AVG(order_cost) AS avg_cost
FROM taxi
JOIN users ON taxi.user_id = users.user_id
WHERE order_dt BETWEEN '2022-01-01' AND '2022-12-31'
GROUP BY gender;
Считаем разницу между средними чеками для мужчин и женщин
SELECT AVG(CASE WHEN gender = 'М' THEN order_cost ELSE 0 END) AS avg_cost_male,
AVG(CASE WHEN gender = 'Ж' THEN order_cost ELSE 0 END) AS avg_cost_female,
AVG(CASE WHEN gender = 'М' THEN order_cost ELSE 0 END) - AVG(CASE WHEN gender = 'Ж'
THEN order_cost ELSE 0 END) AS diff
FROM taxi
JOIN users ON taxi.user_id = users.user_id
WHERE order_dt BETWEEN '2022-01-01' AND '2022-12-31';
Источник: Stack Overflow на русском