use super::*;
pub trait VarAggSeries {
    fn var_reduce(&self, ddof: u8) -> Scalar;
    fn std_reduce(&self, ddof: u8) -> Scalar;
}
impl<T> ChunkVar for ChunkedArray<T>
where
    T: PolarsNumericType,
    ChunkedArray<T>: ChunkAgg<T::Native>,
{
    fn var(&self, ddof: u8) -> Option<f64> {
        let n_values = self.len() - self.null_count();
        if n_values <= ddof as usize {
            return None;
        }
        let mean = self.mean()?;
        let squared: Float64Chunked = ChunkedArray::apply_values_generic(self, |value| {
            let tmp = value.to_f64().unwrap() - mean;
            tmp * tmp
        });
        squared
            .sum()
            .map(|sum| sum / (n_values as f64 - ddof as f64))
    }
    fn std(&self, ddof: u8) -> Option<f64> {
        self.var(ddof).map(|var| var.sqrt())
    }
}
impl ChunkVar for StringChunked {}
impl ChunkVar for ListChunked {}
#[cfg(feature = "dtype-array")]
impl ChunkVar for ArrayChunked {}
#[cfg(feature = "object")]
impl<T: PolarsObject> ChunkVar for ObjectChunked<T> {}
impl ChunkVar for BooleanChunked {}