pub mod join;1#[cfg(feature = "pivot")]2pub mod pivot;34pub use join::*;5#[cfg(feature = "to_dummies")]6use polars_core::POOL;7use polars_core::prelude::*;8#[cfg(feature = "to_dummies")]9use polars_core::utils::accumulate_dataframes_horizontal;10#[cfg(feature = "to_dummies")]11use rayon::prelude::*;1213pub trait IntoDf {14fn to_df(&self) -> &DataFrame;15}1617impl IntoDf for DataFrame {18fn to_df(&self) -> &DataFrame {19self20}21}2223impl<T: IntoDf> DataFrameOps for T {}2425pub trait DataFrameOps: IntoDf {26/// Create dummy variables.27///28/// # Example29///30/// ```ignore31///32/// # #[macro_use] extern crate polars_core;33/// # fn main() {34///35/// use polars_core::prelude::*;36///37/// let df = df! {38/// "id" => &[1, 2, 3, 1, 2, 3, 1, 1],39/// "type" => &["A", "B", "B", "B", "C", "C", "C", "B"],40/// "code" => &["X1", "X2", "X3", "X3", "X2", "X2", "X1", "X1"]41/// }.unwrap();42///43/// let dummies = df.to_dummies(None, false, false).unwrap();44/// println!("{}", dummies);45/// # }46/// ```47/// Outputs:48/// ```text49/// +------+------+------+--------+--------+--------+---------+---------+---------+50/// | id_1 | id_3 | id_2 | type_A | type_B | type_C | code_X1 | code_X2 | code_X3 |51/// | --- | --- | --- | --- | --- | --- | --- | --- | --- |52/// | u8 | u8 | u8 | u8 | u8 | u8 | u8 | u8 | u8 |53/// +======+======+======+========+========+========+=========+=========+=========+54/// | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |55/// +------+------+------+--------+--------+--------+---------+---------+---------+56/// | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 |57/// +------+------+------+--------+--------+--------+---------+---------+---------+58/// | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |59/// +------+------+------+--------+--------+--------+---------+---------+---------+60/// | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |61/// +------+------+------+--------+--------+--------+---------+---------+---------+62/// | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |63/// +------+------+------+--------+--------+--------+---------+---------+---------+64/// | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |65/// +------+------+------+--------+--------+--------+---------+---------+---------+66/// | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 |67/// +------+------+------+--------+--------+--------+---------+---------+---------+68/// | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 |69/// +------+------+------+--------+--------+--------+---------+---------+---------+70/// ```71#[cfg(feature = "to_dummies")]72fn to_dummies(73&self,74separator: Option<&str>,75drop_first: bool,76drop_nulls: bool,77) -> PolarsResult<DataFrame> {78self._to_dummies(None, separator, drop_first, drop_nulls)79}8081#[cfg(feature = "to_dummies")]82fn columns_to_dummies(83&self,84columns: Vec<&str>,85separator: Option<&str>,86drop_first: bool,87drop_nulls: bool,88) -> PolarsResult<DataFrame> {89self._to_dummies(Some(columns), separator, drop_first, drop_nulls)90}9192#[cfg(feature = "to_dummies")]93fn _to_dummies(94&self,95columns: Option<Vec<&str>>,96separator: Option<&str>,97drop_first: bool,98drop_nulls: bool,99) -> PolarsResult<DataFrame> {100use crate::series::ToDummies;101102let df = self.to_df();103104let set: PlHashSet<&str> = if let Some(columns) = columns {105PlHashSet::from_iter(columns)106} else {107PlHashSet::from_iter(df.iter().map(|s| s.name().as_str()))108};109110let cols = POOL.install(|| {111df.get_columns()112.par_iter()113.map(|s| match set.contains(s.name().as_str()) {114true => s115.as_materialized_series()116.to_dummies(separator, drop_first, drop_nulls),117false => Ok(s.clone().into_frame()),118})119.collect::<PolarsResult<Vec<_>>>()120})?;121122accumulate_dataframes_horizontal(cols)123}124}125126127