(high: &[f64], low: &[f64], window: usize)
| 83 | } |
| 84 | |
| 85 | fn _get_beta(high: &[f64], low: &[f64], window: usize) -> Vec<f64> { |
| 86 | let mut ret_sq = vec![NAN; high.len()]; |
| 87 | for i in 0..high.len() { |
| 88 | if low[i] == 0.0 { |
| 89 | continue; |
| 90 | } |
| 91 | ret_sq[i] = (high[i] / low[i]).ln().powi(2); |
| 92 | } |
| 93 | // rolling sum over 2 |
| 94 | let mut two_sum = vec![NAN; ret_sq.len()]; |
| 95 | for i in 1..ret_sq.len() { |
| 96 | if ret_sq[i].is_nan() || ret_sq[i - 1].is_nan() { |
| 97 | continue; |
| 98 | } |
| 99 | two_sum[i] = ret_sq[i] + ret_sq[i - 1]; |
| 100 | } |
| 101 | // rolling mean over window |
| 102 | let mut beta = vec![NAN; ret_sq.len()]; |
| 103 | if window == 0 { |
| 104 | return beta; |
| 105 | } |
| 106 | for i in 0..two_sum.len() { |
| 107 | if i + 1 < window { |
| 108 | continue; |
| 109 | } |
| 110 | let start = i + 1 - window; |
| 111 | let slice = &two_sum[start..=i]; |
| 112 | if slice.iter().any(|v| v.is_nan()) { |
| 113 | continue; |
| 114 | } |
| 115 | let mean = slice.iter().sum::<f64>() / window as f64; |
| 116 | beta[i] = mean; |
| 117 | } |
| 118 | beta |
| 119 | } |
| 120 | |
| 121 | fn _get_gamma(high: &[f64], low: &[f64]) -> Vec<f64> { |
| 122 | let high_max = rolling_max(high, 2); |
no test coverage detected