Как указать размер числового окна с помощью функций прокрутки Polars?Python

Программы на Python
Ответить
Anonymous
 Как указать размер числового окна с помощью функций прокрутки Polars?

Сообщение Anonymous »

Я разрабатывал некоторые коды в pandas, но обнаружил, что выполнение в pandas слишком медленное. Затем я наткнулся на поляров, которые утверждают, что они невероятно быстры и намного быстрее панд. Таким образом, я пытаюсь перенести свои существующие коды в поляры.
В настоящее время я работаю над некоторыми данными о запасах, где мне нужно узнать минимальную цену за предыдущие n транзакционных дней. Обратите внимание, что здесь даты транзакций прерывисты, поскольку есть суббота, воскресенье и праздничные дни. Проблема в том, что поляры не знают, как найти дни предыдущих транзакций, вместо этого поляры находят фактические предыдущие дни.
Предположим, теперь у нас есть DataFrame и n = 3:

Код: Выделить всё

import polars as pl

df = pl.from_repr("""
┌────────────┬───────┐
│ Date       ┆ Price │
│ ---        ┆ ---   │
│ date       ┆ i64   │
╞════════════╪═══════╡
│ 2023-01-01 ┆ 1     │
│ 2023-01-02 ┆ 2     │
│ 2023-01-03 ┆ 3     │
│ 2023-01-05 ┆ 4     │
│ 2023-01-10 ┆ 5     │
│ 2023-01-11 ┆ 6     │
│ 2023-01-12 ┆ 7     │
└────────────┴───────┘
""")
Ожидаемый результат, который я получаю от следующих кодов с использованием pandas:

Код: Выделить всё

df.to_pandas().Price.rolling(3).min()

Код: Выделить всё

0    NaN
1    NaN
2    1.0
3    2.0
4    3.0
5    4.0
6    5.0
Name: Price, dtype: float64
Однако при использовании поляров, поскольку индексов нет, группировка по функциям работает иначе. Он устанавливает окно на основе фактических физических дат (непрерывно), а не дат транзакций (прерывисто, панды могут обрабатывать это с помощью индексов), что дает следующие результаты:

Код: Выделить всё

┌────────────┬───────┐
│ Date       ┆ Price │
│ ---        ┆ ---   │
│ date       ┆ i64   │
╞════════════╪═══════╡
│ 2023-01-01 ┆ 1     │
│ 2023-01-02 ┆ 1     │
│ 2023-01-03 ┆ 1     │
│ 2023-01-05 ┆ 3     │
│ 2023-01-10 ┆ 5     │
│ 2023-01-11 ┆ 5     │
│ 2023-01-12 ┆ 5     │
└────────────┴───────┘
со следующим кодом:

Код: Выделить всё

df.rolling("Date", period="3d").agg(pl.col("Price").min())
Есть ли способ получить желаемый результат, то есть такой же, как в пандах, с помощью библиотеки поляров? (Должен ли я вручную создать индексный столбец???) Или переход на полярные данные — плохая идея для таких данных, поскольку полярные пропагандируют идею отсутствия индексов?


Подробнее здесь: https://stackoverflow.com/questions/758 ... -functions
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»