Чек на границе сегментов: задаём интервалы через pd.cut
Заказ ровно на тысячу рублей попадает то в маленький, то в средний сегмент. Команды используют одинаковые пороги, но по-разному понимают слово «до». Нужен явный ответ, какой интервал включает граничное значение.
Записать интервалы до кода
Пусть малый чек — от нуля до тысячи включительно, средний — больше тысячи до пяти тысяч включительно, крупный — больше пяти тысяч. Отрицательная сумма нарушает договор, отсутствующая остаётся неизвестной. Без этих уточнений граница может войти в два сегмента или ни в один.
В pd.cut right=True включает правый край. include_lowest=True добавляет нижний край первого интервала. Бесконечная последняя граница позволяет принять любой конечный положительный чек, не придумывая максимальную сумму бизнеса.
Испытать пороги, а не случайные значения
Случайный набор часто не содержит ровно тысячу или пять тысяч. Поэтому контрольный вход включает ноль, пороги, значения на копейку выше, минус и пропуск. Используем значения в целых копейках, чтобы не смешивать правило интервала с двоичной арифметикой float.
Результат cut является категорией с заданным порядком. Для отчёта отдельно решите, показывать ли пустые сегменты, чтобы месяцы не меняли форму таблицы.
import numpy as np
import pandas as pd
checks = pd.Series([0, 100000, 100001, 500000, 500001, -1, None])
segment = pd.cut(checks, [0, 100000, 500000, np.inf],
labels=["small", "medium", "large"], right=True, include_lowest=True)
print(pd.DataFrame({"kopecks": checks, "segment": segment}))
assert segment.iloc[:5].tolist() == ["small", "small", "medium", "medium", "large"]
assert segment.iloc[5:].isna().all()
invalid = checks.notna() & segment.isna()
assert invalid.sum() == 1 and checks[invalid].iloc[0] == -1Тысяча рублей входит в small, тысяча и копейка — в medium. У минуса и пропуска нет сегмента, но причины различны. Маска invalid выделяет известные значения вне разрешённого диапазона.
Сохранить определение между периодами
cut с фиксированными границами и qcut с квантилями отвечают на разные вопросы. Фиксированные пороги позволяют сравнить одинаково определённые чеки по месяцам. Квантильные группы меняют границы вместе с распределением: верхняя четверть в каждом месяце может начинаться с другой суммы. Это полезно для ранжирования, но меняет смысл временного сравнения.
Храните границы рядом с версией отчёта. При пересмотре порогов пересчитайте историю либо обозначьте смену определения. Иначе изменение доли крупных чеков будет выглядеть как поведение клиентов, хотя поменялся только расчёт.
Для неизвестных и недопустимых значений показывайте отдельный контроль количества. Исключение пропусков из знаменателя означает, что доли описывают покрытую часть данных. Если покрытие меняется, сравнение сегментов может измениться без сдвига реальных чеков.
Попросите владельца отчёта определить сегмент пяти сумм вокруг порогов. Конкретные ответы быстрее обнаружат неоднозначное «до тысячи». Согласованные примеры оставьте рядом с кодом как проверку бизнес-правила.
Закрепить на практике
Бесплатный урок loc и iloc поможет закрепить выбор строк и проверки по условиям. cut из статьи можно разобрать после этой основы как следующий способ получить проверяемую классификацию строк. Откройте бесплатный урок и задачи. Полная последовательность тем — в бесплатном курсе.
Продолжить на практике
- NumPy и pandas: практический тренажёр ↗
Бесплатный тренажёр NumPy и pandas для тех, кто знает основы Python. Научитесь очищать таблицы, объединять данные и собирать отчёты: 31 урок и 124 задачи с кодом и автоматической проверкой.
