Перейти к содержанию

Начало урока

Стек данных: NumPy и pandas

Массивы, DataFrame и векторизация — дверь из обычного Python в работу с данными

Главная идея: Обычные списки 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 над двумя массивами по миллиону элементов обычно в десятки раз быстрее приведённого выше генератора — и код короче.

Продолжите этот урок на YourAIZone

В полном уроке — объяснение целиком, разобранные примеры, частые ошибки, тесты с мгновенной проверкой и ИИ-репетитор. Начните сразу как гость или создайте аккаунт, чтобы сохранять прогресс.

В полном уроке

  • Объяснение целиком
  • Разобранные примеры
  • Частые ошибки и как их избежать
  • Тестовые вопросы: 15
  • ИИ-репетитор, который отвечает на вопросы по теме
  • Отслеживание прогресса для ученика, родителей и учителя