polars_core/scalar/
reduce.rs1use 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}