Path: blob/main/crates/polars-ops/src/chunked_array/list/dispersion.rs
8420 views
use arrow::temporal_conversions::MICROSECONDS_IN_DAY as US_IN_DAY;12use super::*;34pub(super) fn median_with_nulls(ca: &ListChunked) -> Series {5match ca.inner_dtype() {6#[cfg(feature = "dtype-f16")]7DataType::Float16 => {8let out: Float16Chunked = ca9.apply_amortized_generic(|s| {10use num_traits::FromPrimitive;11use polars_utils::float16::pf16;1213s.and_then(|s| s.as_ref().median().map(|v| pf16::from_f64(v).unwrap()))14})15.with_name(ca.name().clone());16out.into_series()17},18DataType::Float32 => {19let out: Float32Chunked = ca20.apply_amortized_generic(|s| s.and_then(|s| s.as_ref().median().map(|v| v as f32)))21.with_name(ca.name().clone());22out.into_series()23},24#[cfg(feature = "dtype-datetime")]25DataType::Date => {26let out: Int64Chunked = ca27.apply_amortized_generic(|s| {28s.and_then(|s| s.as_ref().median().map(|v| (v * (US_IN_DAY as f64)) as i64))29})30.with_name(ca.name().clone());31out.into_datetime(TimeUnit::Microseconds, None)32.into_series()33},34dt if dt.is_temporal() => {35let out: Int64Chunked = ca36.apply_amortized_generic(|s| s.and_then(|s| s.as_ref().median().map(|v| v as i64)))37.with_name(ca.name().clone());38out.cast(dt).unwrap()39},40_ => {41let out: Float64Chunked = ca42.apply_amortized_generic(|s| s.and_then(|s| s.as_ref().median()))43.with_name(ca.name().clone());44out.into_series()45},46}47}4849pub(super) fn std_with_nulls(ca: &ListChunked, ddof: u8) -> Series {50match ca.inner_dtype() {51#[cfg(feature = "dtype-f16")]52DataType::Float16 => {53let out: Float16Chunked = ca54.apply_amortized_generic(|s| {55use num_traits::FromPrimitive;56use polars_utils::float16::pf16;5758s.and_then(|s| s.as_ref().std(ddof).map(|v| pf16::from_f64(v).unwrap()))59})60.with_name(ca.name().clone());61out.into_series()62},63DataType::Float32 => {64let out: Float32Chunked = ca65.apply_amortized_generic(|s| s.and_then(|s| s.as_ref().std(ddof).map(|v| v as f32)))66.with_name(ca.name().clone());67out.into_series()68},69#[cfg(feature = "dtype-duration")]70DataType::Duration(tu) => {71let out: Int64Chunked = ca72.apply_amortized_generic(|s| s.and_then(|s| s.as_ref().std(ddof).map(|v| v as i64)))73.with_name(ca.name().clone());74out.into_duration(*tu).into_series()75},76_ => {77let out: Float64Chunked = ca78.apply_amortized_generic(|s| s.and_then(|s| s.as_ref().std(ddof)))79.with_name(ca.name().clone());80out.into_series()81},82}83}8485pub(super) fn var_with_nulls(ca: &ListChunked, ddof: u8) -> PolarsResult<Series> {86match ca.inner_dtype() {87#[cfg(feature = "dtype-f16")]88DataType::Float16 => {89let out: Float16Chunked = ca90.apply_amortized_generic(|s| {91use num_traits::FromPrimitive;92use polars_utils::float16::pf16;9394s.and_then(|s| s.as_ref().var(ddof).map(|v| pf16::from_f64(v).unwrap()))95})96.with_name(ca.name().clone());97Ok(out.into_series())98},99DataType::Float32 => {100let out: Float32Chunked = ca101.apply_amortized_generic(|s| s.and_then(|s| s.as_ref().var(ddof).map(|v| v as f32)))102.with_name(ca.name().clone());103Ok(out.into_series())104},105dt if dt.is_temporal() => {106polars_bail!(InvalidOperation: "variance of type {dt} is not supported")107},108_ => {109let out: Float64Chunked = ca110.apply_amortized_generic(|s| s.and_then(|s| s.as_ref().var(ddof)))111.with_name(ca.name().clone());112Ok(out.into_series())113},114}115}116117118