Python – скользящая индексация в библиотеке Polars?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Python – скользящая индексация в библиотеке Polars?

Сообщение Anonymous »

Я хотел бы спросить, знает ли кто-нибудь, как выполнять скользящую индексацию в полярах?
Я лично пробовал несколько решений, которые мне не помогли (покажу их ниже): >
Что я хотел бы сделать: Индексировать количество вхождений за последние X дней по имени
Пример: скажем, Я хочу проиндексировать события за последние 2 дня:

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

df = pl.from_repr("""
┌─────────┬─────────────────────┬─────────┐
│ Name    ┆ Date                ┆ Counter │
│ ---     ┆ ---                 ┆ ---     │
│ str     ┆ datetime[ns]        ┆ i64     │
╞═════════╪═════════════════════╪═════════╡
│ John    ┆ 2023-01-01 00:00:00 ┆ 1       │
│ John    ┆ 2023-01-01 00:00:00 ┆ 2       │
│ John    ┆ 2023-01-01 00:00:00 ┆ 3       │
│ John    ┆ 2023-01-01 00:00:00 ┆ 4       │
│ John    ┆ 2023-01-02 00:00:00 ┆ 5       │
│ John    ┆ 2023-01-02 00:00:00 ┆ 6       │
│ John    ┆ 2023-01-02 00:00:00 ┆ 7       │
│ John    ┆ 2023-01-02 00:00:00 ┆ 8       │
│ John    ┆ 2023-01-03 00:00:00 ┆ 5       │
│ John    ┆ 2023-01-03 00:00:00 ┆ 6       │
│ New Guy ┆ 2023-01-01 00:00:00 ┆ 1       │
└─────────┴─────────────────────┴─────────┘
""")
В этом случае счетчик сбрасывается на «1», начиная с последних X дней (например, для 3 января 23 года он начинается с «1» со 2 января). 23), или если обнаружено новое имя

Что я пробовал:

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

(df.rolling(index_column='Date', period='2d', group_by='Name')
.agg((pl.col("Date").rank(method='ordinal')).alias("Counter"))
)
Вышеуказанное не работает, поскольку выводит:

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

┌─────────┬─────────────────────┬──────────────────────────┐
│ Name    ┆ Date                ┆ Counter                  │
│ ---     ┆ ---                 ┆ ---                      │
│ str     ┆ datetime[ns]        ┆ list[u32]                │
╞═════════╪═════════════════════╪══════════════════════════╡
│ John    ┆ 2023-01-01 00:00:00 ┆ [1, 2, 3, 4]             │
│ John    ┆ 2023-01-01 00:00:00 ┆ [1, 2, 3, 4]             │
│ John    ┆ 2023-01-01 00:00:00 ┆ [1, 2, 3, 4]             │
│ John    ┆ 2023-01-01 00:00:00 ┆ [1, 2, 3, 4]             │
│ John    ┆ 2023-01-02 00:00:00 ┆ [1, 2, 3, 4, 5, 6, 7, 8] │
│ John    ┆ 2023-01-02 00:00:00 ┆ [1, 2, 3, 4, 5, 6, 7, 8] │
│ John    ┆ 2023-01-02 00:00:00 ┆ [1, 2, 3, 4, 5, 6, 7, 8] │
│ John    ┆ 2023-01-02 00:00:00 ┆ [1, 2, 3, 4, 5, 6, 7, 8] │
│ John    ┆ 2023-01-03 00:00:00 ┆ [1, 2, 3, 4, 5, 6]       │
│ John    ┆ 2023-01-03 00:00:00 ┆ [1, 2, 3, 4, 5, 6]       │
│ New Guy ┆ 2023-01-01 00:00:00 ┆ [1]                      │
└─────────┴─────────────────────┴──────────────────────────┘

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

(df.with_columns(Mask=1)
.with_columns(Counter=pl.col("Mask").rolling_sum_by(window_size='2d', by="Date"))
)
Но выводит:

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

┌─────────┬─────────────────────┬─────────┬──────┐
│ Name    ┆ Date                ┆ Counter ┆ mask │
│ ---     ┆ ---                 ┆ ---     ┆ ---  │
│ str     ┆ datetime[ns]        ┆ i32     ┆ i32  │
╞═════════╪═════════════════════╪═════════╪══════╡
│ John    ┆ 2023-01-01 00:00:00 ┆ 5       ┆ 1    │
│ John    ┆ 2023-01-01 00:00:00 ┆ 5       ┆ 1    │
│ John    ┆ 2023-01-01 00:00:00 ┆ 5       ┆ 1    │
│ John    ┆ 2023-01-01 00:00:00 ┆ 5       ┆ 1    │
│ John    ┆ 2023-01-02 00:00:00 ┆ 9       ┆ 1    │
│ John    ┆ 2023-01-02 00:00:00 ┆ 9       ┆ 1    │
│ John    ┆ 2023-01-02 00:00:00 ┆ 9       ┆ 1    │
│ John    ┆ 2023-01-02 00:00:00 ┆ 9       ┆ 1    │
│ John    ┆ 2023-01-03 00:00:00 ┆ 6       ┆ 1    │
│ John    ┆ 2023-01-03 00:00:00 ┆ 6       ┆ 1    │
│ New Guy ┆ 2023-01-01 00:00:00 ┆ 5       ┆ 1    │
└─────────┴─────────────────────┴─────────┴──────┘
И он также не может правильно обработать «Нового парня», потому чтоroll_sum не может выполнить group_by=["Name", "Date"]

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

df.with_columns(Counter = pl.col("Date").rank(method='ordinal').over("Name", "Date") )
Приведенный выше код работает правильно, но его можно использовать только для индексации в течение одного и того же дня (т. е. period="1d")

Дополнительные примечания
Я также сделал это в Excel, а также использовал метод грубого/необработанного использования цикла «for». Оба работали отлично, однако у них были проблемы с огромными объемами данных.
Что я прочитал:
Некоторые ссылки, которые помогут в ответах: (Большинство не читало) Не работает, потому что у них фиксированное скользящее окно вместо динамического окна по «Дате»)

Подробнее здесь: https://stackoverflow.com/questions/784 ... rs-library
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Python – скользящая индексация в библиотеке Polars?
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Скользящая сумма с использованием реляционного API Python DuckDB
    Anonymous » » в форуме Python
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Скользящая сумма с использованием реляционного API Python DuckDB
    Anonymous » » в форуме Python
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Почему шестнадцатеричный результат дает другой результат, чем индексация в байтах в Python?
    Anonymous » » в форуме Python
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Почему шестнадцатеричный результат дает другой результат, чем индексация в байтах в Python?
    Anonymous » » в форуме Python
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous

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