Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-python/src/c_api/mod.rs
8341 views
1
#[cfg(feature = "allocator")]
2
pub mod allocator;
3
4
// Since Python Polars cannot share its version into here and we need to be able to build this
5
// package correctly without `py-polars`, we need to mirror the version here.
6
// example: 1.35.0-beta.1
7
pub static PYPOLARS_VERSION: &str = "1.38.1";
8
9
// We allow multiple features to be set simultaneously so checking with all-features
10
// is possible. In the case multiple are set or none at all, we set the repr to "unknown".
11
#[cfg(all(feature = "rtcompat", not(any(feature = "rt32", feature = "rt64"))))]
12
pub static RUNTIME_REPR: &str = "rtcompat";
13
#[cfg(all(feature = "rt32", not(any(feature = "rt64", feature = "rtcompat"))))]
14
pub static RUNTIME_REPR: &str = "rt32";
15
#[cfg(all(feature = "rt64", not(any(feature = "rt32", feature = "rtcompat"))))]
16
pub static RUNTIME_REPR: &str = "rt64";
17
#[cfg(not(any(
18
all(feature = "rtcompat", not(any(feature = "rt32", feature = "rt64"))),
19
all(feature = "rt32", not(any(feature = "rt64", feature = "rtcompat"))),
20
all(feature = "rt64", not(any(feature = "rt32", feature = "rtcompat")))
21
)))]
22
pub static RUNTIME_REPR: &str = "unknown";
23
24
use pyo3::prelude::*;
25
use pyo3::{wrap_pyfunction, wrap_pymodule};
26
27
#[cfg(feature = "catalog")]
28
use crate::catalog::unity::PyCatalogClient;
29
#[cfg(feature = "polars_cloud_client")]
30
use crate::cloud_client;
31
#[cfg(feature = "polars_cloud_server")]
32
use crate::cloud_server;
33
use crate::conversion::PyCategories;
34
use crate::dataframe::PyDataFrame;
35
use crate::expr::PyExpr;
36
use crate::expr::datatype::PyDataTypeExpr;
37
use crate::expr::selector::PySelector;
38
use crate::functions::PyStringCacheHolder;
39
#[cfg(not(target_arch = "wasm32"))]
40
use crate::lazyframe::PyInProcessQuery;
41
use crate::lazyframe::{PyLazyFrame, PyOptFlags};
42
use crate::lazygroupby::PyLazyGroupBy;
43
use crate::series::PySeries;
44
#[cfg(feature = "sql")]
45
use crate::sql::PySQLContext;
46
use crate::{datatypes, exceptions, extension, functions, testing};
47
48
#[pymodule(gil_used = false)] // gil_used = false will be default in PyO3 0.28.
49
fn _ir_nodes(_py: Python, m: &Bound<PyModule>) -> PyResult<()> {
50
use crate::lazyframe::visitor::nodes::*;
51
m.add_class::<PythonScan>().unwrap();
52
m.add_class::<Slice>().unwrap();
53
m.add_class::<Filter>().unwrap();
54
m.add_class::<Scan>().unwrap();
55
m.add_class::<DataFrameScan>().unwrap();
56
m.add_class::<SimpleProjection>().unwrap();
57
m.add_class::<Select>().unwrap();
58
m.add_class::<Sort>().unwrap();
59
m.add_class::<Cache>().unwrap();
60
m.add_class::<GroupBy>().unwrap();
61
m.add_class::<Join>().unwrap();
62
m.add_class::<MergeSorted>().unwrap();
63
m.add_class::<HStack>().unwrap();
64
m.add_class::<Reduce>().unwrap();
65
m.add_class::<Distinct>().unwrap();
66
m.add_class::<MapFunction>().unwrap();
67
m.add_class::<Union>().unwrap();
68
m.add_class::<HConcat>().unwrap();
69
m.add_class::<ExtContext>().unwrap();
70
m.add_class::<Sink>().unwrap();
71
Ok(())
72
}
73
74
#[pymodule(gil_used = false)] // gil_used = false will be default in PyO3 0.28.
75
fn _expr_nodes(_py: Python, m: &Bound<PyModule>) -> PyResult<()> {
76
use crate::lazyframe::visit::PyExprIR;
77
use crate::lazyframe::visitor::expr_nodes::*;
78
// Expressions
79
m.add_class::<PyExprIR>().unwrap();
80
m.add_class::<Alias>().unwrap();
81
m.add_class::<Column>().unwrap();
82
m.add_class::<Literal>().unwrap();
83
m.add_class::<BinaryExpr>().unwrap();
84
m.add_class::<Cast>().unwrap();
85
m.add_class::<Sort>().unwrap();
86
m.add_class::<Gather>().unwrap();
87
m.add_class::<Filter>().unwrap();
88
m.add_class::<SortBy>().unwrap();
89
m.add_class::<Agg>().unwrap();
90
m.add_class::<Ternary>().unwrap();
91
m.add_class::<Function>().unwrap();
92
m.add_class::<Slice>().unwrap();
93
m.add_class::<Len>().unwrap();
94
m.add_class::<Window>().unwrap();
95
m.add_class::<PyOperator>().unwrap();
96
m.add_class::<PyStringFunction>().unwrap();
97
m.add_class::<PyBooleanFunction>().unwrap();
98
m.add_class::<PyTemporalFunction>().unwrap();
99
m.add_class::<PyStructFunction>().unwrap();
100
// Options
101
m.add_class::<PyWindowMapping>().unwrap();
102
m.add_class::<PyRollingGroupOptions>().unwrap();
103
m.add_class::<PyGroupbyOptions>().unwrap();
104
Ok(())
105
}
106
107
#[pymodule(gil_used = false)] // gil_used = false will be default in PyO3 0.28.
108
pub fn _polars_runtime(py: Python, m: &Bound<PyModule>) -> PyResult<()> {
109
// Classes
110
m.add_class::<PySeries>().unwrap();
111
m.add_class::<PyDataFrame>().unwrap();
112
m.add_class::<PyLazyFrame>().unwrap();
113
m.add_class::<PyOptFlags>().unwrap();
114
#[cfg(not(target_arch = "wasm32"))]
115
m.add_class::<PyInProcessQuery>().unwrap();
116
m.add_class::<PyLazyGroupBy>().unwrap();
117
m.add_class::<PyExpr>().unwrap();
118
m.add_class::<PyDataTypeExpr>().unwrap();
119
m.add_class::<PySelector>().unwrap();
120
m.add_class::<PyStringCacheHolder>().unwrap();
121
#[cfg(feature = "sql")]
122
m.add_class::<PySQLContext>().unwrap();
123
m.add_class::<PyCategories>().unwrap();
124
125
// Submodules
126
// LogicalPlan objects
127
m.add_wrapped(wrap_pymodule!(_ir_nodes))?;
128
// Expr objects
129
m.add_wrapped(wrap_pymodule!(_expr_nodes))?;
130
131
// Functions - eager
132
m.add_wrapped(wrap_pyfunction!(functions::concat_df))
133
.unwrap();
134
m.add_wrapped(wrap_pyfunction!(functions::concat_series))
135
.unwrap();
136
m.add_wrapped(wrap_pyfunction!(functions::concat_df_diagonal))
137
.unwrap();
138
m.add_wrapped(wrap_pyfunction!(functions::concat_df_horizontal))
139
.unwrap();
140
141
// Functions - range
142
m.add_wrapped(wrap_pyfunction!(functions::int_range))
143
.unwrap();
144
m.add_wrapped(wrap_pyfunction!(functions::eager_int_range))
145
.unwrap();
146
m.add_wrapped(wrap_pyfunction!(functions::int_ranges))
147
.unwrap();
148
m.add_wrapped(wrap_pyfunction!(functions::linear_space))
149
.unwrap();
150
m.add_wrapped(wrap_pyfunction!(functions::linear_spaces))
151
.unwrap();
152
m.add_wrapped(wrap_pyfunction!(functions::date_range))
153
.unwrap();
154
m.add_wrapped(wrap_pyfunction!(functions::date_ranges))
155
.unwrap();
156
m.add_wrapped(wrap_pyfunction!(functions::datetime_range))
157
.unwrap();
158
m.add_wrapped(wrap_pyfunction!(functions::datetime_ranges))
159
.unwrap();
160
m.add_wrapped(wrap_pyfunction!(functions::time_range))
161
.unwrap();
162
m.add_wrapped(wrap_pyfunction!(functions::time_ranges))
163
.unwrap();
164
165
// Functions - business
166
m.add_wrapped(wrap_pyfunction!(functions::business_day_count))
167
.unwrap();
168
169
// Functions - aggregation
170
m.add_wrapped(wrap_pyfunction!(functions::all_horizontal))
171
.unwrap();
172
m.add_wrapped(wrap_pyfunction!(functions::any_horizontal))
173
.unwrap();
174
m.add_wrapped(wrap_pyfunction!(functions::max_horizontal))
175
.unwrap();
176
m.add_wrapped(wrap_pyfunction!(functions::min_horizontal))
177
.unwrap();
178
m.add_wrapped(wrap_pyfunction!(functions::sum_horizontal))
179
.unwrap();
180
m.add_wrapped(wrap_pyfunction!(functions::mean_horizontal))
181
.unwrap();
182
183
// Functions - lazy
184
m.add_wrapped(wrap_pyfunction!(functions::arg_sort_by))
185
.unwrap();
186
m.add_wrapped(wrap_pyfunction!(functions::arg_where))
187
.unwrap();
188
m.add_wrapped(wrap_pyfunction!(functions::as_struct))
189
.unwrap();
190
m.add_wrapped(wrap_pyfunction!(functions::coalesce))
191
.unwrap();
192
m.add_wrapped(wrap_pyfunction!(functions::field)).unwrap();
193
m.add_wrapped(wrap_pyfunction!(functions::col)).unwrap();
194
m.add_wrapped(wrap_pyfunction!(functions::collect_all))
195
.unwrap();
196
m.add_wrapped(wrap_pyfunction!(functions::collect_all_lazy))
197
.unwrap();
198
m.add_wrapped(wrap_pyfunction!(functions::element)).unwrap();
199
m.add_wrapped(wrap_pyfunction!(functions::explain_all))
200
.unwrap();
201
m.add_wrapped(wrap_pyfunction!(functions::collect_all_with_callback))
202
.unwrap();
203
m.add_wrapped(wrap_pyfunction!(functions::concat_lf))
204
.unwrap();
205
m.add_wrapped(wrap_pyfunction!(functions::concat_arr))
206
.unwrap();
207
m.add_wrapped(wrap_pyfunction!(functions::concat_list))
208
.unwrap();
209
m.add_wrapped(wrap_pyfunction!(functions::concat_str))
210
.unwrap();
211
m.add_wrapped(wrap_pyfunction!(functions::len)).unwrap();
212
m.add_wrapped(wrap_pyfunction!(functions::cov)).unwrap();
213
m.add_wrapped(wrap_pyfunction!(functions::cum_fold))
214
.unwrap();
215
m.add_wrapped(wrap_pyfunction!(functions::cum_reduce))
216
.unwrap();
217
#[cfg(feature = "trigonometry")]
218
m.add_wrapped(wrap_pyfunction!(functions::arctan2)).unwrap();
219
m.add_wrapped(wrap_pyfunction!(functions::datetime))
220
.unwrap();
221
m.add_wrapped(wrap_pyfunction!(functions::concat_expr))
222
.unwrap();
223
m.add_wrapped(wrap_pyfunction!(functions::concat_lf_diagonal))
224
.unwrap();
225
m.add_wrapped(wrap_pyfunction!(functions::concat_lf_horizontal))
226
.unwrap();
227
m.add_wrapped(wrap_pyfunction!(functions::duration))
228
.unwrap();
229
m.add_wrapped(wrap_pyfunction!(functions::fold)).unwrap();
230
m.add_wrapped(wrap_pyfunction!(functions::lit)).unwrap();
231
m.add_wrapped(wrap_pyfunction!(functions::map_expr))
232
.unwrap();
233
m.add_wrapped(wrap_pyfunction!(functions::pearson_corr))
234
.unwrap();
235
m.add_wrapped(wrap_pyfunction!(functions::rolling_corr))
236
.unwrap();
237
m.add_wrapped(wrap_pyfunction!(functions::rolling_cov))
238
.unwrap();
239
m.add_wrapped(wrap_pyfunction!(functions::reduce)).unwrap();
240
m.add_wrapped(wrap_pyfunction!(functions::repeat)).unwrap();
241
m.add_wrapped(wrap_pyfunction!(functions::spearman_rank_corr))
242
.unwrap();
243
m.add_wrapped(wrap_pyfunction!(functions::when)).unwrap();
244
245
// Functions: schema
246
m.add_wrapped(wrap_pyfunction!(
247
crate::interop::arrow::init_polars_schema_from_arrow_c_schema
248
))
249
.unwrap();
250
m.add_wrapped(wrap_pyfunction!(
251
crate::interop::arrow::polars_schema_field_from_arrow_c_schema
252
))
253
.unwrap();
254
m.add_wrapped(wrap_pyfunction!(
255
crate::interop::arrow::to_py::polars_schema_to_pycapsule
256
))
257
.unwrap();
258
259
// Functions: other
260
m.add_wrapped(wrap_pyfunction!(functions::check_length))
261
.unwrap();
262
m.add_wrapped(wrap_pyfunction!(functions::py_get_engine_affinity))
263
.unwrap();
264
265
#[cfg(feature = "sql")]
266
m.add_wrapped(wrap_pyfunction!(functions::sql_expr))
267
.unwrap();
268
269
// Functions - I/O
270
#[cfg(feature = "ipc")]
271
m.add_wrapped(wrap_pyfunction!(functions::read_ipc_schema))
272
.unwrap();
273
#[cfg(feature = "parquet")]
274
m.add_wrapped(wrap_pyfunction!(functions::read_parquet_metadata))
275
.unwrap();
276
#[cfg(feature = "clipboard")]
277
m.add_wrapped(wrap_pyfunction!(functions::read_clipboard_string))
278
.unwrap();
279
#[cfg(feature = "clipboard")]
280
m.add_wrapped(wrap_pyfunction!(functions::write_clipboard_string))
281
.unwrap();
282
#[cfg(feature = "catalog")]
283
m.add_class::<PyCatalogClient>().unwrap();
284
285
// Functions - meta
286
m.add_wrapped(wrap_pyfunction!(functions::get_index_type))
287
.unwrap();
288
m.add_wrapped(wrap_pyfunction!(functions::thread_pool_size))
289
.unwrap();
290
m.add_wrapped(wrap_pyfunction!(functions::enable_string_cache))
291
.unwrap();
292
m.add_wrapped(wrap_pyfunction!(functions::disable_string_cache))
293
.unwrap();
294
m.add_wrapped(wrap_pyfunction!(functions::using_string_cache))
295
.unwrap();
296
297
// Numeric formatting
298
m.add_wrapped(wrap_pyfunction!(functions::get_thousands_separator))
299
.unwrap();
300
m.add_wrapped(wrap_pyfunction!(functions::set_thousands_separator))
301
.unwrap();
302
m.add_wrapped(wrap_pyfunction!(functions::get_float_fmt))
303
.unwrap();
304
m.add_wrapped(wrap_pyfunction!(functions::get_float_precision))
305
.unwrap();
306
m.add_wrapped(wrap_pyfunction!(functions::get_decimal_separator))
307
.unwrap();
308
m.add_wrapped(wrap_pyfunction!(functions::get_trim_decimal_zeros))
309
.unwrap();
310
m.add_wrapped(wrap_pyfunction!(functions::set_float_fmt))
311
.unwrap();
312
m.add_wrapped(wrap_pyfunction!(functions::set_float_precision))
313
.unwrap();
314
m.add_wrapped(wrap_pyfunction!(functions::set_decimal_separator))
315
.unwrap();
316
m.add_wrapped(wrap_pyfunction!(functions::set_trim_decimal_zeros))
317
.unwrap();
318
319
// Functions - misc
320
m.add_wrapped(wrap_pyfunction!(functions::dtype_str_repr))
321
.unwrap();
322
#[cfg(feature = "object")]
323
m.add_wrapped(wrap_pyfunction!(functions::__register_startup_deps))
324
.unwrap();
325
326
// Functions - random
327
m.add_wrapped(wrap_pyfunction!(functions::set_random_seed))
328
.unwrap();
329
330
// Functions - escape_regex
331
m.add_wrapped(wrap_pyfunction!(functions::escape_regex))
332
.unwrap();
333
334
// Dtype helpers
335
m.add_wrapped(wrap_pyfunction!(datatypes::_get_dtype_max))
336
.unwrap();
337
m.add_wrapped(wrap_pyfunction!(datatypes::_get_dtype_min))
338
.unwrap();
339
m.add_wrapped(wrap_pyfunction!(datatypes::_known_timezones))
340
.unwrap();
341
342
// Extension type registry.
343
m.add_wrapped(wrap_pyfunction!(extension::_register_extension_type))
344
.unwrap();
345
m.add_wrapped(wrap_pyfunction!(extension::_unregister_extension_type))
346
.unwrap();
347
348
// Testing
349
m.add_wrapped(wrap_pyfunction!(testing::assert_series_equal_py))
350
.unwrap();
351
m.add_wrapped(wrap_pyfunction!(testing::assert_dataframe_equal_py))
352
.unwrap();
353
354
// Exceptions - Errors
355
m.add("PolarsError", py.get_type::<exceptions::PolarsError>())
356
.unwrap();
357
m.add(
358
"ColumnNotFoundError",
359
py.get_type::<exceptions::ColumnNotFoundError>(),
360
)
361
.unwrap();
362
m.add("ComputeError", py.get_type::<exceptions::ComputeError>())
363
.unwrap();
364
m.add(
365
"DuplicateError",
366
py.get_type::<exceptions::DuplicateError>(),
367
)
368
.unwrap();
369
m.add(
370
"InvalidOperationError",
371
py.get_type::<exceptions::InvalidOperationError>(),
372
)
373
.unwrap();
374
m.add("NoDataError", py.get_type::<exceptions::NoDataError>())
375
.unwrap();
376
m.add(
377
"OutOfBoundsError",
378
py.get_type::<exceptions::OutOfBoundsError>(),
379
)
380
.unwrap();
381
m.add(
382
"SQLInterfaceError",
383
py.get_type::<exceptions::SQLInterfaceError>(),
384
)
385
.unwrap();
386
m.add(
387
"SQLSyntaxError",
388
py.get_type::<exceptions::SQLSyntaxError>(),
389
)
390
.unwrap();
391
m.add("SchemaError", py.get_type::<exceptions::SchemaError>())
392
.unwrap();
393
m.add(
394
"SchemaFieldNotFoundError",
395
py.get_type::<exceptions::SchemaFieldNotFoundError>(),
396
)
397
.unwrap();
398
m.add("ShapeError", py.get_type::<exceptions::ShapeError>())
399
.unwrap();
400
m.add(
401
"StringCacheMismatchError",
402
py.get_type::<exceptions::StringCacheMismatchError>(),
403
)
404
.unwrap();
405
m.add(
406
"StructFieldNotFoundError",
407
py.get_type::<exceptions::StructFieldNotFoundError>(),
408
)
409
.unwrap();
410
411
// Exceptions - Warnings
412
m.add("PolarsWarning", py.get_type::<exceptions::PolarsWarning>())
413
.unwrap();
414
m.add(
415
"PerformanceWarning",
416
py.get_type::<exceptions::PerformanceWarning>(),
417
)
418
.unwrap();
419
m.add(
420
"CategoricalRemappingWarning",
421
py.get_type::<exceptions::CategoricalRemappingWarning>(),
422
)
423
.unwrap();
424
m.add(
425
"MapWithoutReturnDtypeWarning",
426
py.get_type::<exceptions::MapWithoutReturnDtypeWarning>(),
427
)
428
.unwrap();
429
430
// Exceptions - Panic
431
m.add(
432
"PanicException",
433
py.get_type::<pyo3::panic::PanicException>(),
434
)
435
.unwrap();
436
437
// Cloud
438
#[cfg(feature = "polars_cloud_client")]
439
m.add_wrapped(wrap_pyfunction!(cloud_client::prepare_cloud_plan))
440
.unwrap();
441
#[cfg(feature = "polars_cloud_server")]
442
m.add_wrapped(wrap_pyfunction!(cloud_server::_execute_ir_plan_with_gpu))
443
.unwrap();
444
445
// Build info
446
m.add("__version__", PYPOLARS_VERSION)?;
447
m.add("RUNTIME_REPR", RUNTIME_REPR)?;
448
449
// Plugins
450
#[cfg(feature = "ffi_plugin")]
451
m.add_wrapped(wrap_pyfunction!(functions::register_plugin_function))
452
.unwrap();
453
454
// Capsules
455
#[cfg(feature = "allocator")]
456
{
457
m.add("_allocator", allocator::create_allocator_capsule(py)?)?;
458
}
459
460
m.add("_debug", cfg!(debug_assertions))?;
461
462
Ok(())
463
}
464
465