Path: blob/main/crates/polars-ops/src/chunked_array/array/sum_mean.rs
8389 views
use arrow::array::{Array, PrimitiveArray};1use arrow::bitmap::Bitmap;2use arrow::legacy::utils::CustomIterTools;3use arrow::types::NativeType;4use num_traits::{NumCast, ToPrimitive};5use polars_core::prelude::*;6use polars_utils::float16::pf16;78use crate::chunked_array::sum::sum_slice;910fn dispatch_sum<T, S>(arr: &dyn Array, width: usize, validity: Option<&Bitmap>) -> ArrayRef11where12T: NativeType + ToPrimitive,13S: NativeType + NumCast + std::iter::Sum,14{15let values = arr.as_any().downcast_ref::<PrimitiveArray<T>>().unwrap();16let values = values.values().as_slice();1718let summed: Vec<_> = (0..values.len())19.step_by(width)20.map(|start| {21let slice = unsafe { values.get_unchecked(start..start + width) };22sum_slice::<T, S>(slice)23})24.collect_trusted();2526Box::new(PrimitiveArray::from_data_default(27summed.into(),28validity.cloned(),29)) as ArrayRef30}3132pub(super) fn sum_array_numerical(ca: &ArrayChunked, inner_type: &DataType) -> Series {33let width = ca.width();34use DataType::*;35let chunks = ca36.downcast_iter()37.map(|arr| {38let values = arr.values().as_ref();3940match inner_type {41Int8 => dispatch_sum::<i8, i64>(values, width, arr.validity()),42Int16 => dispatch_sum::<i16, i64>(values, width, arr.validity()),43Int32 => dispatch_sum::<i32, i32>(values, width, arr.validity()),44Int64 => dispatch_sum::<i64, i64>(values, width, arr.validity()),45Int128 => dispatch_sum::<i128, i128>(values, width, arr.validity()),46UInt8 => dispatch_sum::<u8, i64>(values, width, arr.validity()),47UInt16 => dispatch_sum::<u16, i64>(values, width, arr.validity()),48UInt32 => dispatch_sum::<u32, u32>(values, width, arr.validity()),49UInt64 => dispatch_sum::<u64, u64>(values, width, arr.validity()),50UInt128 => dispatch_sum::<u128, u128>(values, width, arr.validity()),51Float16 => dispatch_sum::<pf16, pf16>(values, width, arr.validity()),52Float32 => dispatch_sum::<f32, f32>(values, width, arr.validity()),53Float64 => dispatch_sum::<f64, f64>(values, width, arr.validity()),54_ => unimplemented!(),55}56})57.collect::<Vec<_>>();5859Series::try_from((ca.name().clone(), chunks)).unwrap()60}6162pub(super) fn sum_with_nulls(ca: &ArrayChunked, inner_dtype: &DataType) -> PolarsResult<Series> {63use DataType::*;64let mut out = {65match inner_dtype {66Boolean => {67let out: IdxCa = ca68.amortized_iter()69.map(|s| s.and_then(|s| s.as_ref().sum().ok()))70.collect();71out.into_series()72},73UInt8 => {74let out: Int64Chunked = ca75.amortized_iter()76.map(|s| s.and_then(|s| s.as_ref().sum().ok()))77.collect();78out.into_series()79},80UInt16 => {81let out: Int64Chunked = ca82.amortized_iter()83.map(|s| s.and_then(|s| s.as_ref().sum().ok()))84.collect();85out.into_series()86},87UInt32 => {88let out: UInt32Chunked = ca89.amortized_iter()90.map(|s| s.and_then(|s| s.as_ref().sum().ok()))91.collect();92out.into_series()93},94UInt64 => {95let out: UInt64Chunked = ca96.amortized_iter()97.map(|s| s.and_then(|s| s.as_ref().sum().ok()))98.collect();99out.into_series()100},101#[cfg(feature = "dtype-u128")]102UInt128 => {103let out: UInt128Chunked = ca104.amortized_iter()105.map(|s| s.and_then(|s| s.as_ref().sum().ok()))106.collect();107out.into_series()108},109Int8 => {110let out: Int64Chunked = ca111.amortized_iter()112.map(|s| s.and_then(|s| s.as_ref().sum().ok()))113.collect();114out.into_series()115},116Int16 => {117let out: Int64Chunked = ca118.amortized_iter()119.map(|s| s.and_then(|s| s.as_ref().sum().ok()))120.collect();121out.into_series()122},123Int32 => {124let out: Int32Chunked = ca125.amortized_iter()126.map(|s| s.and_then(|s| s.as_ref().sum().ok()))127.collect();128out.into_series()129},130Int64 => {131let out: Int64Chunked = ca132.amortized_iter()133.map(|s| s.and_then(|s| s.as_ref().sum().ok()))134.collect();135out.into_series()136},137#[cfg(feature = "dtype-i128")]138Int128 => {139let out: Int128Chunked = ca140.amortized_iter()141.map(|s| s.and_then(|s| s.as_ref().sum().ok()))142.collect();143out.into_series()144},145#[cfg(feature = "dtype-f16")]146Float16 => {147let out: Float16Chunked = ca148.amortized_iter()149.map(|s| s.and_then(|s| s.as_ref().sum().ok()))150.collect();151out.into_series()152},153Float32 => {154let out: Float32Chunked = ca155.amortized_iter()156.map(|s| s.and_then(|s| s.as_ref().sum().ok()))157.collect();158out.into_series()159},160Float64 => {161let out: Float64Chunked = ca162.amortized_iter()163.map(|s| s.and_then(|s| s.as_ref().sum().ok()))164.collect();165out.into_series()166},167_ => {168polars_bail!(ComputeError: "summing array with dtype: {} not yet supported", ca.dtype())169},170}171};172out.rename(ca.name().clone());173Ok(out)174}175176177