Polars-Python: Zeitreihenverschiebungserstellung mit Ausdrücken
Posted: 14 Apr 2025, 18:38
Ich verwende Polare, um eine Zeitreihenanalyse durchzuführen. Meine Zeitreihe ist möglicherweise nicht vollständig, und die Häufigkeit der Daten kann sich durch ID ändern. Mein Ziel ist es, das unten stehende Spalte "Ergebnis" zu erhalten, wobei ein Ausdruck mit A With_Columns
Bisher habe ich darüber nachgedacht, eine Helfer -Spalte zu verwenden (sagen wir, ich möchte nur 1Q) und dann über die Spalten, die ich habe, aber nicht funktioniert, da ich nicht über den Ausdruck get () aggregieren kann. Ich füge den Code unten ein. Könnten Sie mir bitte helfen oder einen alternativen Ansatz vorschlagen-aber einen einzelnen Ausdruck beibehalten-): < /p>
Code: Select all
import datetime as dt
import polars as pl
df = pl.DataFrame(
{
"id": ["1", "1", "1", "2", "2", "2"],
"reported_period": [
dt.date(2021, 3, 31),
dt.date(2021, 9, 30),
dt.date(2021, 12, 31),
dt.date(2021, 3, 31),
dt.date(2021, 6, 30),
dt.date(2021, 9, 30),
],
"variable": [10, 30, 40, 1, 3, 4],
"result": [None, None, 30, None, 1, 3],
}
)
shape: (6, 4)
┌─────┬─────────────────┬──────────┬────────┐
│ id ┆ reported_period ┆ variable ┆ result │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ date ┆ i64 ┆ i64 │
╞═════╪═════════════════╪══════════╪════════╡
│ 1 ┆ 2021-03-31 ┆ 10 ┆ null │
│ 1 ┆ 2021-09-30 ┆ 30 ┆ null │
│ 1 ┆ 2021-12-31 ┆ 40 ┆ 30 │
│ 2 ┆ 2021-03-31 ┆ 1 ┆ null │
│ 2 ┆ 2021-06-30 ┆ 3 ┆ 1 │
│ 2 ┆ 2021-09-30 ┆ 4 ┆ 3 │
└─────┴─────────────────┴──────────┴────────┘
Code: Select all
df = df.with_columns(
pl.col("reported_period")
.dt.offset_by("-1q")
.dt.month_end()
.alias("reported_period_1Q")
)
df.with_columns(
pl.coalesce(
(
pl.col("variable")
.get(pl.col("reported_period_1Q").index_of(date)
.over("id")).over("id")
.alias(f"rp_{date}_{id}")
for id, date in zip(
list(df.get_column("id")), list(df.get_column("reported_period_1Q"))
)
)
)
)