Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-python/src/functions/eager.rs
7889 views
1
use polars::functions;
2
use polars_core::prelude::*;
3
use pyo3::prelude::*;
4
5
use crate::conversion::{get_df, get_series};
6
use crate::error::PyPolarsErr;
7
use crate::utils::EnterPolarsExt;
8
use crate::{PyDataFrame, PySeries};
9
10
#[pyfunction]
11
pub fn concat_df(dfs: &Bound<'_, PyAny>, py: Python) -> PyResult<PyDataFrame> {
12
use polars_core::error::PolarsResult;
13
use polars_core::utils::rayon::prelude::*;
14
15
let mut iter = dfs.try_iter()?;
16
let first = iter.next().unwrap()?;
17
18
let first_rdf = get_df(&first)?;
19
let identity_df = first_rdf.clear();
20
21
let mut rdfs: Vec<PolarsResult<DataFrame>> = vec![Ok(first_rdf)];
22
23
for item in iter {
24
let rdf = get_df(&item?)?;
25
rdfs.push(Ok(rdf));
26
}
27
28
let identity = || Ok(identity_df.clone());
29
30
py.enter_polars_df(|| {
31
polars_core::POOL.install(|| {
32
rdfs.into_par_iter()
33
.fold(identity, |acc: PolarsResult<DataFrame>, df| {
34
let mut acc = acc?;
35
acc.vstack_mut(&df?)?;
36
Ok(acc)
37
})
38
.reduce(identity, |acc, df| {
39
let mut acc = acc?;
40
acc.vstack_mut(&df?)?;
41
Ok(acc)
42
})
43
})
44
})
45
}
46
47
#[pyfunction]
48
pub fn concat_series(series: &Bound<'_, PyAny>) -> PyResult<PySeries> {
49
let mut iter = series.try_iter()?;
50
let first = iter.next().unwrap()?;
51
52
let mut s = get_series(&first)?;
53
54
for res in iter {
55
let item = res?;
56
let item = get_series(&item)?;
57
s.append(&item).map_err(PyPolarsErr::from)?;
58
}
59
Ok(s.into())
60
}
61
62
#[pyfunction]
63
pub fn concat_df_diagonal(dfs: &Bound<'_, PyAny>) -> PyResult<PyDataFrame> {
64
let iter = dfs.try_iter()?;
65
66
let dfs = iter
67
.map(|item| {
68
let item = item?;
69
get_df(&item)
70
})
71
.collect::<PyResult<Vec<_>>>()?;
72
73
let df = functions::concat_df_diagonal(&dfs).map_err(PyPolarsErr::from)?;
74
Ok(df.into())
75
}
76
77
#[pyfunction]
78
pub fn concat_df_horizontal(dfs: &Bound<'_, PyAny>, strict: bool) -> PyResult<PyDataFrame> {
79
let iter = dfs.try_iter()?;
80
81
let dfs = iter
82
.map(|item| {
83
let item = item?;
84
get_df(&item)
85
})
86
.collect::<PyResult<Vec<_>>>()?;
87
88
let df = functions::concat_df_horizontal(&dfs, true, strict).map_err(PyPolarsErr::from)?;
89
Ok(df.into())
90
}
91
92