Python: средний чек по городам и число заказов на пользователя за I квартал

Допущения: входные таблицы — DataFrame; одна строка orders соответствует заказу, users.id уникален, идентификаторы и даты заполнены, ссылки на пользователей корректны.

Короткий ответ

Что ответить на собеседовании

Допущения: входные таблицы — DataFrame; одна строка orders соответствует заказу, users.id уникален, идентификаторы и даты заполнены, ссылки на пользователей корректны. Денежные поля числовые, price заполнен; корректность скидок проверена. price — сумма до скидки, discount — денежная скидка в той же валюте; её пропуск считаем нулём. Все представленные заказы учитываем, поскольку статуса оплаты в условии нет.

Подробный разбор

Ответ с пояснениями

Условие

- Python

У тебя есть таблица orders с заказами order_id, created_dt, user_id, price, discount
Также есть справочник по пользователям users id, reg_date, city
Напиши код питон чтобы посчитать средний чек для каждого города
и среднее число заказов на пользователя за первый квартал текущего года

Решение

Допущения: входные таблицы — DataFrame; одна строка orders соответствует заказу, users.id уникален, идентификаторы и даты заполнены, ссылки на пользователей корректны. Денежные поля числовые, price заполнен; корректность скидок проверена. price — сумма до скидки, discount — денежная скидка в той же валюте; её пропуск считаем нулём. Все представленные заказы учитываем, поскольку статуса оплаты в условии нет.

Обе метрики считаем за [1 января, 1 апреля) текущего года в UTC; даты без часового пояса также считаем UTC. Пользовательский знаменатель включает всех зарегистрированных до 1 апреля, в том числе без заказов. Город берём из справочника.

import pandas as pd

year = pd.Timestamp.now(tz='UTC').year
start = pd.Timestamp(year=year, month=1, day=1, tz='UTC')
end = pd.Timestamp(year=year, month=4, day=1, tz='UTC')

o, u = orders.copy(), users.copy()
o['created_dt'] = pd.to_datetime(o['created_dt'], utc=True)
u['reg_date'] = pd.to_datetime(u['reg_date'], utc=True)
u = u.loc[u['reg_date'] < end]
q = o.loc[(o['created_dt'] >= start) &
          (o['created_dt'] < end)].copy()
q['paid'] = q['price'] - q['discount'].fillna(0)

counts = q.groupby('user_id').agg(
    order_count=('order_id', 'size'),
    revenue=('paid', 'sum')
)
per_user = u.merge(counts, left_on='id', right_index=True,
                   how='left', validate='one_to_one')
cols = ['order_count', 'revenue']
per_user[cols] = per_user[cols].fillna(0)

result = per_user.groupby('city', dropna=False).agg(
    users=('id', 'size'),
    orders=('order_count', 'sum'),
    revenue=('revenue', 'sum')
)
result['avg_check'] = result['revenue'] / result['orders'].where(
    result['orders'] != 0
)
result['orders_per_user'] = result['orders'] / result['users']
overall_orders_per_user = per_user['order_count'].mean()

result содержит обе метрики по городам, overall_orders_per_user — общую среднюю. При отсутствии заказов средний чек неопределён (NaN), а число заказов на пользователя равно нулю. Это отношение сумм, не среднее пользовательских средних чеков.

Если скидка хранится процентом от 0 до 100, формула оплаты — price * (1 - discount / 100). Пропуски и некорректные даты/суммы следует проверить заранее, а не маскировать нулями. Соединение таблиц pandas, группировка

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку