Skip to content

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

ensure_polars_expr_dtype_property() -> None

Add pl.Expr.dtype property (getter+setter) ONLY if it doesn't exist.

ensure_polars_field_nullable_metadata_properties

ensure_polars_field_nullable_metadata_properties() -> None

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