use polars_core::prelude::*;
#[cfg(feature = "diff")]
use polars_core::series::ops::NullBehavior;
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.map_unary(FunctionExpr::ListExpr(ListFunction::Any))
}
#[cfg(feature = "list_any_all")]
pub fn all(self) -> Expr {
self.0.map_unary(FunctionExpr::ListExpr(ListFunction::All))
}
#[cfg(feature = "list_drop_nulls")]
pub fn drop_nulls(self) -> Expr {
self.0
.map_unary(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_binary(
FunctionExpr::ListExpr(ListFunction::Sample {
is_fraction: false,
with_replacement,
shuffle,
seed,
}),
n,
)
}
#[cfg(feature = "list_sample")]
pub fn sample_fraction(
self,
fraction: Expr,
with_replacement: bool,
shuffle: bool,
seed: Option<u64>,
) -> Expr {
self.0.map_binary(
FunctionExpr::ListExpr(ListFunction::Sample {
is_fraction: true,
with_replacement,
shuffle,
seed,
}),
fraction,
)
}
pub fn len(self) -> Expr {
self.0
.map_unary(FunctionExpr::ListExpr(ListFunction::Length))
}
pub fn max(self) -> Expr {
self.0.map_unary(FunctionExpr::ListExpr(ListFunction::Max))
}
pub fn min(self) -> Expr {
self.0.map_unary(FunctionExpr::ListExpr(ListFunction::Min))
}
pub fn sum(self) -> Expr {
self.0.map_unary(FunctionExpr::ListExpr(ListFunction::Sum))
}
pub fn mean(self) -> Expr {
self.0.map_unary(FunctionExpr::ListExpr(ListFunction::Mean))
}
pub fn median(self) -> Expr {
self.0
.map_unary(FunctionExpr::ListExpr(ListFunction::Median))
}
pub fn std(self, ddof: u8) -> Expr {
self.0
.map_unary(FunctionExpr::ListExpr(ListFunction::Std(ddof)))
}
pub fn var(self, ddof: u8) -> Expr {
self.0
.map_unary(FunctionExpr::ListExpr(ListFunction::Var(ddof)))
}
pub fn sort(self, options: SortOptions) -> Expr {
self.0
.map_unary(FunctionExpr::ListExpr(ListFunction::Sort(options)))
}
pub fn reverse(self) -> Expr {
self.0
.map_unary(FunctionExpr::ListExpr(ListFunction::Reverse))
}
pub fn unique(self) -> Expr {
self.0
.map_unary(FunctionExpr::ListExpr(ListFunction::Unique(false)))
}
pub fn unique_stable(self) -> Expr {
self.0
.map_unary(FunctionExpr::ListExpr(ListFunction::Unique(true)))
}
pub fn n_unique(self) -> Expr {
self.0
.map_unary(FunctionExpr::ListExpr(ListFunction::NUnique))
}
pub fn get(self, index: Expr, null_on_oob: bool) -> Expr {
self.0.map_binary(
FunctionExpr::ListExpr(ListFunction::Get(null_on_oob)),
index,
)
}
#[cfg(feature = "list_gather")]
pub fn gather(self, index: Expr, null_on_oob: bool) -> Expr {
self.0.map_binary(
FunctionExpr::ListExpr(ListFunction::Gather(null_on_oob)),
index,
)
}
#[cfg(feature = "list_gather")]
pub fn gather_every(self, n: Expr, offset: Expr) -> Expr {
self.0
.map_ternary(FunctionExpr::ListExpr(ListFunction::GatherEvery), n, offset)
}
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_binary(
FunctionExpr::ListExpr(ListFunction::Join(ignore_nulls)),
separator,
)
}
pub fn arg_min(self) -> Expr {
self.0
.map_unary(FunctionExpr::ListExpr(ListFunction::ArgMin))
}
pub fn arg_max(self) -> Expr {
self.0
.map_unary(FunctionExpr::ListExpr(ListFunction::ArgMax))
}
#[cfg(feature = "diff")]
pub fn diff(self, n: i64, null_behavior: NullBehavior) -> Expr {
self.0.map_unary(FunctionExpr::ListExpr(ListFunction::Diff {
n,
null_behavior,
}))
}
pub fn shift(self, periods: Expr) -> Expr {
self.0
.map_binary(FunctionExpr::ListExpr(ListFunction::Shift), periods)
}
pub fn slice(self, offset: Expr, length: Expr) -> Expr {
self.0
.map_ternary(FunctionExpr::ListExpr(ListFunction::Slice), offset, length)
}
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_unary(FunctionExpr::ListExpr(ListFunction::ToArray(width)))
}
#[cfg(feature = "list_to_struct")]
#[allow(clippy::wrong_self_convention)]
pub fn to_struct(self, names: Arc<[PlSmallStr]>) -> Expr {
self.0.map_unary(ListFunction::ToStruct(names))
}
#[cfg(feature = "is_in")]
pub fn contains<E: Into<Expr>>(self, other: E, nulls_equal: bool) -> Expr {
self.0.map_binary(
FunctionExpr::ListExpr(ListFunction::Contains { nulls_equal }),
other.into(),
)
}
#[cfg(feature = "list_count")]
pub fn count_matches<E: Into<Expr>>(self, element: E) -> Expr {
self.0.map_binary(
FunctionExpr::ListExpr(ListFunction::CountMatches),
element.into(),
)
}
#[cfg(feature = "list_sets")]
fn set_operation(self, other: Expr, set_operation: SetOperation) -> Expr {
self.0.map_binary(
FunctionExpr::ListExpr(ListFunction::SetOperation(set_operation)),
other,
)
}
#[cfg(feature = "list_sets")]
pub fn union<E: Into<Expr>>(self, other: E) -> Expr {
self.set_operation(other.into(), SetOperation::Union)
}
#[cfg(feature = "list_sets")]
pub fn set_difference<E: Into<Expr>>(self, other: E) -> Expr {
self.set_operation(other.into(), SetOperation::Difference)
}
#[cfg(feature = "list_sets")]
pub fn set_intersection<E: Into<Expr>>(self, other: E) -> Expr {
self.set_operation(other.into(), SetOperation::Intersection)
}
#[cfg(feature = "list_sets")]
pub fn set_symmetric_difference<E: Into<Expr>>(self, other: E) -> Expr {
self.set_operation(other.into(), SetOperation::SymmetricDifference)
}
pub fn eval<E: Into<Expr>>(self, other: E) -> Expr {
Expr::Eval {
expr: Arc::new(self.0),
evaluation: Arc::new(other.into()),
variant: EvalVariant::List,
}
}
}