Потоковая передача Polars: как вычислить агрегацию вложенных окон, избегая при этом карт в памяти?Python

Программы на Python
Ответить
Anonymous
 Потоковая передача Polars: как вычислить агрегацию вложенных окон, избегая при этом карт в памяти?

Сообщение Anonymous »

Я хочу вычислить среднее значение для некоторого столбца группы "a", но включить только одно значение в секунду в столбце группы "b".
Ограничения:
  • Я хочу сохранить все исходные записи в результате.
  • (если возможно) избегать самообъединений.
  • Решение должно быть совместимо с механизмом потоковой передачи в том смысле, что оно позволяет избежать карты в памяти.
Например, у меня есть этот фрейм данных

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

import polars as pl

df = pl.LazyFrame({
"a": ["X", "Y", "Y", "Y", "Y"],
"b": ["u", "v", "w", "w", "w"],
"c": [1, 2, 3, 3, 3],
})

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

┌─────┬─────┬─────┐
│ a   ┆ b   ┆ c   │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ i64 │
╞═════╪═════╪═════╡
│ X   ┆ u   ┆ 1   │
│ Y   ┆ v   ┆ 2   │
│ Y   ┆ w   ┆ 3   │
│ Y   ┆ w   ┆ 3   │
│ Y   ┆ w   ┆ 3   │
└─────┴─────┴─────┘
Я попробовал это, но выдает ошибку.

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

df.with_columns(
pl.col("c").first().over("b").mean().over("a").alias("mean")
).collect(engine="streaming")
# polars.exceptions.InvalidOperationError: window expression not allowed in aggregation
Лучшее, что я нашел на данный момент, — это введение вспомогательного столбца «cum_count»

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

(
df.with_columns(pl.col("b").cum_count().over("b").alias("cum_count"))
.with_columns(pl.col("c").filter(pl.col("cum_count") == 1).mean().over("a").alias("mean"))
).collect(engine="streaming")
что дает ожидаемый результат

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

┌─────┬─────┬─────┬───────────┬──────┐
│ a   ┆ b   ┆ c   ┆ cum_count ┆ mean │
│ --- ┆ --- ┆ --- ┆ ---       ┆ ---  │
│ str ┆ str ┆ i64 ┆ u32       ┆ f64  │
╞═════╪═════╪═════╪═══════════╪══════╡
│ X   ┆ u   ┆ 1   ┆ 1         ┆ 1.0  │
│ Y   ┆ v   ┆ 2   ┆ 1         ┆ 2.5  │
│ Y   ┆ w   ┆ 3   ┆ 1         ┆ 2.5  │
│ Y   ┆ w   ┆ 3   ┆ 2         ┆ 2.5  │
│ Y   ┆ w   ┆ 3   ┆ 3         ┆ 2.5  │
└─────┴─────┴─────┴───────────┴──────┘
но при проверке .show_graph(plan_stage="physical", engine="streaming") требуется карта в памяти.
Интересно, является ли эта проблема принципиально непереводимой или есть лучшее решение, позволяющее избежать карт в памяти?>

Подробнее здесь: https://stackoverflow.com/questions/798 ... iding-in-m
Ответить

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

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

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

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

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