Процент немедленных заказов среди первых заказов клиентов
delivery(delivery_id, customer_id, order_date, customer_pref_delivery_date). Заказ немедленный, когда предпочтительная дата равна дате заказа, иначе запланированный. Первый заказ клиента — с самой ранней order_date (ровно один на клиента гарантирован). Верните процент немедленных среди первых заказов всех клиентов, округлённый до 2 знаков, как DataFrame из одной ячейки.
import pandas as pd
def immediate_pct(delivery: pd.DataFrame) -> pd.DataFrame:
# ваш код здесь
Напишите реализацию.
Берут первый заказ каждого клиента, затем долю немедленных. Индексы строк первых заказов получают через groupby('customer_id')['order_date'].idxmin(), выбирают эти строки и считают среднее булева order_date == customer_pref_delivery_date, умноженное на 100, округляя до 2.
- ✗Считать процент по всем заказам, а не первым
- ✗Выбирать последний заказ вместо самого раннего
- ✗Делить на клиентов без выделения первых заказов
- →Почему idxmin, а не сортировка и head(1)?
- →Как совпадения по order_date повлияют на выбор первого?
Filter to each customer's first order, then take the mean of the immediate flag.
import pandas as pd
def immediate_pct(delivery: pd.DataFrame) -> pd.DataFrame:
first_idx = delivery.groupby('customer_id')['order_date'].idxmin()
firsts = delivery.loc[first_idx]
pct = round(
(firsts['order_date'] == firsts['customer_pref_delivery_date']).mean() * 100,
2)
return pd.DataFrame({'immediate_percentage': [pct]})
idxmin() returns the row index of the earliest order per customer; selecting only those rows gives one first order each. The boolean compare yields True for immediate orders, and .mean() * 100 is their percentage. Computing over all orders instead would answer a different question.