{"id":14291,"url":"\/distributions\/14291\/click?bit=1&hash=257d5375fbb462be671b713a7a4184bd5d4f9c6ce46e0d204104db0e88eadadd","hash":"257d5375fbb462be671b713a7a4184bd5d4f9c6ce46e0d204104db0e88eadadd","title":"\u0420\u0435\u043a\u043b\u0430\u043c\u0430 \u043d\u0430 Ozon \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0442\u0430\u043c \u043d\u0435 \u043f\u0440\u043e\u0434\u0430\u0451\u0442","buttonText":"","imageUuid":""}

Добро пожаловать в Pandas 2.0

Вступление

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

Изменения в API

Версия 2.0 является основной версией для pandas (ознакомьтесь с политикой управления версиями). В последней версии 1.5.3 было около 150 различных предупреждений. Если ваш код запускается без предупреждений на версии 1.5.3, вы должны быть готовы перейти на версию 2.0. Мы быстро рассмотрим некоторые незначительные или более заметные недостатки, прежде чем переходить к новым функциям. Вы можете ознакомиться с полными примечаниями к выпуску здесь.

Индекс теперь поддерживает произвольные NumPy типы данных

До выпуска версии 2.0, Index поддерживал только типы данных int64, float64 и uint64, что приводило к Int64Index, Float64Index или UInt64Index. Эти классы были удалены. Все числовые индексы теперь представлены в виде Index с соответствующим типом данных, например:

In [1]: pd.Index([1, 2, 3], dtype="int64") Out[1]: Index([1, 2, 3], dtype='int64') In [2]: pd.Index([1, 2, 3], dtype="int32") Out[2]: Index([1, 2, 3], dtype='int32')

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

Изменение поведения в numeric_only для функций агрегирования

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

Вычисление среднего значения по фрейму данных исключало нечисловые столбцы до версии 2.0:

In[2] df = DataFrame({"a": [1, 2, 3], "b": ["x", "y", "z"]}) In[3] df.mean() Out[3]: a 2.0 dtype: float64

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

TypeError: Could not convert ['xyz'] to numeric

Улучшения и особенности

pandas 2.0 предлагает несколько интересных новых особенностей, таких как фреймы данных с поддержкой PyArrow, разрешение / точность временных меток, отличных от наносекунд, и множество Copy-on-Write улучшений. Давайте подробнее рассмотрим некоторые из них.

Улучшена поддержка обнуляемых типов данных и массивов расширений

Версия 2.0 значительно улучшила работу с обнуляемыми типами данных и массивами расширений в целом. Внутренне многие операции теперь используют обнуляемую семантику вместо приведения к объекту при использовании обнуляемых типов данных, таких как Int64, boolean или Float64. Внутренняя обработка массивов расширений стала последовательно улучшаться по сравнению с серией 1.x. Это видно по ряду существенных улучшений производительности:

В pandas 2.0:

In[3]: ser = pd.Series(list(range(1, 1_000_000)) + [pd.NA], dtype="Int64") In[4]: %timeit ser.drop_duplicates() 7.54 ms ± 24 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

В pandas 1.5.3:

In[3]: ser = pd.Series(list(range(1, 1_000_000)) + [pd.NA], dtype="Int64") In[4]: %timeit ser.drop_duplicates() 22.7 ms ± 272 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

Кроме того, многие операции теперь корректно работают с массивами с возможностью обнуления, которые поддерживают соответствующий тип данных при возврате результата. Все алгоритмы groupby теперь используют семантику nullable, что приводит к повышению точности (ранее входные данные приводились к значению float, что могло привести к потере точности) и повышению производительности.

Классы Index и MultiIndex теперь лучше интегрированы с массивами расширений в целом. Общая поддержка массива расширений была введена в версии 1.4. Краткий обзор того, что это влечёт за собой:

  • Использование семантики расширенного массива для операций с индексом
  • Эффективные операции индексации для типов с нулевым значением и pyarrow типами данных
  • Отсутствие материализации MultiIndexes для повышения производительности и поддержания типов данных

Интерфейс Extension Array постоянно совершенствуется и продолжает избегать материализации массивов NumPy и вместо этого полагается на предоставленную реализацию extension array во всё большем числе методов. Некоторые области всё ещё находятся в стадии разработки, включая агрегации GroupBy для сторонних массивов расширений.

Фреймы данных, поддерживаемые Pyarrow

Версия 1.5.0 добавила в pandas новое расширение массива, которое позволяет пользователям создавать фреймы данных, поддерживаемые массивами PyArrow. Мы ожидаем, что эти массивы расширений обеспечат значительное улучшение при работе со строковыми столбцами, поскольку объектное представление NumPy не очень эффективно. Строковое представление в основном эквивалентно string[pyarrow], которое существует уже довольно давно. Массив расширений, специфичный для PyArrow, поддерживает все остальные типы данных PyArrow поверх него. Теперь пользователи могут создавать столбцы с любым типом данных PyArrow и/ или использовать семантику обнуления PyArrow. Столбец с поддержкой PyArrow может быть запрошен специально путём приведения к типу данных столбца или указания его как f"{dtype}[pyarrow]". Например: "int64[pyarrow]" для целочисленного столбца. В качестве альтернативы, тип данных PyArrow может быть создан с помощью:

