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::oscillator::stoch as stoch_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 StochSeriesOutput {
    pub slowk: Series,
    pub slowd: Series,
}

pub fn stoch_series(
    high: &Series,
    low: &Series,
    close: &Series,
    fastk_period: usize,
    slowk_period: usize,
    slowd_period: usize,
) -> PolarsResult<StochSeriesOutput> {
    let h = series_to_f64(high)?;
    let l = series_to_f64(low)?;
    let c = series_to_f64(close)?;
    let out = stoch_core(&h, &l, &c, fastk_period, slowk_period, slowd_period);
    Ok(StochSeriesOutput {
        slowk: Float64Chunked::from_vec("stoch_slowk".into(), out.slowk).into_series(),
        slowd: Float64Chunked::from_vec("stoch_slowd".into(), out.slowd).into_series(),
    })
}