текст перекладу
Ілюстрація: Pandas проти Polars. Згенеровано за допомогою ChatGPT
Введення
У цій статті ми порівняємо бібліотеки Pandas і Polars з точки зору продуктивності, зручності використання та практичності. Ми розглянемо різні аспекти, такі як завантаження даних, очищення даних, агрегація та з’єднання. Проведемо глибоке дослідження реальних бенчмарків, щоб допомогти вибрати найбільш підходящу бібліотеку для наших потреб.
Pandas вже більше десятиліття є основним інструментом для аналізу даних у Python. Вона надає інтуїтивно зрозумілий і зручний інтерфейс для маніпуляцій з даними. Її об'єкти DataFrame і Series дозволяють аналітикам легко працювати зі структурованими та табличними даними. Однак Pandas була розроблена в епоху, коли розміри даних зазвичай були меншими, а продуктивності одного потоку було достатньо.
Polars, в свою чергу, є відносно новою бібліотекою, створеною для вирішення сучасних проблем обробки даних. Написана на Rust, Polars використовує паралельну обробку для максимізації швидкості та ефективності.
Порівняння продуктивності
У цій статті ми порівняємо 6 аспектів:
- Завантаження даних
Ефективне завантаження даних є критично важливим при роботі з великими наборами даних. - Трансформація даних
Ми перевірили типові операції, такі як фільтрація, групування, з'єднання та агрегація. - Лінива оцінка
Лінива оцінка в Polars є однією з його ключових особливостей. - Багатопотоковість
Сучасні процесори працюють краще за умов паралелізму, і Polars ефективно використовує це. - Використання пам'яті
Ефективне використання пам'яті є важливим при роботі з великими наборами даних, щоб уникнути зависань чи уповільнень. - Зручність використання
Хоча продуктивність важлива, зручність використання часто визначає впровадження на практиці.
Резюме результатів порівняння, на основі різних джерел.
Реальні випадки використання
Набір даних
Ми будемо використовувати набір даних про поїздки жовтих таксі Нью-Йорка (NYC Yellow Taxi Trip dataset), який є реальним набором даних, доступним на сайті NYC Taxi & Limousine Commission.
текст перекладу
Він містить мільйони рядків і включає деталі поїздок, такі як місця посадки/висадки, часові мітки, відстань поїздки та сума плати.
Інціальний набір даних, понад 3 мільйони рядків та 19 стовпців, з використанням пам'яті понад 444,6 МБ.
Випадок використання 1: Завантаження та очищення даних
Завдання: Завантажити набір даних, відфільтрувати поїздки довжиною понад 10 миль і видалити рядки з відсутніми значеннями.
import pandas as pd
import polars as pl
import time
file_path = "yellow_tripdata_2023-01.parquet"
pandas_times = []
polars_times = []
# Виконуємо тести 10 разів
for _ in range(10):
# Виконання в Pandas
start_time = time.time()
df_pd = pd.read_parquet(file_path)
df_pd_cleaned = df_pd[df_pd["trip_distance"] > 10].dropna()
pandas_times.append(time.time() - start_time)
# Виконання в Polars
start_time = time.time()
df_pl = pl.read_parquet(file_path)
df_pl_cleaned = df_pl.filter(pl.col("trip_distance") > 10).drop_nulls()
polars_times.append(time.time() - start_time)
comparison_table = {
"Trial": list(range(1, 11)),
"Pandas Time (s)": pandas_times,
"Polars Time (s)": polars_times
}
comparison_df = pd.DataFrame(comparison_table)
comparison_df["Difference Multiplier"] = (
comparison_df["Pandas Time (s)"] / comparison_df["Polars Time (s)"]
).round(2)
comparison_df["Faster Package"] = comparison_df.apply(
lambda row: "Polars" if row["Polars Time (s)"] < row["Pandas Time (s)"] else "Pandas",
axis=1,
)
comparison_df
Таблиця результатів порівняння завантаження та очищення даних
На основі порівняння завантаження та очищення даних, Polars в середньому у 2,215 рази швидший за Pandas при обробці завантаження та очищення даних в наборі з понад 3 мільйонами рядків, 18 стовпцями та використанням пам'яті понад 444,6 МБ.
Випадок використання 2: Агрегація
Завдання: Обчислити середню суму тарифу на кількість пасажирів.
import pandas as pd
import polars as pl
import time
pd_times_groupby = []
pl_times_groupby = []
# Виконуємо тести 10 разів
for _ in range(10):
# Виконання в Pandas
start_time = time.time()
avg_fare_pd = df_pd.groupby("passenger_count")["fare_amount"].mean()
pd_times_groupby.append(time.time() - start_time)
# Виконання в Polars
start_time = time.time()
avg_fare_pl = df_pl.group_by("passenger_count").agg(pl.col("fare_amount").mean())
pl_times_groupby.append(time.time() - start_time)
comparison_table_groupby = {
"Trial": list(range(1, 11)),
"Pandas Time (s)": pd_times_groupby,
"Polars Time (s)": pl_times_groupby
}
comparison_df_groupby = pd.DataFrame(comparison_table_groupby)
comparison_df_groupby["Difference Multiplier"] = (
comparison_df_groupby["Pandas Time (s)"] / comparison_df_groupby["Polars Time (s)"]
).round(2)
comparison_df_groupby["Faster Package"] = comparison_df_groupby.apply(
lambda row: "Polars" if row["Polars Time (s)"] < row["Pandas Time (s)"] else "Pandas",
axis=1,
)
comparison_df_groupby
Таблиця результатів порівняння агрегації
На основі порівняння агрегації, Polars в середньому у 204,7 рази швидший за Pandas.
Випадок використання 3: З’єднання наборів даних
Завдання: З’єднати дані жовтих таксі Нью-Йорка з набором даних, що містить інформацію на основі ID місць посадки (132).
У цьому випадку ми використовуємо лише .head(100) для нових наборів даних через високі вимоги до пам'яті, якщо хочемо з'єднати повні набори даних.
import pandas as pd
import polars as pl
import time
df_pd_pu132 = df_pd[df_pd['PULocationID']==132].head(100)
df_pl_pu132 = df_pl.filter(pl.col("PULocationID") == 132).head(100)
pd_times_join = []
pl_times_join = []
# Виконуємо тести 10 разів
for _ in range(10):
# Виконання в Pandas
текст перекладу
start_time = time.time()
join_pd = pd.merge(df_pd, df_pd_pu132, on="PULocationID")
pd_times_join.append(time.time() - start_time)
# Виконання в Polars
start_time = time.time()
avg_fare_pl = df_pl.join(df_pl_pu132, on="PULocationID")
pl_times_join.append(time.time() - start_time)
comparison_table_join = {
"Trial": list(range(1, 11)),
"Pandas Time (s)": pd_times_join,
"Polars Time (s)": pl_times_join
}
comparison_df_join = pd.DataFrame(comparison_table_join)
comparison_df_join["Difference Multiplier"] = (
comparison_df_join["Pandas Time (s)"] / comparison_df_join["Polars Time (s)"]
).round(2)
comparison_df_join["Faster Package"] = comparison_df_join.apply(
lambda row: "Polars" if row["Polars Time (s)"] < row["Pandas Time (s)"] else "Pandas",
axis=1,
)
comparison_df_join
Таблиця результатів порівняння з’єднання даних
На основі порівняння з’єднання даних, Polars в середньому у 13,05 разів швидший за Pandas при виконанні з’єднання.
Обмеження
Pandas
1.
текст перекладу
Продуктивність при роботі з великими наборами даних: Pandas мають труднощі при обробці дуже великих наборів даних через їх однониткову обробку та високе використання пам'яті.
2. Неекономне використання пам'яті: Pandas використовує модель зберігання, орієнтовану на рядки, що менш ефективно, ніж стовпцеве зберігання для багатьох аналітичних задач.
3. Відсутність паралелізму: Більшість операцій у Pandas є однонитковими, що означає, що вони не використовують повною мірою можливості сучасних багатоядерних процесорів.
4. Різке зниження продуктивності при виконанні складних операцій: Операції, такі як групування, з'єднання або застосування користувацьких функцій до великих наборів даних, можуть бути значно повільнішими порівняно з більш оптимізованими бібліотеками, такими як Polars.
Polars
- Менша екосистема: Polars є відносно новою бібліотекою порівняно з Pandas і поки що не має такої ж широкої екосистеми чи підтримки спільноти. Деякі функціональності, доступні в Pandas, такі як пряме інтегрування з певними бібліотеками (наприклад, Matplotlib, Scikit-learn), можуть не бути повністю підтримуваними в Polars.
- Обмежена документація та навчальні матеріали: Хоча документація для Polars покращується, вона не така всеосяжна або дружня до початківців, як у Pandas.
- Налаштування та гнучкість: Хоча Polars надає відмінну продуктивність для стандартних операцій, їй може бракувати гнучкості, яку надає Pandas для дуже налаштованих робочих процесів, особливо тих, що вимагають складних користувацьких функцій.
- Сумісність з застарілими системами: Polars оптимізована для сучасного обладнання та вимагає відносно нової версії Python та залежностей. Це може бути не найкращим вибором для старих систем.
Висновок
Вибір між Pandas і Polars залежить від конкретних потреб робочого процесу з даними. Обидві бібліотеки мають унікальні переваги, і розуміння їх відмінностей допоможе вам зробити найкращий вибір для кожного конкретного випадку.
Ключові висновки
- Продуктивність та масштабованість: Polars є безсумнівним лідером при обробці великих наборів даних завдяки своїй багатонитковій обробці, пам'яткоефективній архітектурі та стовпцевому зберіганню.
- Легкість використання: Pandas ідеальний для початківців і користувачів, які цінують простоту та величезну екосистему супутніх бібліотек. Його багата документація та широка спільнота роблять його доступним і зручним для новачків.
- Розширені функції: Polars вводить такі можливості, як лінива оцінка (lazy evaluation), що дозволяє оптимізувати складні запити перед виконанням. Pandas, хоча і не має таких можливостей, надає гнучке та перевірене середовище для виконання найбільш поширених операцій з даними.
- Екосистема та інтеграція: Pandas безшовно інтегрується зі стеком інструментів для науки про дані в Python, що робить його вибором номер один для робочих процесів, що включають візуалізацію, машинне навчання та статистичне моделювання. Polars, хоча і покращується, має меншу екосистему і може не підходити для всіх робочих процесів, які вимагають широких інтеграцій бібліотек.
Останні думки
Замість того, щоб вважати Pandas та Polars конкурентами, їх можна використовувати в доповнення один до одного. Наприклад, можна використовувати Polars для важких обчислень з великими наборами даних і перемикатися на Pandas для його сумісності з подальшим аналізом або бібліотеками для візуалізації.
Джерела та ресурси
Таке всебічне порівняння було б неможливим без цінної документації, внеску спільноти та наборів даних. Нижче наведено джерела та ресурси, які ви можете дослідити для глибшого розуміння Pandas, Polars та обробки даних:
- Офіційна документація Pandas: https://pandas.pydata.org/docs/
- GitHub Pandas: https://github.com/pandas-dev/pandas
- Офіційна документація Polars: https://www.pola.rs/
- GitHub Polars: https://github.com/pola-rs/polars
- ChatGPT: https://chatgpt.com/
Перекладено з: Pandas vs Polars: Is learning Polars worth the performance boost?