>>> print("cours + TD + TP réunis, et le code s'exécute ici")
Chaque bloc de code noir est modifiable : clique sur ▶ Exécuter pour lancer du vrai Python 3.12 dans ton navigateur (rien à installer). Le premier lancement télécharge Python (~15 Mo) ; NumPy et pandas se chargent seulement quand un bloc les importe. Les variables restent en mémoire d'un bloc à l'autre, comme dans un notebook Jupyter/Colab.
| Bloc | Contenu | Supports du cours |
|---|---|---|
| 1. e-Santé | e-Health, DMI/DMP, interopérabilité, cybersécurité, cloud, Big Data, IA, blockchain, télémédecine | Cours 1 (Pr. El Handri), « Suite info » |
| 2. Bases Python | print/input, variables, types, opérateurs, conditions, boucles, fonctions, try/except, regex | python part 1, Python.pdf, Python Programming, CODE PYTHON, TP0, TP1 |
| 3. Collections | str, list, tuple, set, dict, fichiers | python part 1, Notions (set/try/regex) |
| 4. POO | classe, objet, __init__, self, héritage, polymorphisme, encapsulation | Programmation Orientée Objet, td poo, exercices Étudiants/Employés |
| 5. NumPy & matrices | ndarray, slicing, linalg (det, inv, solve, rang), mineurs/cofacteurs | BIBLIOTHÈQUE NUMPY, TD numpy, TP2-TP3, TD matrices 1-4, TD 6 |
| 6. Pandas & EDA | Series/DataFrame, loc/iloc, filtres, groupby, NaN, merge, cut | partie pandas, TD Titanic, mini-projet Netflix, TP people.tsv |
Clique sur un bloc (ou une pastille) : le panneau donne l'essentiel, les mots-clés et les TD/TP correspondants.
Ce bloc tombe surtout en QCM et en questions de définition. Ce qu'il faut retenir : les définitions (e-Health, m-Health, DMP…), les normes d'interopérabilité, le cadre légal, le modèle NIST du cloud et les 3V du Big Data.
Passer un support papier → fichier (scanner une ordonnance). Le processus ne change pas.
Utiliser le numérique pour refaire un processus (l'ordonnance est créée, envoyée et lue électroniquement).
La transformation digitale va plus loin : elle change l'organisation entière (nouveaux métiers, décisions guidées par les données, télé-pharmacie). Le cours parle aussi des « ères » 1.0 → 4.0 : informatisation administrative → dossiers numériques → connectivité/Internet → IA, IoT, Big Data.
| Sigle | Signification | À retenir |
|---|---|---|
| DMI / DPI | Dossier Médical (Patient) Informatisé | Dossier tenu par un établissement (hôpital, clinique) |
| DMP | Dossier Médical Partagé | Dossier partagé entre professionnels et établissements, suit le patient |
| DPU | Dossier Patient Unique | Un seul dossier par patient au sein d'un réseau de soins |
| DP | Dossier Pharmaceutique | Historique des médicaments délivrés (en France : 4 mois) consulté à chaque dispensation → interactions, doublons, abus |
| PACS | Picture Archiving and Communication System | Archivage et transmission des images médicales (radio, scanner, IRM, écho) |
| SIH | Système d'Information Hospitalier | L'ensemble des logiciels de l'hôpital (admissions, DPI, pharmacie, labo…) |
Deux logiciels de santé ne peuvent échanger des données que s'ils partagent un format (comment on transporte) et une terminologie (comment on nomme).
| Norme | Type | Sert à… |
|---|---|---|
| HL7 | Messagerie / format d'échange | Échanger des messages entre logiciels hospitaliers (admission, résultats…) |
| FHIR | Standard HL7 moderne (web, API) | Échanger des « ressources » (Patient, Medication…) via Internet, format JSON/XML |
| SNOMED CT | Terminologie clinique | Coder les diagnostics, symptômes, actes de façon universelle |
| LOINC | Terminologie biologique | Coder les analyses de laboratoire et observations |
Projet de DMP national, hôpital Cheikh Khalifa (dossier informatisé), téléconsultation Tbib24, robotisation de la pharmacie du CHU Ibn Sina (2022).
SNDS (Système National des Données de Santé), Health Data Hub, DMP et Dossier Pharmaceutique.
EHR (Electronic Health Record) aux USA, plateformes cloud (AWS, Google Cloud, IBM Watson Health).
Le cloud, c'est utiliser des ressources informatiques (stockage, calcul, logiciels) à distance, à la demande, comme on consomme l'électricité du réseau au lieu d'avoir son propre générateur (analogie du cours). Le cloud commercial naît avec Amazon Web Services en 2006.
| Le NIST définit… | Contenu |
|---|---|
| 5 caractéristiques | Libre-service à la demande · accès réseau large · mutualisation des ressources · élasticité rapide · service mesuré (on paie ce qu'on consomme) |
| 3 modèles de service | IaaS (infrastructure : serveurs, stockage) · PaaS (plateforme pour développer) · SaaS (logiciel prêt à l'emploi, ex. Gmail, un LGP en ligne) |
| 4 modèles de déploiement | Public · privé · communautaire · hybride |
Volume (quantité énorme), Variété (textes, images, signaux, génome), Vélocité (flux en temps réel). Le cloud fournit l'infrastructure ; le Big Data, c'est l'analyse de ces masses de données (épidémiologie, pharmacovigilance, données de vie réelle).
Glucomètres en continu, tensiomètres, oxymètres, montres → télésurveillance à domicile, alertes précoces, moins d'hospitalisations.
Systèmes qui apprennent à partir de données pour reconnaître, prédire ou décider. En santé : lecture d'images par réseaux de neurones convolutifs (CNN), dépistage du cancer du sein (ex. BreastAI), rétinopathie diabétique, prévision des stocks.
Registre décentralisé et immuable : traçabilité du médicament (lutte contre la contrefaçon), consentement, essais cliniques.
Tout le code est traduit en langage machine avant l'exécution → fichier exécutable, très rapide (C, C++, Rust, Go).
Le code est lu et exécuté au fur et à mesure par un interpréteur → souple, facile à tester (Python, JavaScript).
Python est en fait hybride : le code est d'abord compilé en bytecode (.pyc), puis ce bytecode est interprété par la machine virtuelle Python (PVM). Environnements vus en TP : Anaconda + Spyder (TP0) et Google Colab (notebook en ligne).
print(v1, v2, sep=" ", end="\n") affiche ; input("message") lit une saisie et renvoie toujours une chaîne (str). Pour calculer, on convertit : int() ou float(). Ici, les valeurs tapées au clavier se mettent dans la zone jaune Entrées, une par ligne.
Pas de déclaration : la variable est créée à la première affectation et son type est déduit de la valeur (typage dynamique). Un nom commence par une lettre ou _, ne contient que lettres, chiffres et _, et distingue majuscules et minuscules.
| Type | Exemple | Description |
|---|---|---|
str | "Amoxicilline" | Texte, non modifiable (immuable) |
int | 500 | Entier positif ou négatif |
float | 12.5 | Nombre décimal (à virgule flottante) |
complex | 2 + 3j | Nombre complexe |
bool | True | Vrai / Faux, résultat d'une comparaison |
list | [1, 2, 2] | Ordonnée, modifiable, doublons permis |
tuple | (1, 2) | Ordonné, non modifiable |
range | range(2, 10, 2) | Suite d'entiers générée à la demande (fin exclue) |
set | {1, 2} | Non ordonné, sans doublons, pas d'index |
dict | {"nom": "Ali"} | Paires clé → valeur, modifiable, clés uniques |
frozenset | frozenset([1, 2]) | Set non modifiable |
bytes / bytearray / memoryview | bytearray([65, 66]) | Octets (0-255) ; bytearray modifiable ; memoryview = vue sans copie |
float = nombres décimaux.if ou une boucle for reste accessible après.| Opérateur | Exemple | Résultat |
|---|---|---|
/ division | 10 / 2 | 5.0 (toujours un float) |
// division entière | 10 // 3 | 3 |
% modulo (reste) | 10 % 3 | 1 |
** puissance | 2 ** 3 | 8 |
+= affectation | x = 5; x += 2 | 7 |
== / != | 3 == 3.0 | True |
and / or / not | not (5 > 2 and 1 > 3) | True |
in appartenance | "para" in "paracétamol" | True |
is identité | [1] is [1] | False (deux objets distincts, même si ==) |
& | ^ bit à bit | 6 & 3 | 2 (110 ET 011 = 010) |
Le bloc est défini par l'indentation (4 espaces) après les deux-points. Python teste les conditions dans l'ordre et s'arrête à la première vraie.
Astuce : tester d'abord le cas invalide évite d'écrire 16 <= note <= 20 partout. Change la valeur dans « Entrées » (25, 9.5, 12…) et relance.
Parcourt une séquence (liste, chaîne, range, dict…). range(2, 30, 3) → 2, 5, 8… (30 exclu).
Répète tant que la condition est vraie. Penser à faire évoluer la variable, sinon boucle infinie (bouton ■ Stop).
break sort de la boucle ; continue passe directement au tour suivant.
Exécuté quand la boucle se termine normalement (pas exécuté si on sort par break).
def nom(paramètres): définit un bloc réutilisable ; return renvoie un résultat (sans return, la fonction renvoie None). Paramètres par défaut, arguments nommés, et lambda pour une petite fonction anonyme d'une ligne.
re.split(motif, texte) découpe ; re.sub(motif, remplacement, texte) remplace ; re.findall extrait tout ce qui correspond. Motifs utiles : \d chiffre, \d+ un ou plusieurs chiffres, \s espace, [,;] l'un des caractères.
list [ ] | tuple ( ) | set { } | dict {k: v} | |
|---|---|---|---|---|
| Ordonné / index | Oui, l[0] | Oui, t[0] | Non, pas d'index | Accès par clé d["k"] ; ordre d'insertion conservé |
| Modifiable | Oui | Non | On ajoute/retire, on ne modifie pas un élément | Oui |
| Doublons | Permis | Permis | Interdits (supprimés) | Clés uniques |
| Ajouter | append, insert, extend | Impossible (passer par list()) | add, update | d["new"] = v, update |
| Retirer | remove(val), pop(i), del l[i] | del t (tout le tuple) | remove (erreur si absent), discard (pas d'erreur), pop | pop(k), del d[k], clear() |
set.pop() supprime le dernier élément » → un set n'a pas d'ordre : pop() retire un élément arbitraire.dict conserve l'ordre d'insertion (mais on y accède toujours par clé, pas par position).list(mon_tuple) qui convertit en liste ; tuple(...) fait l'inverse.re est utilisé sans import re.with open("notes.txt", "r") as f: ouvre et ferme automatiquement le fichier. Modes : "r" lire, "w" écrire (écrase), "a" ajouter. Un fichier notes.txt d'exemple existe dans le dossier de travail de ce site.
Le plan, le moule : un nouveau type. Nom en PascalCase : class Medicament:
Un exemplaire concret, avec sa propre identité et son propre état : m = Medicament("Doliprane", 1000)
__init__, puis renvoie la référence.__init__ (constructeur) initialise les attributs. Un objet ne doit jamais naître dans un état invalide → on valide dans __init__.self = l'objet courant. m.afficher() équivaut à Medicament.afficher(m).__str__ définit ce qu'affiche print(objet) (sinon <__main__.X object at 0x…>).class Enfant(Parent): récupère attributs et méthodes. Dans __init__, appeler super().__init__(...).
(override) La classe fille réécrit une méthode du parent, sous le même nom.
Un même appel (e.calculer_salaire()) donne un comportement différent selon le type réel de l'objet. Le duck typing permet même cela sans héritage.
| Écriture | Convention | Accès depuis l'extérieur |
|---|---|---|
self.nom | public | libre |
self._nom | protégé (convention) | possible, mais « ne pas toucher » |
self.__nom | privé | name mangling : renommé _Classe__nom → obj.__nom lève une AttributeError |
On contrôle l'accès par des getters/setters, en Python de préférence avec @property (lecture) et @x.setter (écriture validée).
NumPy (Numerical Python) fournit l'objet ndarray : un tableau à N dimensions, de type homogène, beaucoup plus rapide qu'une liste, avec les opérations élément par élément et l'algèbre linéaire (np.linalg). On l'importe par convention avec import numpy as np.
| Tableau | .ndim | .shape | Lecture |
|---|---|---|---|
np.array(46) | 0 | () | Scalaire : pas de ligne ni de colonne |
np.array([1,2,3]) | 1 | (3,) | Vecteur de 3 éléments |
np.array([[1,2,3],[4,5,6]]) | 2 | (2, 3) | Matrice 2 lignes × 3 colonnes (toujours lignes, colonnes) |
| 2 matrices 2×3 empilées | 3 | (2, 2, 3) | 2 matrices de 2 lignes et 3 colonnes |
| Fonction | Rôle |
|---|---|
np.linalg.det(A) | Déterminant (renvoie un float : 9.999999 au lieu de 10 → arrondir) |
np.linalg.inv(A) | Inverse (LinAlgError si det = 0 : matrice singulière) |
np.linalg.solve(A, Y) | Résout le système AX = Y (plus précis que inv(A) @ Y) |
np.linalg.matrix_rank(A) | Rang = nombre de lignes (ou colonnes) linéairement indépendantes |
np.linalg.eig(A) / eigvals | Valeurs (et vecteurs) propres |
np.linalg.norm(v) | Norme (longueur) d'un vecteur ou d'une matrice |
np.delete(A, i, axis=0) | Supprime la ligne i (axis=1 : la colonne) → sert à calculer les mineurs |
np.concatanate(A, B) → orthographe et syntaxe correctes : np.concatenate((A, B)) (un seul argument : un tuple de tableaux).LinAlgError: Singular matrix. La question « A = DU » n'a pas de solution générale ; la décomposition classique est A = LU (L triangulaire inférieure, U supérieure).Une colonne : valeurs + index. pd.Series([12, 15], index=["Ali", "Sara"])
Un tableau de plusieurs Series partageant le même index. Se crée depuis un dict ou un fichier : pd.read_csv()
Le fichier titanic.csv (891 passagers, Kaggle) est disponible ici. Ses colonnes commencent par une majuscule (Survived, Pclass, Sex, Age…) ; le TD les écrit en minuscules, donc on les renomme dès le chargement.
| Écriture | Sélectionne… |
|---|---|
df["age"] | Une colonne (Series) |
df[["name", "age"]] | Plusieurs colonnes (DataFrame) : double crochet |
df.loc[5, "name"] | Par étiquette (index 5, colonne name) ; borne de fin incluse dans loc[0:3] |
df.iloc[5, 3] | Par position (6e ligne, 4e colonne) ; fin exclue dans iloc[0:3] |
df[(df.sex == "female") & (df.age < 18)] | Filtre booléen : & (et), | (ou), ~ (non), parenthèses obligatoires |
df.loc[df.age > 60, ["name", "pclass"]] | Filtre + choix de colonnes en une seule fois |
isnull()/isna() détecte les NaNdropna() supprime, fillna(v) remplacedrop_duplicates(), astype("category")rename(columns={...}), replace()map() sur une Series (dict ou fonction)apply() ligne par ligne ou colonne par colonne.str.split / .str.strip / .str.extractpd.to_datetime(), .dt.yearpd.concat([a, b]) empilepd.merge(a, b, on="cle", how="left") joint comme en SQLa.join(b) joint sur l'indexgroupby().agg(), pivot_table()unstack(), set_index([...]) (MultiIndex)explode() une ligne par élément d'une listepd.isull() → c'est pd.isnull() (ou pd.isna()).applymap() est dépréciée depuis pandas 2.1 : on écrit maintenant df.map(fonction) pour appliquer une fonction à chaque case.Essaie d'abord seul : vide le bloc, écris ta version, exécute. La correction proposée n'est qu'une solution possible.
| Exercice | Résultat | À retenir |
|---|---|---|
| 1 | det B = 1×4 − 2×3 = −2 ; après échange des lignes : +2 | Échanger deux lignes change le signe |
| 2 | det = 0 | L3 − L2 = L2 − L1 : lignes liées → matrice non inversible |
| 3 | det [[3, 1], [2, 4]] = 10 | |det| = aire du parallélogramme construit sur u et v |
| 4 | det M = −4 | |det| = 4 = volume du parallélépipède ; ≠ 0 → vecteurs indépendants |
| 5 | det B = 1 → ×3 ligne : 3 ; échange : −1 ; L3 + 2L1 : 1 | Multiplier une ligne par k multiplie det par k ; ajouter un multiple d'une ligne ne change rien |
| 6-8 | M₁₁ = 13, M₂₃ = 10, M₃₂ = −8 ; C₁₁ = 13, C₂₃ = −10, C₃₂ = 8 | Cofacteurs : [[13, −12, 20], [−4, 6, −10], [−7, 8, −10]], det A = 10 |
| 9 | Cofacteurs de C : [[8, −1, −6], [4, 8, −3], [−1, −2, 5]], det = 17 | Comatrice = transposée : [[8, 4, −1], [−1, 8, −2], [−6, −3, 5]] |
| 10 | C₁₁ = 28, C₂₂ = 14, C₃₃ = 8, C₁₂ = 0, C₂₃ = 0 | Matrice triangulaire : det = produit de la diagonale = 56 |
| 11 | C₁₂ = 5, C₂₁ = 0, C₂₃ = 0, C₃₂ = −2, det E = −9 | Développer selon la ligne/colonne qui contient le plus de zéros (ici la colonne 2) |
Ex. 1 : det B = 10 ; cofacteurs de la 1re ligne : −3, −1, −1, 5 (vérifie : 2(−3) + 1(−1) + 3(−1) + 4(5) = 10 ✔). Ex. 2 : det C = −21 ≠ 0, donc C est inversible. Ex. 3 : mineur (L1, L3 ; C2, C4) = 1 ; mineur (L1, L2, L4 ; C1, C2, C3) = −12 ; mineur principal d'ordre 3 = 30.
Idée : on cherche les coefficients x₁…xₙ. Pour chaque élément (Ca, C, O, H, Cl…), le nombre d'atomes à gauche = à droite → une équation linéaire homogène. Ex. CaCO₃ + HCl → CaCl₂ + H₂O + CO₂ : Ca : x₁ = x₃ ; C : x₁ = x₅ ; O : 3x₁ = x₄ + 2x₅ ; H : x₂ = 2x₄ ; Cl : x₂ = 2x₃. En fixant x₁ = 1 : CaCO₃ + 2 HCl → CaCl₂ + H₂O + CO₂.
Méthode : une inconnue par solution (ou médicament), une équation par substance. Les colonnes de la matrice sont les solutions, les lignes les substances : np.linalg.solve(A, cible).
Les tarifs de dépassement ne sont pas donnés dans l'énoncé : ceux-ci sont des exemples pour illustrer la redéfinition de facture().
Le fichier Kaggle n'a pas de doublons complets ; deux passagers n'ont pas de port d'embarquement → 889 lignes après nettoyage.
Le vrai people.tsv n'était pas fourni : le site utilise un fichier d'exemple aux valeurs fictives (mêmes colonnes : name, sex, size, age). Les réponses dépendront des données réelles le jour de l'examen ; c'est la méthode qui compte.
Le fichier netflix_titles.csv (8 800 lignes) n'est pas fourni : voici les instructions clés du projet appliquées à un échantillon de 8 lignes inventées au même format. Le même code fonctionne sur le vrai fichier dans Colab.
Les graphiques (matplotlib/seaborn) demandés aux étapes 6 et 12 ne sont pas disponibles dans cet exécuteur : fais-les dans Colab.
notes.txt n'est pas donné ; on suppose « nom note » par ligne et on prend le dernier mot.np.isnan.Écris ce que tu veux : les fichiers titanic.csv, people.tsv et notes.txt sont disponibles. Ctrl+Entrée exécute le bloc actif.
input() renvoie une chaîne. input("âge") + 1 → TypeError ; "5" * 2 → "55". Convertir avec int()/float().= n'est pas ==. = affecte, == compare. if x = 3: → SyntaxError./ donne toujours un float (10 / 2 = 5.0) ; // la division entière ; % le reste.range(1, 5) → 1, 2, 3, 4 ; l[1:3] → éléments 1 et 2. Exception : df.loc[0:3] inclut 3.("x") est une chaîne, ("x",) un tuple.{} crée un dictionnaire vide, pas un set : le set vide s'écrit set().remove vs discard sur un set : remove lève KeyError si l'élément est absent, discard non.append vs extend : [1,2].append([3,4]) → [1, 2, [3, 4]] ; extend → [1, 2, 3, 4].self dans une méthode → TypeError « takes 0 positional arguments but 1 was given ».super().__init__() dans la classe fille → les attributs du parent n'existent pas.A * B n'est pas le produit matriciel avec NumPy : c'est case par case. Produit matriciel : A @ B ou np.dot(A, B).and/or → ValueError ; utiliser &, | et des parenthèses autour de chaque condition.df.dropna() seul ne change rien ; écrire df = df.dropna().Tableaux en mode auto-test (dossiers, normes, NIST) jusqu'à 100 %. Les sigles tombent en QCM.
Refais TP0 et TP1 sans regarder : écris, exécute, corrige. Puis les blocs list/tuple/set/dict.
Réécris la classe Employé de mémoire. Fais un TD de matrices à la main puis vérifie avec NumPy.
TD Titanic complet, puis l'examen 2025 en temps limité (1 h 30). Termine par le quiz et les flashcards.