Я лично пробовал несколько решений, которые мне не помогли (покажу их ниже): >
Что я хотел бы сделать: Индексировать количество вхождений за последние 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 │
└─────────┴─────────────────────┴─────────┘
""")
Что я пробовал:
Код: Выделить всё
(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 │
└─────────┴─────────────────────┴─────────┴──────┘
Код: Выделить всё
df.with_columns(Counter = pl.col("Date").rank(method='ordinal').over("Name", "Date") )
Дополнительные примечания
Я также сделал это в Excel, а также использовал метод грубого/необработанного использования цикла «for». Оба работали отлично, однако у них были проблемы с огромными объемами данных.
Что я прочитал:
Некоторые ссылки, которые помогут в ответах: (Большинство не читало) Не работает, потому что у них фиксированное скользящее окно вместо динамического окна по «Дате»)
- Как реализовать скользящий рейтинг в Polars версии 0.19 p>
- https://github.com/pola-rs/polars/issues/4808
- Как выполнить функцию Rolling(), сгруппированную по дням и часам в Polars?
- Как группировать по и катание в полярах?
- https://docs.pola.rs/api/python/stable/ ... api/polars. Series.rank.html
- https://docs.pola.rs/api/python/stable/ ... api/polars .DataFrame.rolling.html#polars.DataFrame.rolling
Подробнее здесь: https://stackoverflow.com/questions/784 ... rs-library