Программирование

Polars: самая быстрая библиотека для обработки данных

Время прочтения: 3 мин.

Устанавливаем Polars:

Перемещаемся в Jupyter Notebook:

Импортируем нужные нам библиотеки:

import polars as pl
import pandas as pd

Набор данных, на котором будут проводиться все тесты:

Набор данных представляет из себя таблицу с лучшими бомбардирами футбольных лиг с 2016 по 2020 год.

Время считывания файла:

%time pl_data = pl.read_csv("Data.csv")
CPU times: user 7.7 ms, sys: 5.7 ms, total: 13.4 ms
Wall time: 9.94 ms

%time pd_data = pd.read_csv("Data.csv")
CPU times: user 11.9 ms, sys: 4.59 ms, total: 16.5 ms
Wall time: 17.1 ms

Видно, что Pandas проиграл по скорости считывания файла практически в два раза.

Далее вызовем метод shape, чтобы посмотреть на размерность нашего набора данных

%time pl_data.shape
CPU times: user 27 µs, sys: 8 µs, total: 35 µs
Wall time: 38.1 µs

(660, 15)

%time pd_data.shape

CPU times: user 32 µs, sys: 4 µs, total: 36 µs
Wall time: 39.8 µs
(660, 15)

В данном противостоянии Polaris оказался ненамного быстрее Pandas. Идем дальше

Теперь проведем фильтрацию нашего набора данных. Давайте посмотрим на игроков, которые забили больше 20 голов за один сезон и играют в La Liga (Чемпионат испании):

%time pl_data_filter = pl_data[(pl_data["Goals"] > 20) & (pl_data["League"] == "La Liga")]

CPU times: user 744 µs, sys: 469 µs, total: 1.21 ms
Wall time: 501 µs

%time pd_data_filter = pd_data[(pd_data["Goals"] > 20) & (pd_data["League"] == "La Liga")]

CPU times: user 2.22 ms, sys: 98 µs, total: 2.31 ms
Wall time: 2.27 ms

Polaris с фильтрацией справился быстрее нежели Pandas. Посмотрим на результат фильтрации

pl_data_filter

Стоит отметить, что под названием колонки Polaris пишет ее тип, что крайне удобно, на мой взгляд.

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

%time pl_group_by = pl_data.groupby("Player Names").agg([pl.col("Goals").mean()]).sort("Goals_mean", reverse=True)

CPU times: user 5.52 ms, sys: 8 ms, total: 13.5 ms
Wall time: 4.78 ms

%time pd_group_by = pd_data.groupby("Player Names").agg({'Goals': 'mean'}).sort_values("Goals", ascending=False)


CPU times: user 7.87 ms, sys: 528 µs, total: 8.4 ms
Wall time: 7.9 ms

Pandas проиграл по скорости группировки в 1.5 раза, посмотрим на результат группировки (выберем топ-5):

pl_group_by[:5]

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

%time pl_group_by.to_csv('Polars.csv')

CPU times: user 460 µs, sys: 1.54 ms, total: 2 ms
Wall time: 3.41 ms

%time pd_group_by.to_csv('Pandas.csv')

CPU times: user 5.61 ms, sys: 2.45 ms, total: 8.07 ms
Wall time: 7.77 ms

Polars оказался быстрее Pandas по сохранению файла в 2 раза.

В заключении хочу отметить, что всем, кто занимается анализом данных, стоит обратить внимание на данную библиотеку, синтаксис практически не отличается от синтаксиса Pandas, но скорость у Polars выше. Так же оставлю ссылку на документацию Polars: тык.

Советуем почитать