From b4d42c1dda303691971fd10f21a15ba67b5e2e40 Mon Sep 17 00:00:00 2001 From: Palash Tyagi <23239946+Magnus167@users.noreply.github.com> Date: Sat, 12 Apr 2025 22:06:44 +0100 Subject: [PATCH] add BSeries struct and conversion implementations for FSeries and ISeries --- src/core/xseries.rs | 60 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/core/xseries.rs b/src/core/xseries.rs index d655900..c1cffa4 100644 --- a/src/core/xseries.rs +++ b/src/core/xseries.rs @@ -161,3 +161,63 @@ impl_iseries_scalar_op!(Add, add, +); impl_iseries_scalar_op!(Sub, sub, -); impl_iseries_scalar_op!(Mul, mul, *); impl_iseries_scalar_op!(Div, div, /); // floor/trunc division by scalar + +/// A boolean series: BSeries +/// +#[derive(Debug, Clone)] +pub struct BSeries { + data: Vec, +} + +impl BSeries { + pub fn new(data: Vec) -> Self { + Self { data } + } + + pub fn len(&self) -> usize { + self.data.len() + } + + pub fn data(&self) -> &[bool] { + &self.data + } +} + +/// Convert an FSeries to ISeries by truncation (floor cast). +impl From for ISeries { + fn from(fseries: FSeries) -> Self { + let data = fseries + .data + .into_iter() + .map(|val| val as i64) // trunc cast + .collect(); + ISeries::new(data) + } +} + +/// Implement conversion from ISeries to FSeries by casting to f64. +impl From for FSeries { + fn from(iseries: ISeries) -> Self { + let data = iseries.data.into_iter().map(|val| val as f64).collect(); + FSeries::new(data) + } +} + +/// Convert an ISeries to BSeries by checking if each value is non-zero. +impl From for BSeries { + fn from(iseries: ISeries) -> Self { + let data = iseries.data.into_iter().map(|val| val != 0).collect(); + BSeries::new(data) + } +} + +impl From for ISeries { + fn from(bseries: BSeries) -> Self { + let data = bseries + .data + .into_iter() + .map(|val| if val { 1 } else { 0 }) + .collect(); + ISeries::new(data) + } +}