import random from api.models.schemas import DiagnosisResultPerDisease, DiagnosisResponse # Interfacage du modèle de ML (Spark) avec l'API FastAPI. # Pour l'instant, on simule les prédictions avec des valeurs aléatoires. MOCK_CONDITIONS = [ "Malaria", "Typhoid Fever", "Influenza", "Dengue Fever", "Pneumonia", "Gastroenteritis", "Meningitis", "Cholera" ] def get_mock_diagnosis(symptoms: list[str], age: int, sex: str, medical_history: str, geolocation: str) -> DiagnosisResponse: """ Simule la prediction du modèle de ML en retournant 3 conditions médicales aléatoires avec des probabilités et une recommandation. Fonction reelle: model.predict_proba(encode_symptoms(symptoms)) """ # Choisir 3 conditions au hasard parmi la liste, avec des probabilités aléatoires selected = random.sample(MOCK_CONDITIONS, 3) # Genere les probabilités aléatoires et les normalise pour que la somme soit 1 raw = sorted([random.random() for _ in selected], reverse=True) total = sum(raw) probabilities = [round(p / total, 2) for p in raw] statistics = [ DiagnosisResultPerDisease( name=disease, probability=prob, level="level_high" if prob > 0.7 else "level_medium" if prob < 0.4 else "level_low", symptoms=symptoms ) for disease, prob in zip(selected, probabilities) ] return DiagnosisResponse( statistics=statistics, recommendation=_get_recommendation(statistics[0].level) ) def _get_recommendation(severity: str) -> str: return { "level_high": "Veuillez consulter un médecin immédiatement ou rendez-vous aux urgences.", "level_moderate": "Veuillez surveiller vos symptômes et consulter un médecin si ceux-ci s'aggravent.", "level_low": "Restez au repos et hydratez-vous. Consultez un médecin si les symptômes persistent." }.get(severity, "Consultez un professionnel de santé.") # === Chargeur de modèle réel (a implémenter plus tard) === # import pickle # # _model = None # # def load_model(): # global _model # with open("saved_models/spark_model.pkl", "rb") as f: # _model = pickle.load(f) # # def encode_symptoms(symptoms: list[str]) -> list[int]: # # Convertit la liste de symptômes en un vecteur binaire pour le modèle ML. # ALL_SYMPTOMS = [...] # full list from your dataset # return [1 if s in symptoms else 0 for s in ALL_SYMPTOMS] # # def get_real_diagnosis(symptoms: list[str]) -> DiagnosisResponse: # vector = encode_symptoms(symptoms) # probas = _model.predict_proba([vector])[0] # classes = _model.classes_ # ...