Как получить первое и последнее вхождение (>0) определенного столбца во временном ряду? дф,
shape: (4, 3)
┌────────────┬────────────┬────────────┐
│ date ┆ column_one ┆ column_two │
│ --- ┆ --- ┆ --- │
│ date ┆ f64 ┆ i64 │
╞════════════╪════════════╪════════════╡
│ 2024-06-01 ┆ 0.0 ┆ 0 │
│ 2024-06-02 ┆ 0.0 ┆ 1 │
│ 2024-06-03 ┆ 1.0 ┆ 2 │
│ 2024-06-04 ┆ 1.2 ┆ 3 │
└────────────┴────────────┴────────────┘
и сохраните его в отдельном df,
columns | first_appearance | last_appearance
column_one | 2024-06-03 | 2024-06-04
column_two | 2024-06-02 | 2024-06-04
Желаемый результат можно получить, сначала используя pl.DataFrame.melt для получения длинного кадра со столбцами date
, columns
и value
. Затем группировка по columns
дает первое и последнее появление > 0 в каждом временном ряду.
(
df
.melt(id_vars = "date", variable_name = "columns")
.group_by("columns")
.agg(
pl.col("date").filter(pl.col("value") > 0).min().alias("first_appearance"),
pl.col("date").filter(pl.col("value") > 0).max().alias("last_appearance"),
)
)
shape: (2, 3)
┌────────────┬──────────────────┬─────────────────┐
│ columns ┆ first_appearance ┆ last_appearance │
│ --- ┆ --- ┆ --- │
│ str ┆ date ┆ date │
╞════════════╪══════════════════╪═════════════════╡
│ column_one ┆ 2024-06-03 ┆ 2024-06-04 │
│ column_two ┆ 2024-06-02 ┆ 2024-06-04 │
└────────────┴──────────────────┴─────────────────┘
Примечание. Если фрейм данных отсортирован по date
, то вместо pl.Expr.first
/pl.Expr.last
можно использовать pl.Expr.min
/pl.Expr.max
. Более того, два выражения фильтра в агрегации можно заменить одним pl.DataFrame.filter
перед агрегацией.