Path: blob/main/pyo3-polars/example/derive_expression/run.py
6939 views
import polars as pl1from datetime import date, datetime, timezone2from expression_lib import language, dist, date_util34df = pl.DataFrame(5{6"names": ["Richard", "Alice", "Bob"],7"moons": ["full", "half", "red"],8"dates": [date(2023, 1, 1), date(2024, 1, 1), date(2025, 1, 1)],9"datetime": [datetime.now(tz=timezone.utc)] * 3,10"dist_a": [[12, 32, 1], [], [1, -2]],11"dist_b": [[-12, 1], [43], [876, -45, 9]],12"start_lat": [5.6, -1245.8, 242.224],13"start_lon": [3.1, -1.1, 128.9],14"end_lat": [6.6, -1243.8, 240.224],15"end_lon": [3.9, -2, 130],16}17)1819out = df.with_columns(20pig_latin=language.pig_latinnify("names"),21pig_latin_cap=language.pig_latinnify("names", capitalize=True),22).with_columns(23hamming_dist=dist.hamming_distance("names", "pig_latin"),24jaccard_sim=dist.jaccard_similarity("dist_a", "dist_b"),25haversine=dist.haversine("start_lat", "start_lon", "end_lat", "end_lon"),26leap_year=date_util.is_leap_year("dates"),27new_tz=date_util.change_time_zone("datetime"),28appended_args=language.append_args(29"names",30float_arg=11.234,31integer_arg=93,32boolean_arg=False,33string_arg="example",34),35)3637print(out)3839# Test we can extend the expressions by importing the extension module.4041import expression_lib.extension # noqa: E402, F4014243out = df.with_columns(44pig_latin=pl.col("names").language.pig_latinnify(),45pig_latin_cap=pl.col("names").language.pig_latinnify(capitalize=True),46).with_columns(47hamming_dist=pl.col("names").dist.hamming_distance("pig_latin"),48jaccard_sim=pl.col("dist_a").dist.jaccard_similarity("dist_b"),49haversine=pl.col("start_lat").dist.haversine("start_lon", "end_lat", "end_lon"),50leap_year=pl.col("dates").date_util.is_leap_year(),51new_tz=pl.col("datetime").date_util.change_time_zone(),52appended_args=pl.col("names").language.append_args(53float_arg=11.234,54integer_arg=93,55boolean_arg=False,56string_arg="example",57),58)5960print(out)616263# Tests we can return errors from FFI by passing wrong types.64try:65out.with_columns(66appended_args=pl.col("names").language.append_args(67float_arg=True,68integer_arg=True,69boolean_arg=True,70string_arg="example",71)72)73except pl.exceptions.ComputeError as e:74assert "the plugin failed with message" in str(e)757677try:78out.with_columns(pl.col("names").panic.panic())79except pl.exceptions.ComputeError as e:80assert "the plugin panicked" in str(e)8182print("finished")838485