Что нового в Pandas 2.1

Новое в Pandas 2.1

Самые интересные вещи о новом релизе

Фото от Лукаса В. на Unsplash

pandas 2.1 был выпущен 30 августа 2023 года. Давайте посмотрим, что нового в этом релизе и как он поможет нам улучшить нашу работу с pandas. Он включает множество улучшений и также набор новых устареваний.

pandas 2.1 сильно опирается на интеграцию с PyArrow, которая стала доступной с pandas 2.0. Мы сосредоточились на поддержке новых функций, которые ожидаются стать основными в pandas 3.0. Давайте рассмотрим, что это означает для вас. Мы рассмотрим наиболее важные улучшения подробно.

Я являюсь частью ядра команды pandas. Я являюсь инженером с открытым исходным кодом для Coiled, где я работаю над Dask, включая улучшение интеграции с pandas.

Избегание использования объектного типа данных NumPy для столбцов со строками

Одна из основных проблем в pandas – неэффективное представление строк. Мы работали над этой проблемой довольно долго. Первый тип данных строк, основанный на PyArrow, стал доступным в pandas 1.3. Он имеет потенциал сократить использование памяти примерно на 70% и улучшить производительность. Я исследовал эту тему более подробно в одном из своих предыдущих постов, который включает сравнения памяти и измерения производительности (короче говоря, это впечатляет).

Мы решили ввести новую опцию конфигурации, которая будет хранить все столбцы со строками в массиве PyArrow. Вам больше не нужно беспокоиться о приведении типов столбцов со строками, это просто будет работать.

Вы можете включить эту опцию с помощью:

pd.options.future.infer_string = True

Это поведение станет основным в pandas 3.0, что означает, что столбцы со строками всегда будут поддерживаться PyArrow. Для использования этой опции вам нужно установить PyArrow.

PyArrow имеет другое поведение, чем тип данных объекта NumPy, что может вызывать сложности в подробном понимании. Мы реализовали тип данных строк, используемый для этой опции, чтобы он был совместим с семантикой NumPy. Он будет вести себя точно так же, как столбцы объектов NumPy. Я призываю всех попробовать это!

Улучшенная поддержка PyArrow

Мы представили DataFrame, основанный на PyArrow, в pandas 2.0. Одна из основных целей для нас была улучшение интеграции в pandas за последние несколько месяцев. Мы стремились сделать переход от DataFrame, основанного на NumPy, максимально простым. Одной из областей, на которую мы сосредоточились, было исправление узких мест производительности, так как это вызывало неожиданные замедления ранее.

Давайте посмотрим на пример:

import pandas as pdimport numpy as npdf = pd.DataFrame(    {        "foo": np.random.randint(1, 10, (1_000_000, )),        "bar": np.random.randint(1, 100, (1_000_000,)),    }, dtype="int64[pyarrow]")grouped = df.groupby("foo")

У нашего DataFrame 1 миллион строк и 10 групп. Давайте посмотрим на производительность в pandas 2.0.3 по сравнению с pandas 2.1:

# pandas 2.0.310.6 ms ± 72.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)# pandas 2.1.01.91 ms ± 3.16 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

В этом конкретном примере новая версия работает в 5 раз быстрее. merge – это еще одна часто используемая функция, которая теперь будет работать быстрее. Мы надеемся, что опыт использования DataFrame, основанного на PyArrow, теперь намного лучше.

Копирование при записи

Копирование при записи было введено в pandas 1.5.0 и ожидается, что станет поведением по умолчанию в pandas 3.0. Копирование при записи уже обеспечивает хороший опыт в pandas 2.0.x. Мы в основном сосредоточены на исправлении известных ошибок и улучшении производительности. Я рекомендую использовать этот режим уже сейчас в производстве. Я написал серию блог-постов, объясняющих, что такое копирование при записи и как оно работает. Эти блог-посты подробно описывают и объясняют, как работает копирование при записи внутри и что вы можете от него ожидать. Это включает производительность и поведение.

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

Устаревание тихого приведения типов в операциях типа setiten

Исторически, pandas молча изменяла тип данных одного из ваших столбцов, если вы устанавливаете в него несовместимое значение. Давайте рассмотрим пример:

ser = pd.Series([1, 2, 3])0    11    22    3dtype: int64

У нас есть серия с целыми числами, что приведет к типу данных int. Давайте установим букву "a" во вторую строку:

ser.iloc[1] = "a"0    11    a2    3dtype: object

Это изменяет тип данных вашей серии на object. Object – это единственный тип данных, который может содержать целые числа и строки. Это большая проблема для многих пользователей. Столбцы объектов занимают много памяти, вычисления больше не работают, производительность снижается и многое другое. Кроме того, внутренне было добавлено много специальных случаев для адаптации к этим вещам. Молчаливые изменения типов данных в моем DataFrame были большой проблемой для меня в прошлом. Это поведение теперь устарело и вызовет FutureWarning:

FutureWarning: Setting an item of incompatible dtype is deprecated and will raise in a future error of pandas. Value 'a' has dtype incompatible with int64, please explicitly cast to a compatible dtype first.  ser.iloc[1] = "a"

Операции, подобные нашему примеру, вызовут ошибку в pandas 3.0. Типы данных столбцов DataFrame будут оставаться согласованными при выполнении различных операций. Вам придется быть явным, когда вы хотите изменить тип данных, что добавляет немного кода, но упрощает понимание для будущих разработчиков.

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

Обновление до новой версии

Вы можете установить новую версию pandas с помощью:

pip install -U pandas

Или:

mamba install -c conda-forge pandas=2.1

Это даст вам новый релиз в вашей среде.

Вывод

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

Спасибо за чтение. Не стесняйтесь связаться, чтобы поделиться своими мыслями и отзывами.