Используя поляры .rolling и .agg, как мне вернуть исходный столбец без необходимости соединения с исходным столбцом или без использования .over?
Пример:
import polars as pl
dates = [
"2020-01-01 13:45:48",
"2020-01-01 16:42:13",
"2020-01-01 16:45:09",
"2020-01-02 18:12:48",
"2020-01-03 19:45:32",
"2020-01-08 23:16:43",
]
df = pl.DataFrame({"dt": dates, "a": [3, 7, 5, 9, 2, 1]}).with_columns(
pl.col("dt").str.to_datetime().set_sorted()
)
Предоставляет мне небольшой фрейм данных Polars:
┌─────────────────────┬─────┐
│ dt ┆ a │
│ --- ┆ --- │
│ datetime[μs] ┆ i64 │
╞═════════════════════╪═════╡
│ 2020-01-01 13:45:48 ┆ 3 │
│ 2020-01-01 16:42:13 ┆ 7 │
│ 2020-01-01 16:45:09 ┆ 5 │
│ 2020-01-02 18:12:48 ┆ 9 │
│ 2020-01-03 19:45:32 ┆ 2 │
│ 2020-01-08 23:16:43 ┆ 1 │
└─────────────────────┴─────┘
Когда я применяю скользящее агрегирование, я получаю обратно новые столбцы, но не исходные столбцы:
out = df.rolling(index_column="dt", period="2d").agg(
pl.sum("a").alias("sum_a"),
pl.min("a").alias("min_a"),
pl.max("a").alias("max_a"),
pl.col("a")
)
что дает:
┌─────────────────────┬───────┬───────┬───────┬──────────────┐
│ dt ┆ sum_a ┆ min_a ┆ max_a ┆ a │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ datetime[μs] ┆ i64 ┆ i64 ┆ i64 ┆ list[i64] │
╞═════════════════════╪═══════╪═══════╪═══════╪══════════════╡
│ 2020-01-01 13:45:48 ┆ 3 ┆ 3 ┆ 3 ┆ [3] │
│ 2020-01-01 16:42:13 ┆ 10 ┆ 3 ┆ 7 ┆ [3, 7] │
│ 2020-01-01 16:45:09 ┆ 15 ┆ 3 ┆ 7 ┆ [3, 7, 5] │
│ 2020-01-02 18:12:48 ┆ 24 ┆ 3 ┆ 9 ┆ [3, 7, 5, 9] │
│ 2020-01-03 19:45:32 ┆ 11 ┆ 2 ┆ 9 ┆ [9, 2] │
│ 2020-01-08 23:16:43 ┆ 1 ┆ 1 ┆ 1 ┆ [1] │
└─────────────────────┴───────┴───────┴───────┴──────────────┘
Как получить исходный столбец. Я не хочу присоединяться и не хочу использовать .over, так как мне понадобится group_by для прокрутки позже, а .over не работает с .rolling
Изменить. Мне также не хочется использовать следующее.
out = df.rolling(index_column="dt", period="2d").agg(
pl.sum("a").alias("sum_a"),
pl.min("a").alias("min_a"),
pl.max("a").alias("max_a"),
pl.col("a").last()
)
Изменить 2. Почему Expr.rolling() неосуществим и почему мне нужен group_by:
При условии более подробный пример:
dates = [
"2020-01-01 13:45:48",
"2020-01-01 16:42:13",
"2020-01-01 16:45:09",
"2020-01-02 18:12:48",
"2020-01-03 19:45:32",
"2020-01-08 23:16:43",
]
df_a = pl.DataFrame({"dt": dates, "a": [3, 7, 5, 9, 2, 1],"cat":["one"]*6}).with_columns(
pl.col("dt").str.to_datetime()
)
df_b = pl.DataFrame({"dt": dates, "a": [3, 7, 5, 9, 2, 1],"cat":["two"]*6}).with_columns(
pl.col("dt").str.to_datetime()
)
df = pl.concat([df_a,df_b])
┌─────────────────────┬─────┬─────┐
│ dt ┆ a ┆ cat │
│ --- ┆ --- ┆ --- │
│ datetime[μs] ┆ i64 ┆ str │
╞═════════════════════╪═════╪═════╡
│ 2020-01-01 13:45:48 ┆ 3 ┆ one │
│ 2020-01-01 16:42:13 ┆ 7 ┆ one │
│ 2020-01-01 16:45:09 ┆ 5 ┆ one │
│ 2020-01-02 18:12:48 ┆ 9 ┆ one │
│ 2020-01-03 19:45:32 ┆ 2 ┆ one │
│ 2020-01-08 23:16:43 ┆ 1 ┆ one │
│ 2020-01-01 13:45:48 ┆ 3 ┆ two │
│ 2020-01-01 16:42:13 ┆ 7 ┆ two │
│ 2020-01-01 16:45:09 ┆ 5 ┆ two │
│ 2020-01-02 18:12:48 ┆ 9 ┆ two │
│ 2020-01-03 19:45:32 ┆ 2 ┆ two │
│ 2020-01-08 23:16:43 ┆ 1 ┆ two │
└─────────────────────┴─────┴─────┘
и код:
out = df.rolling(index_column="dt", period="2d",group_by="cat").agg(
pl.sum("a").alias("sum_a"),
pl.min("a").alias("min_a"),
pl.max("a").alias("max_a"),
pl.col("a")
)
┌─────┬─────────────────────┬───────┬───────┬───────┬──────────────┐
│ cat ┆ dt ┆ sum_a ┆ min_a ┆ max_a ┆ a │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ datetime[μs] ┆ i64 ┆ i64 ┆ i64 ┆ list[i64] │
╞═════╪═════════════════════╪═══════╪═══════╪═══════╪══════════════╡
│ one ┆ 2020-01-01 13:45:48 ┆ 3 ┆ 3 ┆ 3 ┆ [3] │
│ one ┆ 2020-01-01 16:42:13 ┆ 10 ┆ 3 ┆ 7 ┆ [3, 7] │
│ one ┆ 2020-01-01 16:45:09 ┆ 15 ┆ 3 ┆ 7 ┆ [3, 7, 5] │
│ one ┆ 2020-01-02 18:12:48 ┆ 24 ┆ 3 ┆ 9 ┆ [3, 7, 5, 9] │
│ one ┆ 2020-01-03 19:45:32 ┆ 11 ┆ 2 ┆ 9 ┆ [9, 2] │
│ one ┆ 2020-01-08 23:16:43 ┆ 1 ┆ 1 ┆ 1 ┆ [1] │
│ two ┆ 2020-01-01 13:45:48 ┆ 3 ┆ 3 ┆ 3 ┆ [3] │
│ two ┆ 2020-01-01 16:42:13 ┆ 10 ┆ 3 ┆ 7 ┆ [3, 7] │
│ two ┆ 2020-01-01 16:45:09 ┆ 15 ┆ 3 ┆ 7 ┆ [3, 7, 5] │
│ two ┆ 2020-01-02 18:12:48 ┆ 24 ┆ 3 ┆ 9 ┆ [3, 7, 5, 9] │
│ two ┆ 2020-01-03 19:45:32 ┆ 11 ┆ 2 ┆ 9 ┆ [9, 2] │
│ two ┆ 2020-01-08 23:16:43 ┆ 1 ┆ 1 ┆ 1 ┆ [1] │
└─────┴─────────────────────┴───────┴───────┴───────┴──────────────┘
Это не работает:
df.sort("dt").with_columns(sum=pl.sum("a").rolling(index_column="dt", period="2d").over("cat"))
Даёт:
# InvalidOperationError: rolling expression not allowed in aggregation
Подробнее здесь: https://stackoverflow.com/questions/786 ... thout-join