Стек данных: NumPy и pandas
Массивы, DataFrame и векторизация — дверь из обычного Python в работу с данными
for гибкие, но медленные для числовых расчётов, потому что каждый элемент — это полноценный объект Python, а каждая операция выполняется интерпретируемым байт-кодом. NumPy хранит числа в одном непрерывном типизированном блоке и переносит операции над всем массивом в скомпилированный C — это векторизация. pandas строит поверх NumPy размеченную столбцовую таблицу (DataFrame), позволяя выбирать, выравнивать, группировать и агрегировать реальные данные по имени, а не вручную. Вместе они — фундамент, на котором держится вся остальная экосистема анализа данных на Python.
- объяснить, почему
ndarrayв NumPy быстрее и компактнее списка чисел, - заменять поэлементные циклы векторизованными выражениями над массивами,
- рассуждать о dtype, непрерывной памяти и о представлениях (view) против копий,
- применять правила broadcasting для операций над массивами разной формы,
- строить и запрашивать
DataFrameс помощьюloc/ilocи булевых масок, - сводить данные шаблоном split-apply-combine (
groupby), - решать, когда обращаться к стеку данных, а когда лучше обычный Python.
1. Зачем нужен стек данных: цена цикла Python
Вы уже умеете суммировать миллион чисел через генератор или цикл. Это работает, но дорого. В CPython list целых чисел — это на самом деле массив указателей, каждый из которых ведёт к отдельному объекту int в куче со своим заголовком. Сложение двух списков поэлементно означает: разыменовать указатель, распаковать объект, вызвать __add__, упаковать результат, сохранить новый указатель — для каждого элемента, в интерпретируемом байт-коде.
# Поэлементное сложение двух списков на чистом Python
def add_lists(a, b):
return [x + y for x, y in zip(a, b)] # операция над объектом Python на каждый элемент
NumPy бьёт по всем трём затратам сразу: хранит числа как сырые машинные значения (без объекта на элемент), держит их непрерывно в памяти (дружелюбно к кэшу) и выполняет сам цикл в скомпилированном C. Векторизованное a + b над двумя массивами по миллиону элементов обычно в десятки раз быстрее приведённого выше генератора — и код короче.