Я пытаюсь переключить часть моего кода панд на поляры, чтобы повысить его производительность. Я обнаружил, что операция .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
Есть ли другой способ ускорить операцию нарезки в полярах?






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
@parmatma Polars, вероятно, не лучший инструмент для этой работы, если вы хотите выполнять повторяющиеся запросы с одной точкой данных. По крайней мере, не для этой части процесса.
Вы можете сопоставить даты с номерами строк, а затем использовать df.row(map[date])
Спасибо за быстрый ответ. В приложении, где я хочу использовать Polars, генерация даты происходит по одному. Когда происходит генерация даты, она извлекает данные, обрабатывает их и выбирает следующую дату.