Path: blob/main/crates/polars-python/src/functions/eager.rs
7889 views
use polars::functions;1use polars_core::prelude::*;2use pyo3::prelude::*;34use crate::conversion::{get_df, get_series};5use crate::error::PyPolarsErr;6use crate::utils::EnterPolarsExt;7use crate::{PyDataFrame, PySeries};89#[pyfunction]10pub fn concat_df(dfs: &Bound<'_, PyAny>, py: Python) -> PyResult<PyDataFrame> {11use polars_core::error::PolarsResult;12use polars_core::utils::rayon::prelude::*;1314let mut iter = dfs.try_iter()?;15let first = iter.next().unwrap()?;1617let first_rdf = get_df(&first)?;18let identity_df = first_rdf.clear();1920let mut rdfs: Vec<PolarsResult<DataFrame>> = vec![Ok(first_rdf)];2122for item in iter {23let rdf = get_df(&item?)?;24rdfs.push(Ok(rdf));25}2627let identity = || Ok(identity_df.clone());2829py.enter_polars_df(|| {30polars_core::POOL.install(|| {31rdfs.into_par_iter()32.fold(identity, |acc: PolarsResult<DataFrame>, df| {33let mut acc = acc?;34acc.vstack_mut(&df?)?;35Ok(acc)36})37.reduce(identity, |acc, df| {38let mut acc = acc?;39acc.vstack_mut(&df?)?;40Ok(acc)41})42})43})44}4546#[pyfunction]47pub fn concat_series(series: &Bound<'_, PyAny>) -> PyResult<PySeries> {48let mut iter = series.try_iter()?;49let first = iter.next().unwrap()?;5051let mut s = get_series(&first)?;5253for res in iter {54let item = res?;55let item = get_series(&item)?;56s.append(&item).map_err(PyPolarsErr::from)?;57}58Ok(s.into())59}6061#[pyfunction]62pub fn concat_df_diagonal(dfs: &Bound<'_, PyAny>) -> PyResult<PyDataFrame> {63let iter = dfs.try_iter()?;6465let dfs = iter66.map(|item| {67let item = item?;68get_df(&item)69})70.collect::<PyResult<Vec<_>>>()?;7172let df = functions::concat_df_diagonal(&dfs).map_err(PyPolarsErr::from)?;73Ok(df.into())74}7576#[pyfunction]77pub fn concat_df_horizontal(dfs: &Bound<'_, PyAny>, strict: bool) -> PyResult<PyDataFrame> {78let iter = dfs.try_iter()?;7980let dfs = iter81.map(|item| {82let item = item?;83get_df(&item)84})85.collect::<PyResult<Vec<_>>>()?;8687let df = functions::concat_df_horizontal(&dfs, true, strict).map_err(PyPolarsErr::from)?;88Ok(df.into())89}909192