added sync and backup
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -4,7 +4,7 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# 02 \u2014 Running\n",
|
||||
"# 02 — Running\n",
|
||||
"\n",
|
||||
"Volume, pace, HR efficiency, training load."
|
||||
]
|
||||
@@ -34,7 +34,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -71,7 +71,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -94,7 +94,7 @@
|
||||
" ax.scatter(g['avg_hr'], g['pace_min_per_km'], s=g['distance_km'] * 6, alpha=0.5, label=str(yr))\n",
|
||||
"ax.invert_yaxis() # faster pace = smaller number, want top\n",
|
||||
"ax.set_xlabel('Avg HR (bpm)')\n",
|
||||
"ax.set_ylabel('Pace (min/km, faster \u2191)')\n",
|
||||
"ax.set_ylabel('Pace (min/km, faster ↑)')\n",
|
||||
"ax.set_title('Pace vs. HR by run, sized by distance')\n",
|
||||
"ax.legend(title='Year')\n",
|
||||
"ax.grid(alpha=0.3)\n",
|
||||
@@ -111,7 +111,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -138,10 +138,10 @@
|
||||
"monthly_easy = easy.set_index('start_time_local')['pace_min_per_km'].resample('ME').median()\n",
|
||||
"\n",
|
||||
"fig, ax = plt.subplots(figsize=(13, 4))\n",
|
||||
"ax.scatter(easy['start_time_local'], easy['pace_min_per_km'], alpha=0.3, s=easy['distance_km']*5, label='runs (HR<150, \u22653km)')\n",
|
||||
"ax.scatter(easy['start_time_local'], easy['pace_min_per_km'], alpha=0.3, s=easy['distance_km']*5, label='runs (HR<150, ≥3km)')\n",
|
||||
"monthly_easy.plot(ax=ax, color='C3', lw=2, marker='o', label='Monthly median')\n",
|
||||
"ax.invert_yaxis()\n",
|
||||
"ax.set_ylabel('Pace (min/km, faster \u2191)')\n",
|
||||
"ax.set_ylabel('Pace (min/km, faster ↑)')\n",
|
||||
"ax.set_title('Easy-pace trend (proxy for aerobic fitness)')\n",
|
||||
"ax.legend()\n",
|
||||
"ax.grid(alpha=0.3)\n",
|
||||
@@ -151,7 +151,28 @@
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": "## Training load \u2014 Banister CTL / ATL / TSB\n\nGarmin reports a per-activity training load. The standard endurance-training lens (TrainingPeaks \"Performance Management Chart\") tracks three derived numbers:\n\n- **CTL** *Chronic Training Load* \u2014 EWMA of daily load with \u03c4 = 42 days. **Fitness.**\n- **ATL** *Acute Training Load* \u2014 same EWMA with \u03c4 = 7 days. **Fatigue.**\n- **TSB** *Training Stress Balance* \u2014 yesterday's CTL minus yesterday's ATL. **Form.**\n\nTSB interpretation:\n\n| TSB | meaning |\n|---|---|\n| < \u221230 | severely fatigued (injury risk) |\n| \u221210 to \u221230 | productive overload \u2014 heart of a build |\n| \u221210 to 0 | balanced building |\n| 0 to +10 | sharpening |\n| **+10 to +25** | **fresh / peaked \u2014 race-day target** |\n| > +25 | detrained (taper too long) |\n\nThis replaces the older 7/28-day rolling ACWR plot \u2014 same data, EWMAs are smoother and TSB gives you race-day-readiness directly."
|
||||
"source": [
|
||||
"## Training load — Banister CTL / ATL / TSB\n",
|
||||
"\n",
|
||||
"Garmin reports a per-activity training load. The standard endurance-training lens (TrainingPeaks \"Performance Management Chart\") tracks three derived numbers:\n",
|
||||
"\n",
|
||||
"- **CTL** *Chronic Training Load* — EWMA of daily load with τ = 42 days. **Fitness.**\n",
|
||||
"- **ATL** *Acute Training Load* — same EWMA with τ = 7 days. **Fatigue.**\n",
|
||||
"- **TSB** *Training Stress Balance* — yesterday's CTL minus yesterday's ATL. **Form.**\n",
|
||||
"\n",
|
||||
"TSB interpretation:\n",
|
||||
"\n",
|
||||
"| TSB | meaning |\n",
|
||||
"|---|---|\n",
|
||||
"| < −30 | severely fatigued (injury risk) |\n",
|
||||
"| −10 to −30 | productive overload — heart of a build |\n",
|
||||
"| −10 to 0 | balanced building |\n",
|
||||
"| 0 to +10 | sharpening |\n",
|
||||
"| **+10 to +25** | **fresh / peaked — race-day target** |\n",
|
||||
"| > +25 | detrained (taper too long) |\n",
|
||||
"\n",
|
||||
"This replaces the older 7/28-day rolling ACWR plot — same data, EWMAs are smoother and TSB gives you race-day-readiness directly."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
@@ -172,14 +193,14 @@
|
||||
"ax1.set_ylabel('training load')\n",
|
||||
"ax1.legend(loc='upper left')\n",
|
||||
"ax1.grid(alpha=0.3)\n",
|
||||
"ax1.set_title('Performance Management Chart \u2014 CTL / ATL / TSB')\n",
|
||||
"ax1.set_title('Performance Management Chart — CTL / ATL / TSB')\n",
|
||||
"\n",
|
||||
"# bottom panel: form\n",
|
||||
"ax2.plot(pmc.index, pmc['TSB'], color='#264653', lw=1.5)\n",
|
||||
"ax2.axhspan(10, 25, color='#2a9d8f', alpha=0.12, label='race-ready (+10 to +25)')\n",
|
||||
"ax2.axhspan(-30, -10, color='#e9c46a', alpha=0.12, label='productive overload (\u221230 to \u221210)')\n",
|
||||
"ax2.axhspan(-30, -10, color='#e9c46a', alpha=0.12, label='productive overload (−30 to −10)')\n",
|
||||
"ax2.axhline(0, color='gray', lw=0.6)\n",
|
||||
"ax2.axhline(-30, color='#e76f51', ls='--', lw=0.8, label='injury-risk floor (\u221230)')\n",
|
||||
"ax2.axhline(-30, color='#e76f51', ls='--', lw=0.8, label='injury-risk floor (−30)')\n",
|
||||
"ax2.set_ylabel('TSB (form)')\n",
|
||||
"ax2.legend(loc='lower left', fontsize=9)\n",
|
||||
"ax2.grid(alpha=0.3)\n",
|
||||
@@ -204,7 +225,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -347,4 +368,4 @@
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user