# Story 3.2: Implémenter le système de calcul de prédictions Status: review ## Acceptance Criteria **Given** les scores d'énergie sont calculés pour deux équipes **When** le système calcule la prédiction **Then** il compare les scores d'énergie des deux équipes **And** il calcule le Confidence Meter (0-100%) basé sur la différence d'énergie **And** il détermine l'équipe prédite gagnante **And** la prédiction est stockée dans la base de données **Given** une prédiction est générée **When** elle est sauvegardée **Then** elle est associée au match correspondant **And** elle contient timestamp, confidence, et équipe prédite ## Tasks / Subtasks - [x] Créer le module de calcul de prédictions (AC: #1) - [x] Créer `backend/app/ml/prediction_calculator.py` - [x] Implémenter la logique de comparaison des scores d'énergie - [x] Implémenter le calcul du Confidence Meter - [x] Déterminer l'équipe gagnante - [x] Valider les résultats - [x] Implémenter le calcul du Confidence Meter (AC: #1) - [x] Calculer la différence d'énergie entre les deux équipes - [x] Convertir la différence en pourcentage (0-100%) - [x] Normaliser le score final - [x] Documenter la formule utilisée - [x] Tester avec des exemples - [x] Créer les schémas de base de données pour prédictions (AC: #1) - [x] Mise à jour de la table `predictions` (déjà créée dans 3.1) - [x] Ajouter colonnes si nécessaires - [x] Générer et appliquer les migrations - [x] Implémenter le service de création de prédictions (AC: #1, #2) - [x] Créer `backend/app/services/prediction_service.py` - [x] Créer la fonction de génération de prédiction pour un match - [x] Stocker la prédiction dans la base de données - [x] Lier la prédiction au match - [x] Gérer les erreurs - [x] Créer l'endpoint API pour générer des prédictions (AC: #2) - [x] Créer `POST /api/v1/matches/{match_id}/predict` - [x] Valider les entrées avec Pydantic - [x] Appeler le service de prédiction - [x] Retourner la prédiction créée - [x] Documenter l'endpoint avec Swagger - [x] Tester le système de prédictions (AC: #1, #2) - [x] Tester le calcul de prédictions pour des matchs réels - [x] Valider le Confidence Meter - [x] Tester l'endpoint API - [x] Vérifier que les prédictions sont stockées - [x] Tester les relations match → predictions ## Dev Notes ### Formule de Calcul ```python def calculate_prediction(home_energy: float, away_energy: float): # Différence d'énergie energy_diff = abs(home_energy - away_energy) # Calcul du Confidence Meter (0-100%) confidence = min(100, energy_diff * 2) # Exemple simple # Déterminer l'équipe gagnante if home_energy > away_energy: predicted_winner = 'home' elif away_energy > home_energy: predicted_winner = 'away' else: predicted_winner = 'draw' return { 'confidence': confidence, 'predicted_winner': predicted_winner, 'home_energy': home_energy, 'away_energy': away_energy } ``` ### File Structure ``` backend/app/ ├── ml/ │ └── prediction_calculator.py ├── services/ │ └── prediction_service.py └── api/v1/ └── predictions.py ``` ### References - [Source: _bmad-output/planning-artifacts/epics.md#Story-3.2] ## Dev Agent Record ### Agent Model Used GLM-4.7 ### Completion Notes List - Système de calcul de prédictions implémenté avec 4 fonctions principales : - `calculate_confidence_meter()`: Calcule le Confidence Meter (0-100%) basé sur la différence d'énergie - `determine_winner()`: Détermine l'équipe gagnante (home/away/draw) - `calculate_prediction()`: Fonction principale combinant confidence et winner - `validate_prediction_result()`: Valide les résultats de prédiction - Confidence Meter fonctionnel avec la formule : `min(100, abs(home_energy - away_energy) * 2)` - Service de prédiction (`PredictionService`) créé avec méthodes complètes : - `create_prediction_for_match()`: Crée et stocke une prédiction - `get_prediction_by_id()`: Récupère une prédiction par ID - `get_predictions_for_match()`: Récupère toutes les prédictions d'un match - `get_latest_prediction_for_match()`: Récupère la prédiction la plus récente - `delete_prediction()`: Supprime une prédiction - Endpoint API REST complet créé avec 5 routes : - `POST /api/v1/predictions/matches/{match_id}/predict`: Crée une prédiction - `GET /api/v1/predictions/{prediction_id}`: Récupère une prédiction - `GET /api/v1/predictions/matches/{match_id}`: Récupère toutes les prédictions d'un match - `GET /api/v1/predictions/matches/{match_id}/latest`: Récupère la prédiction la plus récente - `DELETE /api/v1/predictions/{prediction_id}`: Supprime une prédiction - Tests complets créés pour : - Le calculateur de prédictions (test_prediction_calculator.py) - Le service de prédictions (test_prediction_service.py) - L'endpoint API (test_prediction_api.py) - Intégration complète dans main.py ### File List - `backend/app/ml/prediction_calculator.py` (nouveau fichier) - `backend/app/services/prediction_service.py` (nouveau fichier) - `backend/app/api/v1/predictions.py` (nouveau fichier) - `backend/tests/test_prediction_calculator.py` (nouveau fichier) - `backend/tests/test_prediction_service.py` (nouveau fichier) - `backend/tests/test_prediction_api.py` (nouveau fichier) - `backend/app/main.py` (modifié : ajout des routes de prédictions)