5 лучших функций для эффективной обработки данных

Благодаря своей обширной функциональности и универсальностиpandasзанял место в сердце каждого специалиста по обработке и анализу данных.

От ввода/вывода данных до очистки и преобразования данных почти невозможно представить себе манипулирование данными без import pandas as pd, правильно?

Теперь потерпите меня: в связи с такой шумихой вокруг LLM за последние месяцы я каким-то образом упустил из виду тот факт, что pandas только что претерпел крупный релиз! Ага, pandas 2.0 вышел и пришел с оружием наготове!

Хотя я не был в курсе всего ажиотажа, Data-Centric AI Community тут же пришло на помощь:

Забавный факт: Знали ли вы, что этот релиз готовился целых три года? Вот это я называю «приверженностью сообществу»!

Что предлагает pandas 2.0? Давайте погрузимся прямо в это!

1. Производительность, скорость и эффективность использования памяти

Как мы все знаем, pandas был построен с использованием numpy, который не был специально разработан в качестве серверной части для библиотек данных. По этой причине одним из основных ограничений pandas была обработка в памяти больших наборов данных.

В этом выпуске большое изменение связано с введением серверной части Apache Arrow для данных pandas.

По сути, Arrow — это стандартизированный столбцовый формат данных в памяти с доступными библиотеками для нескольких языков программирования (среди прочих C, C++, R, Python). Для Python есть PyArrow, который основан на реализации Arrow на C++ и, следовательно, быстрый!

Короче говоря, PyArrow позаботится о наших прежних ограничениях памяти версий 1.X и позволит нам выполнять более быстрые и эффективные операции с данными, особенно для больших наборов данных.

Вот сравнение между чтением данных без бэкенда и с ним, с использованием набора данных Hacker News, который составляет около 650 МБ (лицензия CC BY-NC-SA 4.0):

Как видите, использование нового бэкенда ускоряет чтение данных почти в 35 раз. Другие аспекты, на которые стоит обратить внимание:

  • Без серверной части pyarrow каждый столбец/функция хранится как собственный уникальный тип данных: числовые функции хранятся как int64 или float64, а строковые значения хранятся как объекты. ;
  • С pyarrow все объекты используют типы Arrow: обратите внимание на аннотацию [pyarrow] и различные типы данных: int64 , float64 , string , timestamp и double :

2. Типы данных Arrow и индексы Numpy

Помимо чтения данных, что является простейшим случаем, вы можете ожидать дополнительных улучшений для ряда других операций, особенно операций со строками, поскольку реализация строкового типа данных в pyarrow весьма эффективна:

На самом деле Arrow имеет больше (и лучшую поддержку) типов данных, чем numpy, которые необходимы вне научной (числовой) области: даты и время, продолжительность, >двоичные, десятичные, списки и карты. Беглый взгляд на эквивалентность между типами данных, поддерживаемыми pyarrow и numpy, на самом деле может быть хорошим упражнением, если вы хотите научиться их использовать.

Теперь также можно хранить в индексах больше числовых типов numpy.
Традиционные int64, uint64 и float64 освободили место для всех значений индекса dtypes numpy, поэтому мы можем, например, , вместо этого укажите их 32-разрядную версию:

Это долгожданное изменение, поскольку индексы — одна из наиболее часто используемых функций в pandas, позволяющая пользователям фильтровать, объединять и перемешивать данные среди других операций с данными. По сути, чем светлее Индекс, тем эффективнее будут эти процессы!

3. Более простая обработка пропущенных значений

Будучи построенным на основе numpy, pandas было трудно обрабатывать отсутствующие значения простым и гибким способом, поскольку numpy не поддерживает нулевые значения для некоторых типов данных.

Например, целые числа автоматически преобразуются в числа с плавающей запятой, что не идеально:

Обратите внимание, как points автоматически меняется с int64 на float64 после введения значения singleNone.

Нет ничего хуже для потока данных, чем неправильный набор текста, особенно в парадигме искусственного интеллекта, ориентированной на данные.

Ошибочные наборы напрямую влияют на решения по подготовке данных, вызывают несовместимость между различными фрагментами данных, и даже при скрытой передаче они могут поставить под угрозу определенные операции, которые возвращают бессмысленные результаты.

Например, в Data-Centric AI Community мы в настоящее время работаем над проектом синтетические данные для конфиденциальности данных. Одна из характеристик, NOC (количество дочерних элементов), имеет пропущенные значения, поэтому она автоматически преобразуется в float при загрузке данных. При передаче данных в генеративную модель в виде float мы можем получить выходные значения в виде десятичных дробей, например 2,5 — если только вы не математик с двумя детьми, новорожденным и странным чувством юмора, имеющий 2,5. дети не в порядке.

В pandas 2.0 мы можем использоватьdtype = 'numpy_nullable', где отсутствующие значения учитываются без каких-либо изменений dtype, поэтому мы можем сохранить исходные типы данных (в данном случае int64):

Это может показаться небольшим изменением, но внутри это означает, что теперь pandas может нативно использовать реализацию Arrow для работы с отсутствующими значениями. Это делает операции гораздо более эффективными, поскольку pandas не нужно реализовывать собственную версию для обработки нулевых значений для каждого типа данных.

