Application Streamlit de coaching personnalisé pour sports d'endurance avec adaptation dynamique basée sur les données physiologiques et les contraintes de vie.
Ce projet contient deux applications distinctes :
Application simple pour générer et ajouter automatiquement des séances d'entraînement dans Google Calendar en utilisant l'IA Mistral.
Utilisation :
streamlit run app.pyApplication complète avec interface multi-pages pour un coaching personnalisé avancé.
Utilisation :
streamlit run ui/Home.py- 🎯 Plan semi-marathon sub 1:45 (12 semaines, 4 séances/semaine)
- 📊 Calcul du score de récupération quotidien (sommeil, HRV, charge)
- 🧠 Adaptation intelligente : maintien, allégement, report ou annulation
- 📅 Intégration Google Calendar (détection créneaux libres)
- 🔗 Connexion Garmin Connect (sommeil, activités, métriques)
- 📈 Dashboard de progression
- 🍎 Intégration Apple Health
- 🌦️ Prise en compte météo
- 🤖 Machine Learning
- 🍽️ Recommandations nutritionnelles
Project/
├── models/ # Modèles de données (Pydantic)
│ ├── athlete.py # Profil athlète
│ ├── session.py # Séances d'entraînement
│ ├── metrics.py # Métriques quotidiennes
│ └── training_plan.py # Plan complet
├── core/ # Logique métier
│ ├── plan_generator.py # Génération plan sub 1:45
│ └── session_adapter.py # Adaptation intelligente
├── services/ # Intégrations API
│ ├── garmin_api.py
│ ├── calendar_service.py
│ └── weather_api.py
├── ui/ # Interface Streamlit
│ └── pages/
│ ├── 01_dashboard.py
│ ├── 02_plan.py
│ ├── 03_today.py
│ └── 04_settings.py
├── config/
│ └── settings.py # Configuration
└── app.py # Point d'entrée
- Python 3.10+
- Compte Garmin Connect
- Compte Google (pour Calendar API)
- Compte Mistral AI (pour génération IA)
cd Project
# Créer un environnement virtuel
python3 -m venv venv
source venv/bin/activate # macOS/Linux
# ou
venv\Scripts\activate # Windows
# Installer les dépendances
pip install -r requirements.txt- Aller sur Google Cloud Console
- Créer un nouveau projet
- Activer Google Calendar API
- Créer un Service Account :
- Aller dans "IAM & Admin" > "Service Accounts"
- Créer un compte de service
- Télécharger le fichier JSON des credentials
- Renommer le fichier en
service_account.jsonet le placer dans le dossierProject/ - Important : Partager votre Google Calendar avec l'email du service account (avec droits "Modifier les événements")
- Créer un compte sur Mistral AI
- Générer une clé API
- L'ajouter dans le fichier
.env
Génération rapide de plan d'entraînement avec IA :
streamlit run app.py- Choisir votre objectif (10km, Semi, Marathon)
- Définir le nombre de semaines
- Sélectionner vos jours et horaires préférés
- Cliquer sur "Générer le plan"
- Les séances sont automatiquement ajoutées dans Google Calendar
Interface complète multi-pages :
streamlit run ui/Home.pyNavigation :
- 🏠 Home : Vue d'ensemble et démarrage
- 📊 Dashboard : Statistiques et progression
- 📅 Plan : Visualisation du plan d'entraînement
- 🎯 Today : Recommandation du jour (analyse récupération + adaptation)
- ⚙️ Settings : Configuration profil et connexions API
Workflow typique :
- Page Settings : Créer votre profil (âge, poids, VMA, objectif)
- Page Plan : Générer votre plan personnalisé
- Page Today : Chaque jour, voir la recommandation adaptée
- Page Dashboard : Suivre votre progression
-
Page Dashboard : Vue d'ensemble
- Score de récupération du jour
- Progression hebdomadaire
- Statistiques générales
-
Page Today : Recommandation quotidienne
- Séance du jour
- Recommandation d'adaptation
- Justification (score, sommeil, charge)
score = 35% sommeil + 25% HRV + 20% charge + 10% FC repos + 10% ressenti
| Score | État | Action |
|---|---|---|
| 85-100 | Excellent | ✅ Maintenir séance |
| 70-84 | Bon | 👍 Maintenir + surveiller |
| 55-69 | Moyen | |
| 40-54 | Faible | 🔄 Remplacer par endurance |
| 0-39 | Très faible | 🛑 Repos complet |
- Sommeil : Durée, qualité, phases (Garmin)
- HRV : Variabilité fréquence cardiaque
- Charge : ACWR (Acute:Chronic Workload Ratio)
- FC repos : Par rapport à la baseline
- Calendrier : Disponibilité dans l'agenda
- Séquence : Enchaînement des séances intenses
- Objectif : Construire endurance
- Volume : 30-40 km/semaine
- Séances :
- 1x Sortie longue (60-75min)
- 1x Fartlek léger
- 2x Endurance fondamentale
- Objectif : VMA et allure semi
- Volume : 40-50 km/semaine
- Séances :
- 1x VMA (ex: 10x400m à 3:30/km)
- 1x Seuil (ex: 3x10min à 4:55/km)
- 1x Sortie longue progressive
- 1x Endurance active
- Objectif : Fraîcheur et affûtage
- Volume : -30 à -50%
- Séances : Volume réduit, intensité maintenue
| Zone | Allure | % FCmax | Usage |
|---|---|---|---|
| Récupération | 6:15-6:30 | 70-75% | Décrassage |
| Endurance | 6:00-6:15 | 75-80% | Base aérobie |
| Tempo | 5:15-5:25 | 80-87% | Allure marathon |
| Seuil | 4:55-5:00 | 87-92% | Allure semi |
| VMA | 3:30-3:40 | 95-100% | Intervalles |
from garminconnect import Garmin
client = Garmin(email, password)
client.login()
# Récupérer données
activities = client.get_activities(0, 10)
sleep = client.get_sleep_data(date)
stats = client.get_stats(date)Données disponibles :
- Activités (distance, allure, FC, cadence)
- Sommeil (durée, qualité, phases)
- Body Battery
- VO2 Max, VFC, FC repos
- Charge d'entraînement
from google.oauth2 import service_account
from googleapiclient.discovery import build
credentials = service_account.Credentials.from_service_account_file(
'service_account.json'
)
service = build('calendar', 'v3', credentials=credentials)
# Récupérer événements
events = service.events().list(
calendarId='primary',
timeMin=start,
timeMax=end
).execute()Bon entraînement ! 🏃♂️💨