[Python] How can Polars' predicates be unpacked in an IO plugin?

Discussão em 'Python' iniciado por Stack, Abril 29, 2025.

  1. Stack

    Stack Membro Participativo

    Polars allows for custom IO plugins. These are great for creating custom data readers. The offer optimizations in the form of predicates, which are Polars expressing that are passed from the query engine down to the IO plugin.

    From the documentation, it is not clear how to parse these predicates, especially when they need to be translated to non Polars context (used in pure python)

    def scan_data(path: str) -> pl.LazyFrame:

    def source_generator(
    with_columns: list[str] | None,
    predicate: pl.Expr | None,
    n_rows: int | None,
    batch_size: int | None,
    ) -> Iterator[pl.DataFrame]:

    print(predicate.to_string())
    # Some reader implementation that uses the predicates to filter data.

    return register_io_source(io_source=source_generator, schema=schema)


    run with polars

    from polars_data import scan_data # custom lib above

    df = scan_mdf("file-path")

    df = df..filter(pl.col("col-name").is_in(["a", "b"]))
    df.count()


    The predicates are printed as follows in the io plugin:

    col("channel").is_in([Series])


    Where this is a Polars Expression, and the list seems to be a Series. Ideally, I would like to translate this to Python object so I can filter reads from a source file:

    from asammdf import MDF

    with MDF(mdf_path, channels=<channels based on predicates>) as mdf:
    for channel in mdf.iter_channels():
    signal = pa.Table.from_pydict({"timestamp": channel.timestamps, "samples": channel.samples.astype(float)})

    signals = pa.concat_tables(signals)
    signals = signals.sort_by("timestamp")

    return pl.from_arrow(signals)

    Continue reading...

Compartilhe esta Página