import pandas as pd import pyarrow as pa dtype = pd.ArrowDtype(pa.int64)

API в версии 1.5.0 было довольно сырым и экспериментальным и довольно часто возвращалось к NumPy. С pandas 2.0 и увеличенной минимальной версией PyArrow (7.0 для pandas 2.0) мы можем использовать соответствующие вычислительные функции PyArrow во многих других методах. Это значительно повышает производительность и избавляет от многих предупреждений, которые возникали ранее при возврате к NumPy. Аналогично обнуляемым типам данных, большинство методов ввода-вывода могут возвращать фреймы данных с поддержкой PyArrow с помощью ключевого слова dtype_backend="pyarrow"

Будущие версии pandas принесут ещё много улучшений в этой области!

Некоторые методы ввода-вывода имеют специальные механизмы PyArrow, такие как read_csv и read_json, которые обеспечивают значительное повышение производительности при запросе фреймов данных, поддерживаемых PyArrow. Ознакомьтесь с более подробным исследованием от Марка Гарсии.

Не Наносекундное разрешение во временных метках

Давняя проблема pandas заключалась в том, что временные метки всегда представлялись с разрешением в наносекунду. Как следствие, не было никакого способа представить даты до 21 сентября 1677 года или после 11 апреля 2264 года. Это вызывало проблемы в исследовательском сообществе при анализе данных временных рядов, охватывающих тысячелетия и более.

В версии 2.0 появилась поддержка других разрешений, например, была добавлена поддержка секундного, миллисекундного и микросекундного разрешения. Это позволяет использовать временные диапазоны до +/- 2.9e11 years и, таким образом, должно охватывать наиболее распространённые варианты использования.

В предыдущих версиях передача даты конструктору Timestamp, которая находилась вне поддерживаемого диапазона, вызывала ошибку независимо от того, какая единица измерения была указана. С pandas 2.0 единица измерения соблюдается, и, таким образом, вы можете создавать произвольные даты:

In[5]: pd.Timestamp("1000-10-11", unit="s") Out[5]: Timestamp('1000-10-11 00:00:00')

Временная метка возвращается только с точностью до секунды, более высокая точность не поддерживается при указании unit="s".

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

Улучшения Copy-on-Write

Copy-on-Write (CoW) первоначально был представлен в pandas 1.5.0. Ознакомьтесь с моим первоначальным сообщением о Copy-on-Write.

Краткое резюме:Любой фрейм данных или серия, производные от другого каким-либо образом, всегда ведут себя как копия. Как следствие, мы можем изменять значения объекта только путём модификации самого объекта. CoW запрещает обновление фрейма данных или серии, которые совместно используют данные с другим объектом DataFrame или Series inplace.

Версия 1.5 предоставляла общий механизм, но не сильно отличалась от этого. С тех пор была обнаружена и исправлена пара ошибок, из-за которых не соблюдалось копирование при записи, и, следовательно, два объекта могли быть изменены с помощью одной операции.

Что ещё более важно, почти все методы теперь используют механизм отложенного копирования, чтобы избежать копирования базовых данных как можно дольше. Без включения CoW большинство методов выполняют защитные копии, чтобы избежать побочных эффектов при последующем изменении объекта. Это приводит к высокому использованию памяти и относительно высокому времени выполнения. Copy-on-Write позволяет нам удалять все защитные копии и откладывать фактические копии до тех пор, пока данные объекта не будут изменены.

Кроме того, CoW обеспечивает более чистый и простой в работе API и должен повысить производительность вашего кода. Как правило, если приложение не полагается на обновление более чем одного объекта одновременно и не использует цепное присвоение, риск включения Copy-on-Write незначителен. Я протестировал его на некоторых кодовых базах и увидел многообещающие улучшения производительности, поэтому я бы рекомендовал попробовать его, чтобы посмотреть, как это повлияет на ваш код. В настоящее время мы планируем установить CoW по умолчанию в следующем крупном выпуске. Я бы рекомендовал разрабатывать новые функции с включённым Copy-on-Write, чтобы избежать проблем с перемещением в дальнейшем.

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

Было представлено PDEP (предложение по улучшению разработки pandas), предлагающее отказаться от использования и удалить ключевые слова inplace и copy в большинстве методов. Они устарели бы при включенном Copy-on-Write и только добавили бы путаницы пользователям. Вы можете следить за этой дискуссией здесь. Если это будет принято, удаление обоих ключевых слов произойдет, когда значение CoW будет установлено по умолчанию.

Заключение

pandas 2.0 предлагает множество новых и интересных функций. Мы ознакомились с парой из них и рассмотрели, как их использовать. Я надеюсь, что данная статья оказалась для вас полезной!

Статья была взята из этого источника:

0
Комментарии
-3 комментариев
Раскрывать всегда