Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/pyo3-polars/example/derive_expression/run.py
6939 views
1
import polars as pl
2
from datetime import date, datetime, timezone
3
from expression_lib import language, dist, date_util
4
5
df = pl.DataFrame(
6
{
7
"names": ["Richard", "Alice", "Bob"],
8
"moons": ["full", "half", "red"],
9
"dates": [date(2023, 1, 1), date(2024, 1, 1), date(2025, 1, 1)],
10
"datetime": [datetime.now(tz=timezone.utc)] * 3,
11
"dist_a": [[12, 32, 1], [], [1, -2]],
12
"dist_b": [[-12, 1], [43], [876, -45, 9]],
13
"start_lat": [5.6, -1245.8, 242.224],
14
"start_lon": [3.1, -1.1, 128.9],
15
"end_lat": [6.6, -1243.8, 240.224],
16
"end_lon": [3.9, -2, 130],
17
}
18
)
19
20
out = df.with_columns(
21
pig_latin=language.pig_latinnify("names"),
22
pig_latin_cap=language.pig_latinnify("names", capitalize=True),
23
).with_columns(
24
hamming_dist=dist.hamming_distance("names", "pig_latin"),
25
jaccard_sim=dist.jaccard_similarity("dist_a", "dist_b"),
26
haversine=dist.haversine("start_lat", "start_lon", "end_lat", "end_lon"),
27
leap_year=date_util.is_leap_year("dates"),
28
new_tz=date_util.change_time_zone("datetime"),
29
appended_args=language.append_args(
30
"names",
31
float_arg=11.234,
32
integer_arg=93,
33
boolean_arg=False,
34
string_arg="example",
35
),
36
)
37
38
print(out)
39
40
# Test we can extend the expressions by importing the extension module.
41
42
import expression_lib.extension # noqa: E402, F401
43
44
out = df.with_columns(
45
pig_latin=pl.col("names").language.pig_latinnify(),
46
pig_latin_cap=pl.col("names").language.pig_latinnify(capitalize=True),
47
).with_columns(
48
hamming_dist=pl.col("names").dist.hamming_distance("pig_latin"),
49
jaccard_sim=pl.col("dist_a").dist.jaccard_similarity("dist_b"),
50
haversine=pl.col("start_lat").dist.haversine("start_lon", "end_lat", "end_lon"),
51
leap_year=pl.col("dates").date_util.is_leap_year(),
52
new_tz=pl.col("datetime").date_util.change_time_zone(),
53
appended_args=pl.col("names").language.append_args(
54
float_arg=11.234,
55
integer_arg=93,
56
boolean_arg=False,
57
string_arg="example",
58
),
59
)
60
61
print(out)
62
63
64
# Tests we can return errors from FFI by passing wrong types.
65
try:
66
out.with_columns(
67
appended_args=pl.col("names").language.append_args(
68
float_arg=True,
69
integer_arg=True,
70
boolean_arg=True,
71
string_arg="example",
72
)
73
)
74
except pl.exceptions.ComputeError as e:
75
assert "the plugin failed with message" in str(e)
76
77
78
try:
79
out.with_columns(pl.col("names").panic.panic())
80
except pl.exceptions.ComputeError as e:
81
assert "the plugin panicked" in str(e)
82
83
print("finished")
84
85