Pandas vs Polars: сравнение синтаксиса и скорости
Pandas – это незаменимая библиотека Python для Data Science. Её самым большим недостатком является то, что она может быть медленной при операциях с большими наборами данных. Polars – это альтернатива Pandas, предназначенная для более быстрой обработки данных.
Polars – это альтернатива Pandas, предназначенная для более быстрой обработки данных.
Эта статья кратко познакомит вас с библиотекой Polars и сравнит её с популярной библиотекой Data Science Pandas в отношении синтаксиса и скорости.
Вы можете найти код, присутствующий в этой статье, в Kaggle Notebook.
Что такое Polars и почему он быстрее, чем Pandas?
Согласно руководству пользователя цель Polars “состоит в том, чтобы предоставить молниеносную библиотеку датафреймов, которая использует все доступные ядра на вашем компьютере”.
В отличие от Polars, Pandas изначально не распараллеливает обработку между ядрами вашего компьютера. Другие инструменты, такие как Dask, построены на библиотеках, подобных Pandas, чтобы попытаться распараллелить их. Несмотря на то, что Polars написан на Rust, он имеет пакет Python, что делает его потенциальной альтернативой Pandas.
У Polars есть два разных API: eager API и lazy API.
Eager исполнение похоже на то, что присутствует в Pandas. Это означает, что код выполняется напрямую, и его результаты возвращаются немедленно.
С другой стороны, lazy исполнение не выполняется до тех пор, пока вам не понадобятся результаты. Поскольку это позволяет избежать запуска ненужного кода, lazy исполнение может быть более эффективным, чем eager.
Для lazy исполнения вы должны начать свою операцию с помощью метода .lazy().
Затем вы можете написать код для всего, что вы хотите сделать. В конце концов, вам нужно запустить метод .collect()
, чтобы отразить результаты.
df.lazy()
.filter(pl.col('col') > 5)
#...
.collect()
Бенчмарк
Для сравнительного анализа мы позаимствуем настройку бенчмарка из моей предыдущей статьи, в которой сравнивались различные форматы файлов.
Эта настройка бенчмарка использует вымышленный набор данных, содержащий по одному столбцу каждого типа данных. Чтобы уменьшить временной шум для удобства сравнения, этот вымышленный набор данных содержит 4 000 000 строк и имеет размер почти 1 ГБ.
В дальнейшем мы будем определять время выполнения с помощью %%timeit
.
Начало работы с Polars
Чтобы начать пользоваться Polars, необходимо установить его с помощью pip.
pip install polars
После этого вы можете импортировать пакет Polars Python точно так же, как вы бы сделали с Pandas.
import polars as pl
import pandas as pd
Теперь у вас всё готово!
Сравнение Pandas и Polars
На первый взгляд, Pandas и Polars (eager API) схожи в отношении синтаксиса из-за их общих основных строительных блоков: рядов и фреймов данных.
Кроме того, многие выражения в Polars похожи на выражения Pandas:
# Example expressions that work both with Pandas and Polars
df.head() # Get the first n rows
df.tail() # Get the last n rows
df.unique() # Get unique values of this expression.
Но, согласно руководству пользователя Polars, “если ваш код Polars выглядит так, как будто это может быть код Pandas, он может работать, но, скорее всего, медленнее, чем следовало бы”.
В этом разделе рассматриваются основные аспекты того, чем Polars отличается от Pandas в отношении синтаксиса и времени выполнения.
Считывание данных
Чтение CSV-файла в Polars покажется знакомым, потому что вы можете использовать метод .read_csv()
, как в Pandas:
# Pandas
pd.read_csv('example.csv')
# Polars
pl.read_csv('example.csv')
Результаты времени выполнения чтения выборочного набора данных в Pandas и Polars показаны ниже:
Считывание данных с Pandas занимает примерно в восемь раз больше времени, чем с Polars.
Выбор и фильтрация данных
Первое существенное различие между Pandas и Polars заключается в том, что Polars не использует индексы. Вместо этого каждая строка индексируется по её целочисленной позиции в DataFrame.
В Polars вы должны использовать метод .select()
для выбора данных.
# Pandas
df[['col1', 'col2']]
# The above code will run with Polars as well,
# but the correct way in Polars is:
df.select(pl.col(['col1', 'col2']))
Результаты времени выполнения выбора данных в Pandas и Polars показано ниже:
Для нашего датасета отбор данных с Pandas занимает примерно в 15 раз больше времени, чем с Polars.
В то время как вы бы использовали метод .query()
в Pandas для фильтрации данных, вам необходимо использовать метод .filter()
в Polars.
# Pandas
df.query('col1 > 5')
# Polars
df.filter(pl.col('col') > 5)
Результаты времени выполнения фильтрации данных в Pandas и Polars показаны ниже:
Для нашего датасета фильтрация фрейма данных занимает одинаковое количество времени и в Pandas, и в Polars.
В отличие от Pandas, Polars может выполнять операции в .select()
и .filter()
параллельно.
Создание новых столбцов
Создание нового столбца в Polars отличается от того, к чему вы могли привыкнуть в Pandas. В Polars вам нужно использовать метод .with_columns()
.
# Pandas
df_pd["new_col"] = df_pd["col"] * 10
# Polars
df.with_columns([
(pl.col("col") * 10).alias("new_col"),
])
Результаты времени создания нового столбца в Pandas и Polars показаны ниже:
Для нашего датасета создание нового столбца с Polars занимает почти в три раза больше времени, чем с Pandas.
Группировка и агрегирование
Группировка и агрегирование немного отличаются у обеих библиотек с точки зрения синтаксиса, но все они используют методы .groupby()
и .agg()
.
# Pandas
df_pd.groupby('col1')['col2'].agg('mean')
# Polars
df.groupby('col1').agg([pl.col('col2').mean()])
Результаты времени группировки и агрегирования в Pandas и Polars показаны ниже:
Для нашего датасета агрегирование данных с Pandas занимает примерно в два раза больше времени, чем с Polars.
Отсутствующие значения
Ещё одно важное различие между Pandas и Polars заключается в том, что Pandas использует значения NaN для указания отсутствующих значений, в то время как Polars использует null.
Таким образом, вместо метода .fillna()
в Pandas, вы должны использовать метод .fill_null()
в Polars.
Заключение
Итак, Polars лучше Pandas? Polars заменит Pandas?
Главное преимущество Polars перед Pandas – скорость. Если вам нужно выполнить обработку данных больших датасетов, вам обязательно следует попробовать Polars.
Главное преимущество Polars перед Pandas – это его скорость.
Но, как показано в этой статье, вам придётся изучить синтаксис Polars, если вы хотите окончательно перейти на него. Кроме того, вы увидели, что код Polars обычно немного длиннее кода Pandas для одной и той же операции. И последнее, но не менее важное: Polars не охватывает весь спектр функциональных возможностей, которыми обладает Pandas. Например, анализ данных.
Код Polars обычно немного длиннее кода Pandas
https://t.me/data_analysis_ml – data science телеграм канал