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