Как найти самый популярный продукт в наборе данных?
Что проверяют
Уточняете ли вы задачу до кода и видите ли подводные камни простой агрегации: что считать популярностью, что делать с ничьей, как решение масштабируется. Следом обычно просят топ по категориям или спрашивают, что изменится, если данные не помещаются в память.
Как отвечать
Сначала вопросы к постановке, это половина оценки:
- метрика: число заказов, сумма проданных штук, выручка или число уникальных покупателей. Лидеры по каждой из них часто разные;
- период и фильтры: за какое время, учитывать ли отмены и возвраты;
- ключ: группировать по
product_id, а не по названию, которое пишут по-разному; - ничья: вернуть один товар или все с максимальным значением.
Потом решение в pandas под выбранную метрику:
- по числу строк:
df["product_id"].value_counts(). По умолчанию он выбрасываетNaN(dropna=True) и сортирует по убыванию; - по количеству:
s = df.groupby("product_id")["quantity"].sum(), затемs.nlargest(1); - с ничьей:
s[s == s.max()], потому чтоidxmax()молча возвращает первый из равных.
В чистом Python то же даёт Counter(ids).most_common(1). Подсчёт стоит O(n) по времени и O(k) по памяти, где k это число уникальных товаров. Топ из m элементов через кучу обходится в O(k log m), полная сортировка тут избыточна.
В SQL: GROUP BY product_id, SUM(quantity) и ORDER BY ... LIMIT 1, а для ничьих и топа по категориям оконная DENSE_RANK() OVER (PARTITION BY category ORDER BY total DESC).
Если данные большие: pd.read_csv(..., chunksize=...) с накоплением сумм по чанкам, агрегация в Spark или прямо в хранилище. Для потока, где нельзя хранить все ключи, есть приближённые алгоритмы вроде Count-Min Sketch и Misra-Gries.
Где спотыкаются
Пишут код, не спросив, что такое «популярный». Подсчёт строк вместо суммы штук даёт другой ответ, и интервьюер ждёт именно этого вопроса.
Не думают о ничьей. idxmax вернёт один товар, и никто не узнает, что их было три.
Грузят многогигабайтный CSV целиком через read_csv, а на вопрос о памяти отвечают «возьмём сервер побольше» вместо чанков или распределённой агрегации.