polars-ta 0.1.0

Polars Series interface for technical indicators — native Polars integration, aligned with ta-lib
Documentation
use polars_core::prelude::*;
use polars_ta_core::trend::bbands as bbands_core;

fn series_to_f64(s: &Series) -> PolarsResult<Vec<f64>> {
    Ok(s.cast(&DataType::Float64)?
        .f64()?
        .into_iter()
        .map(|v| v.unwrap_or(f64::NAN))
        .collect())
}

pub struct BbandsSeriesOutput {
    pub upper: Series,
    pub middle: Series,
    pub lower: Series,
}

pub fn bbands_series(
    close: &Series,
    period: usize,
    nbdevup: f64,
    nbdevdn: f64,
) -> PolarsResult<BbandsSeriesOutput> {
    let data = series_to_f64(close)?;
    let out = bbands_core(&data, period, nbdevup, nbdevdn);
    Ok(BbandsSeriesOutput {
        upper: Float64Chunked::from_vec("bb_upper".into(), out.upper).into_series(),
        middle: Float64Chunked::from_vec("bb_middle".into(), out.middle).into_series(),
        lower: Float64Chunked::from_vec("bb_lower".into(), out.lower).into_series(),
    })
}