polars_core/scalar/
reduce.rs

1use crate::datatypes::{AnyValue, TimeUnit};
2#[cfg(feature = "dtype-date")]
3use crate::prelude::MS_IN_DAY;
4use crate::prelude::{DataType, Scalar};
5
6pub fn mean_reduce(value: Option<f64>, dtype: DataType) -> Scalar {
7    match dtype {
8        DataType::Float32 => {
9            let val = value.map(|m| m as f32);
10            Scalar::new(dtype, val.into())
11        },
12        dt if dt.is_primitive_numeric() || dt.is_decimal() || dt.is_bool() => {
13            Scalar::new(DataType::Float64, value.into())
14        },
15        #[cfg(feature = "dtype-date")]
16        DataType::Date => {
17            let val = value.map(|v| (v * MS_IN_DAY as f64) as i64);
18            Scalar::new(DataType::Datetime(TimeUnit::Milliseconds, None), val.into())
19        },
20        #[cfg(feature = "dtype-datetime")]
21        dt @ DataType::Datetime(_, _) => {
22            let val = value.map(|v| v as i64);
23            Scalar::new(dt, val.into())
24        },
25        #[cfg(feature = "dtype-duration")]
26        dt @ DataType::Duration(_) => {
27            let val = value.map(|v| v as i64);
28            Scalar::new(dt, val.into())
29        },
30        #[cfg(feature = "dtype-time")]
31        dt @ DataType::Time => {
32            let val = value.map(|v| v as i64);
33            Scalar::new(dt, val.into())
34        },
35        dt => Scalar::new(dt, AnyValue::Null),
36    }
37}