Path: blob/main/crates/polars-expr/src/dispatch/rolling_by.rs
7884 views
use arrow::temporal_conversions::MICROSECONDS_IN_DAY as US_IN_DAY;1use polars_core::error::PolarsResult;2use polars_core::prelude::{Column, DataType, IntoColumn, TimeUnit};3use polars_core::series::Series;4use polars_time::prelude::{RollingOptionsDynamicWindow, SeriesOpsTime};56fn roll_by_with_temporal_conversion<F: FnOnce(&Series, &Series) -> PolarsResult<Series>>(7s: &[Column],8op: F,9) -> PolarsResult<Column> {10let by = &s[1];11let dt = &s[0].dtype();12let s = if dt.is_temporal() {13&s[0].to_physical_repr()14} else {15&s[0]16};1718// @scalar-opt19let out = op(s.as_materialized_series(), by.as_materialized_series())?;2021Ok(match dt {22DataType::Date => (out * US_IN_DAY as f64)23.cast(&DataType::Int64)?24.into_datetime(TimeUnit::Microseconds, None),25DataType::Datetime(tu, tz) => out.cast(&DataType::Int64)?.into_datetime(*tu, tz.clone()),26DataType::Duration(tu) => out.cast(&DataType::Int64)?.into_duration(*tu),27DataType::Time => out.cast(&DataType::Int64)?.into_time(),28_ => out,29}30.into_column())31}3233pub(super) fn rolling_min_by(34s: &[Column],35options: RollingOptionsDynamicWindow,36) -> PolarsResult<Column> {37// @scalar-opt38s[0].as_materialized_series()39.rolling_min_by(s[1].as_materialized_series(), options)40.map(Column::from)41}4243pub(super) fn rolling_max_by(44s: &[Column],45options: RollingOptionsDynamicWindow,46) -> PolarsResult<Column> {47// @scalar-opt48s[0].as_materialized_series()49.rolling_max_by(s[1].as_materialized_series(), options)50.map(Column::from)51}5253pub(super) fn rolling_mean_by(54s: &[Column],55options: RollingOptionsDynamicWindow,56) -> PolarsResult<Column> {57roll_by_with_temporal_conversion(s, |s, by| s.rolling_mean_by(by, options))58}5960pub(super) fn rolling_sum_by(61s: &[Column],62options: RollingOptionsDynamicWindow,63) -> PolarsResult<Column> {64// @scalar-opt65s[0].as_materialized_series()66.rolling_sum_by(s[1].as_materialized_series(), options)67.map(Column::from)68}6970pub(super) fn rolling_quantile_by(71s: &[Column],72options: RollingOptionsDynamicWindow,73) -> PolarsResult<Column> {74roll_by_with_temporal_conversion(s, |s, by| s.rolling_quantile_by(by, options))75}7677pub(super) fn rolling_var_by(78s: &[Column],79options: RollingOptionsDynamicWindow,80) -> PolarsResult<Column> {81// @scalar-opt82s[0].as_materialized_series()83.rolling_var_by(s[1].as_materialized_series(), options)84.map(Column::from)85}8687pub(super) fn rolling_std_by(88s: &[Column],89options: RollingOptionsDynamicWindow,90) -> PolarsResult<Column> {91// @scalar-opt92s[0].as_materialized_series()93.rolling_std_by(s[1].as_materialized_series(), options)94.map(Column::from)95}9697pub(super) fn rolling_rank_by(98s: &[Column],99options: RollingOptionsDynamicWindow,100) -> PolarsResult<Column> {101// @scalar-opt102s[0].as_materialized_series()103.rolling_rank_by(s[1].as_materialized_series(), options)104.map(Column::from)105}106107108