Simplify forecast panel and extend horizon

This commit is contained in:
Peter Stockings
2026-09-06 14:50:51 +10:00
parent d26da9a066
commit 0dea94fec0
5 changed files with 25 additions and 31 deletions
+4 -1
View File
@@ -29,7 +29,7 @@ def convert_str_to_date(date_str, format='%Y-%m-%d'):
def build_forecast(values, dates, horizon_weeks=8, metric='E1RM'):
"""Build a conservative linear forecast from dated exercise observations."""
try:
horizon_weeks = max(4, min(int(horizon_weeks), 26))
horizon_weeks = max(4, min(int(horizon_weeks), 52))
except (TypeError, ValueError):
horizon_weeks = 8
@@ -133,6 +133,7 @@ def build_forecast(values, dates, horizon_weeks=8, metric='E1RM'):
'last_date': last_date,
'last_value': round(float(observed_values[-1]), 1),
'projected_value': round(float(future_values[-1]), 1),
'projected_change': round(float(future_values[-1] - observed_values[-1]), 1),
'weekly_change': round(weekly_change, 1),
'r_squared': None if r_squared is None else round(r_squared, 2),
'confidence': confidence,
@@ -249,6 +250,7 @@ def get_exercise_graph_model(title, estimated_1rm, repetitions, weight, start_da
observed_min_date, observed_max_date = min(start_dates), max(start_dates)
forecast = build_forecast(estimated_1rm, start_dates, forecast_weeks, metric='E1RM') if forecast_enabled else {'available': False}
forecast = add_top_set_forecast(forecast, weight, repetitions, forecast_target_reps)
forecast_horizons = [(4, '4w'), (8, '8w'), (12, '3m'), (26, '6m'), (52, '1y')]
chart_max_date = forecast.get('end_date', observed_max_date) if forecast.get('available') else observed_max_date
total_span = (chart_max_date - observed_min_date).days or 1
@@ -398,6 +400,7 @@ def get_exercise_graph_model(title, estimated_1rm, repetitions, weight, start_da
'forecast_enabled': forecast_enabled,
'forecast_weeks': forecast_weeks,
'forecast_target_reps': forecast.get('selected_reps', forecast_target_reps or 5),
'forecast_horizons': forecast_horizons,
'forecast_points': forecast_points,
'forecast_band_lower': forecast_band_lower,
'forecast_band_upper': forecast_band_upper,