use std::iter::Sum;
use crate::prelude::*;
use num::*;
#[derive(Clone)]
pub struct SeriesGroupBy<T: BlackJackData> {
groups: Vec<Series<T>>,
}
impl<T> SeriesGroupBy<T>
where
T: BlackJackData,
{
pub fn new(groups: Vec<Series<T>>) -> Self {
SeriesGroupBy { groups }
}
pub fn apply<F>(self, agg_func: F) -> Series<T>
where
F: Fn(Series<T>) -> T + Sync + Send,
T: Send,
{
let results = self.groups.into_iter().map(agg_func).collect::<Vec<T>>();
Series::from_vec(results)
}
pub fn sum(&self) -> Series<T>
where
T: Ord + Num + Sum + Copy,
{
let mut results = vec![];
for group in &self.groups {
results.push(group.sum());
}
Series::from_vec(results)
}
pub fn min(&self) -> Result<Series<T>, BlackJackError>
where
T: PartialOrd + Num + ToPrimitive + Copy,
{
let mut results = vec![];
for group in &self.groups {
results.push(group.min()?);
}
Ok(Series::from_vec(results))
}
pub fn max(&self) -> Result<Series<T>, BlackJackError>
where
T: PartialOrd + Num + Copy,
{
let mut results = vec![];
for group in &self.groups {
results.push(group.max()?);
}
Ok(Series::from_vec(results))
}
pub fn mean(&self) -> Result<Series<f64>, BlackJackError>
where
for<'b> T: PartialOrd + Num + Sum + Copy + ToPrimitive + Sum<&'b T>,
{
let mut results = vec![];
for group in &self.groups {
results.push(group.mean()?);
}
Ok(Series::from_vec(results))
}
pub fn var(&self, ddof: f64) -> Result<Series<f64>, BlackJackError>
where
T: Num + ToPrimitive,
{
let mut results = vec![];
for group in &self.groups {
results.push(group.var(ddof)?);
}
Ok(Series::from_vec(results))
}
}