NumPy для аналитика: массивы, маски и векторные расчёты
Что нужно знать аналитику о NumPy: массивы, типы, boolean-маски, np.where и векторизация, которая лежит под многими операциями pandas.

Pandas часто скрывает NumPy под привычными операциями над колонками. Но понимание массивов помогает объяснить типы, broadcasting, boolean-маски и причины, по которым векторный расчёт работает быстрее цикла по строкам. Аналитику не нужен весь NumPy: достаточно нескольких идей, которые встречаются каждый день.
Коротко
NumPy хранит однородные числовые массивы и выполняет операции над ними без явного цикла Python. `ndarray`, маски, `np.where`, `np.select` и базовые агрегаты помогают писать расчёты над колонками pandas проще и предсказуемее.
- Массив обычно содержит значения одного dtype.
- Операция над массивом применяется к элементам поэлементно.
- Boolean-маска выбирает нужные значения без цикла.
- Broadcasting позволяет применять одно число или вектор к массиву совместимой формы.
Массив и dtype
В списке Python числа и строки могут сосуществовать свободно. NumPy старается хранить массив компактно и однородно, поэтому тип влияет на память и результат операции. В аналитике это особенно заметно на больших числовых колонках и при смешении чисел с пропусками.
import numpy as np
revenue = np.array([1200, 800, 450, 1500], dtype='int32')
net_revenue = revenue * 0.9
print(net_revenue)
print(revenue.dtype, revenue.shape)Маски вместо циклов
Boolean-маска — массив True/False той же длины, что и исходные значения. Она превращает правило фильтрации в объект, который можно проверить и передать дальше. В pandas тот же подход работает для Series и DataFrame.
revenue = np.array([1200, 800, 450, 1500])
large_mask = revenue >= 1000
large_orders = revenue[large_mask]
print(large_mask) # [ True False False True ]
print(large_orders) # [1200 1500]np.where и np.select для правил
`np.where` подходит для простого выбора из двух вариантов. Для нескольких условий используй `np.select`, чтобы порядок правил был виден в коде. В обоих случаях обязательно задай значение для случая, который не попал в условия.
orders['is_large'] = np.where(
orders['revenue'].ge(1000), True, False
)
conditions = [orders['revenue'].ge(5000), orders['revenue'].ge(1500)]
orders['segment'] = np.select(
conditions, ['high', 'medium'], default='low'
)Агрегаты и broadcasting
Агрегаты NumPy считают сумму, среднее и квантили по массиву или выбранной оси. Broadcasting позволяет вычесть среднее из каждого значения без ручного цикла. В реальной метрике всё равно проверь пропуски и знаменатель: NumPy не знает, что означает отсутствие наблюдения.
revenue = np.array([1200, 800, 450, 1500], dtype='float64')
average = revenue.mean()
deviation = revenue - average
print('mean:', average)
print('p90:', np.quantile(revenue, .9))
print('deviation:', deviation)Векторная операция отвечает за вычисление. Определение периода, пользователя, активного действия и знаменателя остаётся аналитической задачей.
Материалы по теме
Как тестировать аналитические расчёты на Python и pandas
Практический гайд по тестам для аналитика: проверить метрики на маленьком датасете, поймать регрессию и защитить расчёт от тихих изменений.
Читать материал
Как ускорить pandas: память, типы и обработка больших файлов
Что делать, если pandas медленно работает или не помещает файл в память: категории, downcast, chunksize, Parquet и контроль размера данных.
Читать материал
Pandas apply и векторизация: как писать быстрее и понятнее
Когда использовать apply, почему векторные операции быстрее и как переписать медленный построчный расчёт в pandas.
Читать материал