Path: blob/main/crates/polars-ops/src/series/ops/rolling.rs
6939 views
use polars_core::prelude::*;1#[cfg(feature = "moment")]2use {3num_traits::{Float, pow::Pow},4std::ops::SubAssign,5};67#[cfg(feature = "moment")]8fn rolling_skew_ca<T>(9ca: &ChunkedArray<T>,10window_size: usize,11min_periods: usize,12center: bool,13params: Option<RollingFnParams>,14) -> PolarsResult<ChunkedArray<T>>15where16T: PolarsFloatType,17T::Native: Float + SubAssign + Pow<T::Native, Output = T::Native>,18{19use arrow::array::Array;2021let ca = ca.rechunk();22let arr = ca.downcast_get(0).unwrap();23let arr = if arr.has_nulls() {24polars_compute::rolling::nulls::rolling_skew(arr, window_size, min_periods, center, params)25} else {26let values = arr.values();27polars_compute::rolling::no_nulls::rolling_skew(28values,29window_size,30min_periods,31center,32params,33)?34};35Ok(unsafe { ca.with_chunks(vec![arr]) })36}3738#[cfg(feature = "moment")]39pub fn rolling_skew(s: &Series, options: RollingOptionsFixedWindow) -> PolarsResult<Series> {40let window_size = options.window_size;41let min_periods = options.min_periods;42let center = options.center;43let params = options.fn_params;4445match s.dtype() {46DataType::Float64 => {47let ca = s.f64().unwrap();48rolling_skew_ca(ca, window_size, min_periods, center, params).map(|ca| ca.into_series())49},50DataType::Float32 => {51let ca = s.f32().unwrap();52rolling_skew_ca(ca, window_size, min_periods, center, params).map(|ca| ca.into_series())53},54dt if dt.is_primitive_numeric() => {55let s = s.cast(&DataType::Float64).unwrap();56rolling_skew(&s, options)57},58dt => polars_bail!(opq = rolling_skew, dt),59}60}6162#[cfg(feature = "moment")]63fn rolling_kurtosis_ca<T>(64ca: &ChunkedArray<T>,65window_size: usize,66params: Option<RollingFnParams>,67min_periods: usize,68center: bool,69) -> PolarsResult<ChunkedArray<T>>70where71T: PolarsFloatType,72T::Native: Float + SubAssign + Pow<T::Native, Output = T::Native>,73{74use arrow::array::Array;7576let ca = ca.rechunk();77let arr = ca.downcast_get(0).unwrap();78let arr = if arr.has_nulls() {79polars_compute::rolling::nulls::rolling_kurtosis(80arr,81window_size,82min_periods,83center,84params,85)86} else {87let values = arr.values();88polars_compute::rolling::no_nulls::rolling_kurtosis(89values,90window_size,91min_periods,92center,93params,94)?95};96Ok(unsafe { ca.with_chunks(vec![arr]) })97}9899#[cfg(feature = "moment")]100pub fn rolling_kurtosis(s: &Series, options: RollingOptionsFixedWindow) -> PolarsResult<Series> {101let window_size = options.window_size;102let min_periods = options.min_periods;103let center = options.center;104let params = options.fn_params;105106match s.dtype() {107DataType::Float64 => {108let ca = s.f64().unwrap();109rolling_kurtosis_ca(ca, window_size, params, min_periods, center)110.map(|ca| ca.into_series())111},112DataType::Float32 => {113let ca = s.f32().unwrap();114rolling_kurtosis_ca(ca, window_size, params, min_periods, center)115.map(|ca| ca.into_series())116},117dt if dt.is_primitive_numeric() => {118let s = s.cast(&DataType::Float64).unwrap();119rolling_kurtosis(&s, options)120},121dt => polars_bail!(opq = rolling_kurtosis, dt),122}123}124125126