rustalib/indicators/momentum/
roc.rs1use crate::util::dataframe_utils::check_window_size;
2use polars::prelude::*;
3
4pub fn calculate_roc(df: &DataFrame, window: usize, column: &str) -> PolarsResult<Series> {
17 check_window_size(df, window, "ROC")?;
18
19 let price = df.column(column)?.f64()?;
20 let prev_price = price.shift(window as i64);
21
22 let mut roc_values = Vec::with_capacity(df.height());
23
24 for i in 0..df.height() {
25 let current = price.get(i).unwrap_or(0.0);
26 let prev = prev_price.get(i).unwrap_or(0.0);
27
28 if prev != 0.0 {
29 let roc = ((current / prev) - 1.0) * 100.0;
30 roc_values.push(roc);
31 } else {
32 roc_values.push(f64::NAN);
33 }
34 }
35
36 Ok(Series::new("roc".into(), roc_values))
37}