Good good progress

This commit is contained in:
bolade
2025-11-21 14:15:29 +01:00
parent 4028b7c626
commit dbee12341a
7 changed files with 80 additions and 103 deletions
+21 -31
View File
@@ -804,42 +804,42 @@ class ContextGenerator:
)
zone_df = self.pnoe_df[mask]
# HR BPM Range - match notebook exactly
hr_bpm_str = f"{int(start)}-{int(end)} bpm"
if not zone_df.empty:
# Speed calculation
# Speed calculation - match notebook exactly
speed_series = zone_df[zone_df["Speed"] > 0.1]["Speed"]
if not speed_series.empty:
min_speed = speed_series.min()
max_speed = speed_series.max()
if abs(min_speed - max_speed) < 0.1:
speed_str = f"{min_speed:.1f}mph\n2% Incline"
speed_str = f"{min_speed:.1f} mph\n2% Incline"
else:
speed_str = f"{min_speed:.1f}-{max_speed:.1f}mph\n2% Incline"
speed_str = f"{min_speed:.1f}-{max_speed:.1f} mph\n2% Incline"
# Pace calculation (max speed -> min pace, min speed -> max pace)
min_pace_m, min_pace_s = speed_to_pace(max_speed)
max_pace_m, max_pace_s = speed_to_pace(min_speed)
if min_pace_m == max_pace_m and min_pace_s == max_pace_s:
pace_str = f"{min_pace_m}:{min_pace_s:02d}min/km Pace"
pace_str = f"{min_pace_m}:{min_pace_s:02d} min/km Pace"
else:
pace_str = (
f"{max_pace_m}:{max_pace_s:02d}-{min_pace_m}:{min_pace_s:02d}\n"
f"min/km Pace"
)
pace_str = f"{max_pace_m}:{max_pace_s:02d}-{min_pace_m}:{min_pace_s:02d}\nmin/km Pace"
else:
speed_str = "-\n2% Incline"
pace_str = "-"
# Calories (using raw EE)
# Calories (using raw EE) - match notebook exactly
avg_cals = zone_df["EE(kcal/min)"].mean()
calories_str = f"Avg:\n{avg_cals:.1f}kcals/minute"
calories_str = f"Avg:\n{avg_cals:.1f} kcals/minute"
# Carb utilization (g/min)
# Carb utilization (g/min) - match notebook exactly
avg_carbs_g = zone_df["CHO"].mean() / 4
carb_str = f"Avg: {avg_carbs_g:.1f}g/min\nCarb Utilization"
# Breathing
# Breathing - match notebook exactly
avg_breaths = zone_df["BF(bpm)_smoothed"].mean()
breath_str = (
f"Avg: {int(avg_breaths)} breaths\n{ideal_breath_ranges[i]}"
@@ -854,7 +854,7 @@ class ContextGenerator:
zone_data.append(
{
"zone_name": name,
"hr_bpm": f"{int(start)}-{int(end)}bpm",
"hr_bpm": hr_bpm_str,
"speed": speed_str,
"pace": pace_str,
"calories": calories_str,
@@ -1246,18 +1246,18 @@ class ContextGenerator:
hr_zones_columns = ["Zone 1", "Zone 2", "Zone 3", "Zone 4", "Zone 5"]
hr_zones_data = [
[
"Improves health and recovery capacity",
"Improves endurance and fat burning",
"Improves Aerobic fitness",
"Improves maximum performance capacity",
"Develops maximum performance and speed",
"Improves health and\nrecovery capacity",
"Improves endurance\nand fat burning",
"Improves Aerobic\nfitness",
"Improves maximum\nperformance capacity",
"Develops maximum\nperformance and speed",
],
[
"55-65% of Max Heart Rate",
"65-75% of Max Heart Rate",
"80-85% of Max Heart Rate",
"85-88% of Max Heart Rate",
"90% of Max Heart Rate",
"90%+ of Max Heart Rate",
],
[zone_metrics["zones"][i]["hr_bpm"] for i in range(5)],
[zone_metrics["zones"][i]["speed"] for i in range(5)],
@@ -1266,22 +1266,12 @@ class ContextGenerator:
[zone_metrics["zones"][i]["carb"] for i in range(5)],
[zone_metrics["zones"][i]["breathing"] for i in range(5)],
]
hr_zones_colors = [
["#ffffff"] * 5,
["#ffffff"] * 5,
["#ffcdd2", "#ffcdd2", "#fff9c4", "#c8e6c9", "#c8e6c9"],
["#ffffff"] * 5,
["#ffffff"] * 5,
["#ffffff"] * 5,
["#ffffff"] * 5,
["#ffcdd2", "#ffcdd2", "#fff9c4", "#c8e6c9", "#c8e6c9"],
]
# Colors are now handled directly in the graph generator to match notebook
# No need to pass cell_colors
contexts["page_8"]["hr_zones_table"] = (
graph_generator.generate_heart_rate_zones_table(
data=hr_zones_data,
columns=hr_zones_columns,
cell_colors=hr_zones_colors,
save_as_base64=True,
)
)