use polars_core::prelude::*;
#[cfg(feature = "diff")]
use polars_core::series::ops::NullBehavior;
#[cfg(feature = "list_sets")]
use polars_core::utils::SuperTypeFlags;
#[cfg(feature = "list_sets")]
use polars_core::utils::SuperTypeOptions;
use crate::prelude::function_expr::ListFunction;
use crate::prelude::*;
pub struct ListNameSpace(pub Expr);
impl ListNameSpace {
#[cfg(feature = "list_any_all")]
pub fn any(self) -> Expr {
self.0
.apply_private(FunctionExpr::ListExpr(ListFunction::Any))
.with_fmt("list.any")
}
#[cfg(feature = "list_any_all")]
pub fn all(self) -> Expr {
self.0
.apply_private(FunctionExpr::ListExpr(ListFunction::All))
.with_fmt("list.all")
}
#[cfg(feature = "list_drop_nulls")]
pub fn drop_nulls(self) -> Expr {
self.0
.map_private(FunctionExpr::ListExpr(ListFunction::DropNulls))
}
#[cfg(feature = "list_sample")]
pub fn sample_n(
self,
n: Expr,
with_replacement: bool,
shuffle: bool,
seed: Option<u64>,
) -> Expr {
self.0.map_many_private(
FunctionExpr::ListExpr(ListFunction::Sample {
is_fraction: false,
with_replacement,
shuffle,
seed,
}),
&[n],
false,
None,
)
}
#[cfg(feature = "list_sample")]
pub fn sample_fraction(
self,
fraction: Expr,
with_replacement: bool,
shuffle: bool,
seed: Option<u64>,
) -> Expr {
self.0.map_many_private(
FunctionExpr::ListExpr(ListFunction::Sample {
is_fraction: true,
with_replacement,
shuffle,
seed,
}),
&[fraction],
false,
None,
)
}
pub fn len(self) -> Expr {
self.0
.map_private(FunctionExpr::ListExpr(ListFunction::Length))
}
pub fn max(self) -> Expr {
self.0
.map_private(FunctionExpr::ListExpr(ListFunction::Max))
}
pub fn min(self) -> Expr {
self.0
.map_private(FunctionExpr::ListExpr(ListFunction::Min))
}
pub fn sum(self) -> Expr {
self.0
.map_private(FunctionExpr::ListExpr(ListFunction::Sum))
}
pub fn mean(self) -> Expr {
self.0
.map_private(FunctionExpr::ListExpr(ListFunction::Mean))
}
pub fn median(self) -> Expr {
self.0
.map_private(FunctionExpr::ListExpr(ListFunction::Median))
}
pub fn std(self, ddof: u8) -> Expr {
self.0
.map_private(FunctionExpr::ListExpr(ListFunction::Std(ddof)))
}
pub fn var(self, ddof: u8) -> Expr {
self.0
.map_private(FunctionExpr::ListExpr(ListFunction::Var(ddof)))
}
pub fn sort(self, options: SortOptions) -> Expr {
self.0
.map_private(FunctionExpr::ListExpr(ListFunction::Sort(options)))
}
pub fn reverse(self) -> Expr {
self.0
.map_private(FunctionExpr::ListExpr(ListFunction::Reverse))
}
pub fn unique(self) -> Expr {
self.0
.map_private(FunctionExpr::ListExpr(ListFunction::Unique(false)))
}
pub fn unique_stable(self) -> Expr {
self.0
.map_private(FunctionExpr::ListExpr(ListFunction::Unique(true)))
}
pub fn n_unique(self) -> Expr {
self.0
.map_private(FunctionExpr::ListExpr(ListFunction::NUnique))
}
pub fn get(self, index: Expr, null_on_oob: bool) -> Expr {
self.0.map_many_private(
FunctionExpr::ListExpr(ListFunction::Get(null_on_oob)),
&[index],
false,
None,
)
}
#[cfg(feature = "list_gather")]
pub fn gather(self, index: Expr, null_on_oob: bool) -> Expr {
self.0.map_many_private(
FunctionExpr::ListExpr(ListFunction::Gather(null_on_oob)),
&[index],
false,
None,
)
}
#[cfg(feature = "list_gather")]
pub fn gather_every(self, n: Expr, offset: Expr) -> Expr {
self.0.map_many_private(
FunctionExpr::ListExpr(ListFunction::GatherEvery),
&[n, offset],
false,
None,
)
}
pub fn first(self) -> Expr {
self.get(lit(0i64), true)
}
pub fn last(self) -> Expr {
self.get(lit(-1i64), true)
}
pub fn join(self, separator: Expr, ignore_nulls: bool) -> Expr {
self.0.map_many_private(
FunctionExpr::ListExpr(ListFunction::Join(ignore_nulls)),
&[separator],
false,
None,
)
}
pub fn arg_min(self) -> Expr {
self.0
.map_private(FunctionExpr::ListExpr(ListFunction::ArgMin))
}
pub fn arg_max(self) -> Expr {
self.0
.map_private(FunctionExpr::ListExpr(ListFunction::ArgMax))
}
#[cfg(feature = "diff")]
pub fn diff(self, n: i64, null_behavior: NullBehavior) -> Expr {
self.0
.map_private(FunctionExpr::ListExpr(ListFunction::Diff {
n,
null_behavior,
}))
}
pub fn shift(self, periods: Expr) -> Expr {
self.0.map_many_private(
FunctionExpr::ListExpr(ListFunction::Shift),
&[periods],
false,
None,
)
}
pub fn slice(self, offset: Expr, length: Expr) -> Expr {
self.0.map_many_private(
FunctionExpr::ListExpr(ListFunction::Slice),
&[offset, length],
false,
None,
)
}
pub fn head(self, n: Expr) -> Expr {
self.slice(lit(0), n)
}
pub fn tail(self, n: Expr) -> Expr {
self.slice(lit(0i64) - n.clone().cast(DataType::Int64), n)
}
#[cfg(feature = "dtype-array")]
pub fn to_array(self, width: usize) -> Expr {
self.0
.map_private(FunctionExpr::ListExpr(ListFunction::ToArray(width)))
}
#[cfg(feature = "list_to_struct")]
#[allow(clippy::wrong_self_convention)]
pub fn to_struct(self, args: ListToStructArgs) -> Expr {
self.0
.map_private(FunctionExpr::ListExpr(ListFunction::ToStruct(args)))
}
#[cfg(feature = "is_in")]
pub fn contains<E: Into<Expr>>(self, other: E) -> Expr {
let other = other.into();
self.0.map_many_private(
FunctionExpr::ListExpr(ListFunction::Contains),
&[other],
false,
None,
)
}
#[cfg(feature = "list_count")]
pub fn count_matches<E: Into<Expr>>(self, element: E) -> Expr {
let other = element.into();
self.0.map_many_private(
FunctionExpr::ListExpr(ListFunction::CountMatches),
&[other],
false,
None,
)
}
#[cfg(feature = "list_sets")]
fn set_operation(self, other: Expr, set_operation: SetOperation) -> Expr {
Expr::Function {
input: vec![self.0, other],
function: FunctionExpr::ListExpr(ListFunction::SetOperation(set_operation)),
options: FunctionOptions {
collect_groups: ApplyOptions::ElementWise,
cast_to_supertypes: Some(SuperTypeOptions {
flags: SuperTypeFlags::default() | SuperTypeFlags::ALLOW_IMPLODE_LIST,
}),
flags: FunctionFlags::default()
| FunctionFlags::INPUT_WILDCARD_EXPANSION & !FunctionFlags::RETURNS_SCALAR,
..Default::default()
},
}
}
#[cfg(feature = "list_sets")]
pub fn union<E: Into<Expr>>(self, other: E) -> Expr {
let other = other.into();
self.set_operation(other, SetOperation::Union)
}
#[cfg(feature = "list_sets")]
pub fn set_difference<E: Into<Expr>>(self, other: E) -> Expr {
let other = other.into();
self.set_operation(other, SetOperation::Difference)
}
#[cfg(feature = "list_sets")]
pub fn set_intersection<E: Into<Expr>>(self, other: E) -> Expr {
let other = other.into();
self.set_operation(other, SetOperation::Intersection)
}
#[cfg(feature = "list_sets")]
pub fn set_symmetric_difference<E: Into<Expr>>(self, other: E) -> Expr {
let other = other.into();
self.set_operation(other, SetOperation::SymmetricDifference)
}
}