Нарезка с использованием поляров .filter медленнее, чем pandas .loc

Я пытаюсь переключить часть моего кода панд на поляры, чтобы повысить его производительность. Я обнаружил, что операция .filter выполняется намного медленнее, чем аналогичная нарезка с использованием .loc.

import pandas as pd
import polars as pl
import datetime as dt
import numpy as np

date_index = pd.date_range(dt.date(2001,1,1), dt.date(2020,1,1),freq='1H')
n = date_index.shape[0]
test_pd = pd.DataFrame(data = np.random.randint(1,100, n), index=date_index, columns = ['test'])
test_pl = pl.DataFrame(test_pd.reset_index())
test_dates = date_index[np.random.randint(0,n,1000)]

st = time.perf_counter()
for i in test_dates:
    d = test_pd.loc[i,:]
print(f"Pandas {time.perf_counter() - st}")


st = time.perf_counter()
for i in test_dates:
    d = test_pl.filter(index=i)
print(f"Polars {time.perf_counter() - st}")

Pandas 0.1854726000019582
Polars 2.1125728000042727

Есть ли другой способ ускорить операцию нарезки в полярах?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Polars не использует индексы, поэтому при произвольном доступе к одному конкретному элементу (если не по номеру строки) всегда придется перебирать все данные. Но вы можете эффективно получить все интересующие вас даты за один раз, используя левое соединение:

test_dates_df = pl.DataFrame({"index": test_dates})
out = test_dates_df.join(test_pl, on = "index", how = "left")

Тогда out[0] содержит строку, в которой индексный столбец соответствует test_dates[0] и т. д.

На моей машине это дает следующее время:

Pandas 0.029560166876763105
Polars 0.0009763331618160009

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

parmatma 28.04.2024 23:24

@parmatma Polars, вероятно, не лучший инструмент для этой работы, если вы хотите выполнять повторяющиеся запросы с одной точкой данных. По крайней мере, не для этой части процесса.

orlp 28.04.2024 23:26

Вы можете сопоставить даты с номерами строк, а затем использовать df.row(map[date])

BallpointBen 29.04.2024 19:50

Другие вопросы по теме

Сгруппировать данные и удалить дубликаты
Как применить модифицированный тест Манна Кендала к нескольким столбцам в R?
Df.replace() не может заменить строки nan во фрейме данных
Как заменить значение столбца значением из словаря на основе другого значения столбца
Конфигурация Sweetviz для принудительного анализа столбца типа объекта без преобразования
Как поменять местами столбцы в зависимости от типа данных?
Извлечение записей в фрейме данных, соответствующих n наименьшим положительным значениям и n наибольшим отрицательным значениям определенной переменной в r
Предупреждение о производительности: DataFrame сильно фрагментируется при добавлении дополнительных столбцов
Как я могу преобразовать столбец данных Pandas в дату и время, если формат дробных секунд несовместим?
Как суммировать группировку в пандах с повторяющимися данными, сохраняя при этом другие столбцы