Ограничения:
- Я хочу сохранить все исходные записи в результате.
- (если возможно) избегать самообъединений.
- Решение должно быть совместимо с механизмом потоковой передачи в том смысле, что оно позволяет избежать карты в памяти.
Код: Выделить всё
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
Код: Выделить всё
(
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 │
└─────┴─────┴─────┴───────────┴──────┘
Интересно, является ли эта проблема принципиально непереводимой или есть лучшее решение, позволяющее избежать карт в памяти?>
Подробнее здесь: https://stackoverflow.com/questions/798 ... iding-in-m
Мобильная версия