4. Оптимизация копирования при записи

Pandas 2.0 также добавляет новый механизм отложенного копирования, который откладывает копированиеобъектов DataFrames и Series до тех пор, пока они не будут изменены.

Это означает, что определенные методы будут возвращать представления, а не копии, когда включено копирование при записи, что повышает эффективность использования памяти за счет сведения к минимуму ненужного дублирования данных.

Это также означает, что вам нужно быть особенно осторожным при использовании цепочек назначений.

Если включен режим копирования при записи, связанные назначения не будут работать, поскольку они указывают на временный объект, являющийся результатом операции индексирования (которая при копировании при записи ведет себя как копирование).

Когда copy_on_write отключен, такие операции, как нарезка могут изменить исходный df, если новый фрейм данных изменен:

Когда copy_on_write включен, копия создается при назначении, поэтому исходный фрейм данных никогда не изменяется. Pandas 2.0 будет поднимать ChainedAssignmentError в этих ситуациях, чтобы избежать скрытых ошибок:

5. Необязательные зависимости

При использовании pip версия 2.0 дает нам возможность устанавливать необязательные зависимости, что является плюсом с точки зрения настройки и оптимизации ресурсов.

Мы можем адаптировать установку к нашим конкретным требованиям, не тратя место на диске на то, что нам на самом деле не нужно.

Кроме того, это избавляет от многих «головных болей, связанных с зависимостями», уменьшая вероятность проблем совместимости или конфликтов с другими пакетами, которые могут быть в наших средах разработки:

Принимая его за спину!

Тем не менее, оставался вопрос: действительно ли шумиха оправдана? Мне было любопытно посмотреть, обеспечивает ли pandas 2.0 значительные улучшения в отношении некоторых пакетов, которые я использую ежедневно: ydata-profiling, matplotlib, seaborn, scikit-learn.

Из них я решил попробовать ydata-profiling он только что добавил поддержку pandas 2.0, которая казалась обязательной для сообщества! В новой версии пользователи могут быть уверены, что их конвейеры не сломаются, если они используют pandas 2.0, и это большой плюс! А что еще?

По правде говоря, ydata-profiling был одним из моих самых любимых инструментов для исследовательского анализа данных, и это также хороший и быстрый тест — 1-строчный код на моей стороне, но внутри он множество вычислений, которые мне как специалисту по обработке данных необходимо выполнить — описательная статистика, построение гистограмм, анализ корреляций и т. д. и т. д.

Что может быть лучше, чем проверить влияние двигателя pyarrow на все сразу с минимальными усилиями?

Опять же, чтение данных определенно лучше с движком pyarrow, хотя создание профиля данных существенно не изменило скорость.

Тем не менее, различия могут зависеть от эффективности памяти, для которой нам придется провести другой анализ. Кроме того, мы могли бы дополнительно изучить тип анализа данных: для некоторых операций разница между версиями 1.5.2 и 2.0 кажется незначительной.

Но главное, что я заметил, что может иметь значение в этом отношении, это то, что ydata-profiling еще не использует типы данных pyarrow. Это обновление может оказать большое влияние как на скорость, так и на память, и я с нетерпением жду будущих разработок!

Вердикт: производительность, гибкость, совместимость!

Этот новый выпуск pandas 2.0 обеспечивает большую гибкость и оптимизацию производительности благодаря тонким, но важным изменениям «под капотом».

Может быть, они и не «броски» для новичков в области манипулирования данными, но они, черт возьми, как вода в пустыне для опытных специалистов по данным, которые привыкли прыгать через обручи, чтобы преодолеть ограничения предыдущих версий.

Подводя итог, перечислим основные преимущества новой версии:

  • Оптимизация производительности: с введением серверной части Apache Arrow, большего количества индексов numpy dtype и режима копирования при записи;
  • Дополнительная гибкость и индивидуальная настройка: предоставление пользователям возможности управлять необязательными зависимостями и использовать преимущества типов данных Apache Arrow (включая обнуляемость с самого начала!);
  • Интероперабельность: возможно, менее «признанное» преимущество новой версии, но с огромным влиянием. Поскольку Arrow не зависит от языка, данные в памяти могут передаваться между программами, построенными не только на Python, но и на R, Spark и других, использующих серверную часть Apache Arrow!

И вот оно, ребята! Я надеюсь, что на этом подведение итогов успокоило некоторые из ваших вопросов о pandas 2.0 и его применимости в наших задачах по обработке данных.

Мне все еще любопытно, нашли ли вы серьезные различия в ежедневном кодировании с введением pandas 2.0! Если вы готовы, приходите и найдите меня в Data-Centric AI Community и поделитесь своими мыслями! Увидимся?

Обо мне

Доктор философии, исследователь машинного обучения, преподаватель, специалист по защите данных и в целом «мастер на все руки». Здесь, на Medium, я пишу о Data-Centric AI и Data Quality, рассказывая сообществам Data Science & Machine Learning, как перейти от несовершенных к интеллектуальным данным.

Отношения с разработчиками @ YData | Сообщество ИИ, ориентированное на данные | Гитхаб | Инстаграм | Ученый Google | ЛинкедИн