use crate::optimized::OptimizedDataFrame;
use crate::error::Result;
pub trait Transformer {
fn transform(&self, df: &OptimizedDataFrame) -> Result<OptimizedDataFrame>;
fn fit_transform(&mut self, df: &OptimizedDataFrame) -> Result<OptimizedDataFrame>;
fn fit(&mut self, df: &OptimizedDataFrame) -> Result<()>;
}
pub struct Pipeline {
transformers: Vec<Box<dyn Transformer>>,
}
impl Pipeline {
pub fn new() -> Self {
Pipeline {
transformers: Vec::new(),
}
}
pub fn add_transformer<T: Transformer + 'static>(&mut self, transformer: T) -> &mut Self {
self.transformers.push(Box::new(transformer));
self
}
pub fn transform(&self, df: &OptimizedDataFrame) -> Result<OptimizedDataFrame> {
let mut result = df.clone();
for transformer in &self.transformers {
result = transformer.transform(&result)?;
}
Ok(result)
}
pub fn fit_transform(&mut self, df: &OptimizedDataFrame) -> Result<OptimizedDataFrame> {
let mut result = df.clone();
for transformer in &mut self.transformers {
result = transformer.fit_transform(&result)?;
}
Ok(result)
}
pub fn fit(&mut self, df: &OptimizedDataFrame) -> Result<()> {
let mut temp_df = df.clone();
for transformer in &mut self.transformers {
transformer.fit(&temp_df)?;
temp_df = transformer.transform(&temp_df)?;
}
Ok(())
}
}
impl Default for Pipeline {
fn default() -> Self {
Self::new()
}
}