perf: type static current rolling helpers

This commit is contained in:
boris
2026-09-05 02:42:47 +08:00
parent 1410aa588a
commit 75ab0c06c6
2 changed files with 126 additions and 26 deletions
+48 -25
View File
@@ -3454,31 +3454,13 @@ impl DataSet {
let field = normalized_field(field);
match field.as_ref() {
"close" | "prev_close" | "stock_close" | "price" => self
.adjusted_close_series_by_symbol_id(symbol_id)
.and_then(|series| {
series_end
.map(|end| series.moving_average_at_end(end, lookback))
.unwrap_or_else(|| series.current_moving_average(date, lookback))
}),
"volume" | "stock_volume" => {
self.market_series_by_symbol_id(symbol_id)
.and_then(|series| {
series_end
.map(|end| {
series
.valid_volume_window(end, lookback)
.map(|(start, end)| {
normalize_rolling_factor(
(series.valid_volume_sum_prefix[end]
- series.valid_volume_sum_prefix[start])
/ lookback as f64,
12,
)
})
})
.unwrap_or_else(|| series.current_volume_moving_average(date, lookback))
})
}
.market_current_close_moving_average_with_end_by_symbol_id(
date, symbol_id, lookback, series_end,
),
"volume" | "stock_volume" => self
.market_current_volume_moving_average_with_end_by_symbol_id(
date, symbol_id, lookback, series_end,
),
"day_open" | "dayopen" => {
self.market_series_by_symbol_id(symbol_id)
.and_then(|series| {
@@ -3514,6 +3496,47 @@ impl DataSet {
}
}
pub(crate) fn market_current_close_moving_average_with_end_by_symbol_id(
&self,
date: NaiveDate,
symbol_id: u32,
lookback: usize,
series_end: Option<usize>,
) -> Option<f64> {
self.adjusted_close_series_by_symbol_id(symbol_id)
.and_then(|series| {
series_end
.map(|end| series.moving_average_at_end(end, lookback))
.unwrap_or_else(|| series.current_moving_average(date, lookback))
})
}
pub(crate) fn market_current_volume_moving_average_with_end_by_symbol_id(
&self,
date: NaiveDate,
symbol_id: u32,
lookback: usize,
series_end: Option<usize>,
) -> Option<f64> {
self.market_series_by_symbol_id(symbol_id)
.and_then(|series| {
series_end
.map(|end| {
series
.valid_volume_window(end, lookback)
.map(|(start, end)| {
normalize_rolling_factor(
(series.valid_volume_sum_prefix[end]
- series.valid_volume_sum_prefix[start])
/ lookback as f64,
12,
)
})
})
.unwrap_or_else(|| series.current_volume_moving_average(date, lookback))
})
}
pub fn market_latest_back_adjusted_close(&self, date: NaiveDate, symbol: &str) -> Option<f64> {
self.adjusted_close_series(symbol)
.and_then(|series| series.latest_back_adjusted_close(date))