Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-plan/src/plans/python/utils.rs
8354 views
1
use polars_core::error::{PolarsResult, polars_err};
2
use polars_core::frame::DataFrame;
3
use polars_core::schema::SchemaRef;
4
use polars_ffi::version_0::SeriesExport;
5
use polars_utils::python_convert_registry::get_python_convert_registry;
6
use pyo3::intern;
7
use pyo3::prelude::*;
8
9
pub fn python_df_to_rust(py: Python, df: Bound<PyAny>) -> PolarsResult<DataFrame> {
10
let err = |_| polars_err!(ComputeError: "expected a polars.DataFrame; got {}", df);
11
let pydf = df.getattr(intern!(py, "_df")).map_err(err)?;
12
13
// Try to convert without going through FFI first.
14
let converted = get_python_convert_registry().from_py.df;
15
if let Ok(any_df) = converted(pydf.clone().unbind()) {
16
return Ok(*any_df.downcast::<DataFrame>().unwrap());
17
}
18
19
// Might be foreign Polars, try with FFI.
20
let width = pydf.call_method0(intern!(py, "width")).unwrap();
21
let width = width.extract::<usize>().unwrap();
22
23
// Don't resize the Vec<> so that the drop of the SeriesExport will not be caleld.
24
let mut export: Vec<SeriesExport> = Vec::with_capacity(width);
25
let location = export.as_mut_ptr();
26
27
let _ = pydf
28
.call_method1(intern!(py, "_export_columns"), (location as usize,))
29
.unwrap();
30
31
unsafe { polars_ffi::version_0::import_df(location, width) }
32
}
33
34
pub(crate) fn python_schema_to_rust(py: Python, schema: Bound<PyAny>) -> PolarsResult<SchemaRef> {
35
let err = |_| polars_err!(ComputeError: "expected a polars.Schema; got {}", schema);
36
let df = schema.call_method0("to_frame").map_err(err)?;
37
python_df_to_rust(py, df).map(|df| df.schema().clone())
38
}
39
40