yggdrasil.polars.extensions¶
extensions ¶
Polars DataFrame extension helpers for joins and resampling.
Includes compatibility monkeypatches for older Polars builds:
- pl.Expr.dtype property (get/set) if missing
- pl.Field.nullable: bool property (get/set) if missing
- pl.Field.metadata: Optional[dict[bytes, bytes]] property (get/set) if missing
Also overrides pl.Expr.alias and pl.Expr.cast to preserve injected metadata.
ensure_polars_expr_dtype_property ¶
Add pl.Expr.dtype property (getter+setter) ONLY if it doesn't exist.
ensure_polars_field_nullable_metadata_properties ¶
Add pl.Field.nullable and pl.Field.metadata properties ONLY if missing.
join_coalesced ¶
join_coalesced(
left: "pl.DataFrame",
right: "pl.DataFrame",
on: str | list[str],
how: str = "left",
suffix: str = "_right",
) -> "pl.DataFrame"
Join two DataFrames and merge overlapping columns:
- prefer values from left
- fallback to right where left is null
resample ¶
resample(
df: "pl.DataFrame",
*,
time_col: str | None = None,
every: str | timedelta,
group_by: str | Sequence[str] | None = None,
agg: AggSpec | None = None,
period: str | timedelta | None = None,
offset: str | timedelta | None = None,
closed: Literal["left", "right", "both", "none"] = "left",
label: Literal["left", "right"] = "left",
start_by: Literal[
"window",
"datapoint",
"monday",
"tuesday",
"wednesday",
"thursday",
"friday",
"saturday",
"sunday",
] = "window",
fill: Literal["forward", "backward", "zero", "none"] = "none",
keep_group_order: bool = True
) -> "pl.DataFrame"
Pandas-ish resample for Polars.
- agg is None -> upsample (insert missing timestamps)
- agg provided -> group_by_dynamic + aggregations