Da ich für Replikationszwecke einen Startwert festlegen muss, liegt das Problem meiner Meinung nach daran, dass auf alle Kombinationen derselbe Startwert angewendet wird. Ich habe versucht, dieses Problem zu lösen, indem ich für jede Kombination einen eindeutigen Startwert erstellt habe, indem ich eine „group_date_int“-Spalte generiert habe, indem ich group_id und date in Int64 kombiniert habe, aber ich bin auf den folgenden Fehler gestoßen:
Code: Select all
.sample(n=n_samples, shuffle=True, seed=pl.col("group_date_int"))
TypeError: argument 'seed': 'Expr' object cannot be interpreted as an integer
Code: Select all
import polars as pl
df = pl.DataFrame(
{
"date": pl.date_range(
pl.date(2010, 1, 1), pl.date(2025, 12, 1), "1mo", eager=True
).implode(),
"group_id": [["bd01", "bd02", "bd03"]],
"ids": [list(range(10))],
}
).explode("date").explode("group_id").explode("ids")
# Parameters
n_samples = 3 # Number of random samples to pick for each group
SEED = 42 # The seed used for sampling
# Create `selected_samples` by sampling `n_samples` IDs per (group_id, date) combination
selected_samples = (
df
.group_by(['group_id', 'date'])
.agg(
pl.col("id")
.sample(n=n_samples, shuffle=True, seed=SEED)
.alias("random_ids")
)
.explode("random_ids")
.select(["group_id", "date", "random_ids"])
.rename({"random_ids": "id"})
)
Code: Select all
┌──────────┬────────────┬─────┐
│ group_id ┆ date ┆ id │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ i64 │
╞══════════╪════════════╪═════╡
│ bd01 ┆ 2025-07-01 ┆ 1 │
│ bd01 ┆ 2025-07-01 ┆ 6 │
│ bd01 ┆ 2025-07-01 ┆ 5 │
│ bd01 ┆ 2012-03-01 ┆ 1 │
│ bd01 ┆ 2012-03-01 ┆ 6 │
│ … ┆ … ┆ … │
│ bd03 ┆ 2024-10-01 ┆ 6 │
│ bd03 ┆ 2024-10-01 ┆ 5 │
│ bd01 ┆ 2010-08-01 ┆ 1 │
│ bd01 ┆ 2010-08-01 ┆ 6 │
│ bd01 ┆ 2010-08-01 ┆ 5 │
└──────────┴────────────┴─────┘
Mobile version