Path: blob/main/crates/polars-ops/src/series/ops/rolling.rs
8433 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() {46#[cfg(feature = "dtype-f16")]47DataType::Float16 => {48let ca = s.f16().unwrap();49rolling_skew_ca(ca, window_size, min_periods, center, params).map(|ca| ca.into_series())50},51DataType::Float64 => {52let ca = s.f64().unwrap();53rolling_skew_ca(ca, window_size, min_periods, center, params).map(|ca| ca.into_series())54},55DataType::Float32 => {56let ca = s.f32().unwrap();57rolling_skew_ca(ca, window_size, min_periods, center, params).map(|ca| ca.into_series())58},59dt if dt.is_primitive_numeric() => {60let s = s.cast(&DataType::Float64).unwrap();61rolling_skew(&s, options)62},63dt => polars_bail!(opq = rolling_skew, dt),64}65}6667#[cfg(feature = "moment")]68fn rolling_kurtosis_ca<T>(69ca: &ChunkedArray<T>,70window_size: usize,71params: Option<RollingFnParams>,72min_periods: usize,73center: bool,74) -> PolarsResult<ChunkedArray<T>>75where76T: PolarsFloatType,77T::Native: Float + SubAssign + Pow<T::Native, Output = T::Native>,78{79use arrow::array::Array;8081let ca = ca.rechunk();82let arr = ca.downcast_get(0).unwrap();83let arr = if arr.has_nulls() {84polars_compute::rolling::nulls::rolling_kurtosis(85arr,86window_size,87min_periods,88center,89params,90)91} else {92let values = arr.values();93polars_compute::rolling::no_nulls::rolling_kurtosis(94values,95window_size,96min_periods,97center,98params,99)?100};101Ok(unsafe { ca.with_chunks(vec![arr]) })102}103104#[cfg(feature = "moment")]105pub fn rolling_kurtosis(s: &Series, options: RollingOptionsFixedWindow) -> PolarsResult<Series> {106let window_size = options.window_size;107let min_periods = options.min_periods;108let center = options.center;109let params = options.fn_params;110111match s.dtype() {112DataType::Float64 => {113let ca = s.f64().unwrap();114rolling_kurtosis_ca(ca, window_size, params, min_periods, center)115.map(|ca| ca.into_series())116},117DataType::Float32 => {118let ca = s.f32().unwrap();119rolling_kurtosis_ca(ca, window_size, params, min_periods, center)120.map(|ca| ca.into_series())121},122#[cfg(feature = "dtype-f16")]123DataType::Float16 => {124let ca = s.f16().unwrap();125rolling_kurtosis_ca(ca, window_size, params, min_periods, center)126.map(|ca| ca.into_series())127},128dt if dt.is_primitive_numeric() => {129let s = s.cast(&DataType::Float64).unwrap();130rolling_kurtosis(&s, options)131},132dt => polars_bail!(opq = rolling_kurtosis, dt),133}134}135136137