UE1.1 · 6 ECTS

Python & Algorithmique

30h CM + 45h TP — 15 séances. De zéro jusqu'aux classes et à la Programmation Orientée Objet. Python est le langage n°1 mondial de la Data Science.

15 Séances 30h CM 45h TP 6 ECTS
1

Introduction Python — Variables, Types, print(), input()

Semaine 1CM · 2h
Comprendre l'historique de Python et ses forces
Savoir expliquer
Installer Anaconda et lancer Jupyter Notebook
Savoir faire
Déclarer des variables int, float, str, bool
Savoir analyser
Formater les sorties avec f-strings et lire des entrées avec input()
Savoir produire

1. Historique et contexte de Python

Python a été créé par Guido van Rossum en 1989 et publié en 1991. Son nom vient de la série humoristique britannique Monty Python's Flying Circus. L'objectif de Guido était de créer un langage aussi lisible que du pseudocode, que n'importe qui puisse comprendre sans être expert en informatique.

Aujourd'hui en 2026, Python est classé n°1 mondial selon l'indice TIOBE. Il domine en Data Science, Intelligence Artificielle, automatisation, développement web et scripting système.

💡 Conseil
À Madagascar, la demande en compétences Python augmente fortement. Les entreprises de la région Atsimo Andrefana (Toliara) cherchent des profils capables d'analyser leurs données de pêche, agriculture et commerce.

Les trois forces de Python :

  • Syntaxe claire : l'indentation obligatoire force un code bien structuré. Pas d'accolades { } comme en C ou Java.
  • Écosystème immense : plus de 300 000 packages sur PyPI. NumPy, Pandas, scikit-learn, TensorFlow...
  • Multiplateforme : le même code tourne sans modification sur Windows, Linux, macOS, Raspberry Pi.

2. Installation et environnement

Anaconda est la distribution Python recommandée pour la Data Science. Elle inclut Python 3.11+, Jupyter Notebook, Spyder et 250 bibliothèques scientifiques.

Terminal / Anaconda PromptBash
# Vérifier l'installation
python --version          # Python 3.11.x ou supérieur
conda --version           # conda 23.x ou supérieur

# Lancer Jupyter Notebook
jupyter notebook

3. Variables et types de données fondamentaux

Une variable est un conteneur nommé qui stocke une valeur en mémoire. En Python, le type est inféré automatiquement à l'assignation (typage dynamique).

TypeDescriptionExemple
intNombre entier, positif ou négatif-100, 0, 42, 2026
floatNombre à virgule flottante3.14, -0.5, 450.75
strChaîne de caractères (texte)"Toliara", 'MUST'
boolValeur logique (True ou False)True, False
variables_types.pyPython
age         = 20            # int
prix_riz    = 450.5         # float
ville       = "Toliara"     # str
est_admis   = True          # bool

print(type(age))            # <class 'int'>

# Opérateurs arithmétiques
print(10 + 3)    # 13    Addition
print(10 - 3)    # 7     Soustraction
print(10 * 3)    # 30    Multiplication
print(10 / 3)    # 3.33  Division réelle
print(10 // 3)   # 3     Division entière
print(10 % 3)    # 1     Modulo
print(10 ** 2)   # 100   Puissance

# Exemple pratique malgache
salaire_ar      = 800000
taux_cnaps      = 0.01
retenue_cnaps   = salaire_ar * taux_cnaps
print(f"Retenue CNAPS : {retenue_cnaps:,.0f} Ar")

4. print() et f-strings

Les f-strings (Python 3.6+) sont la façon moderne et lisible de formater les sorties : on préfixe la chaîne avec f et on met les expressions entre { }.

fstrings_demo.pyPython
nom = "Marie"; age = 22
print(f"Bonjour {nom}, tu as {age} ans")

# Formatage des nombres
pi = 3.14159265
print(f"Pi ≈ {pi:.2f}")         # Pi ≈ 3.14
print(f"Pi ≈ {pi:.4f}")         # Pi ≈ 3.1416

montant = 1500000
print(f"Montant : {montant:,} Ar")    # 1,500,000 Ar

5. input() — Lire des données utilisateur

input() retourne toujours une chaîne de caractères (str). Il faut convertir avec int() ou float() si nécessaire.

❌ Erreur fréquente
Oublier de convertir le résultat de input(). annee = input("Année : ") donne une str. 2026 - annee provoquera une TypeError. Solution : annee = int(input("Année : ")).
input_demo.pyPython
prenom = input("Votre prénom : ")

annee_naissance = int(input("Année de naissance : "))
age = 2026 - annee_naissance
print(f"Bonjour {prenom}, vous avez {age} ans")

# Calculatrice de salaire
salaire_brut = float(input("Salaire brut (Ar) : "))
cnaps        = salaire_brut * 0.01
salaire_net  = salaire_brut - cnaps
print(f"Retenue CNAPS : {cnaps:,.0f} Ar")
print(f"Salaire net   : {salaire_net:,.0f} Ar")
✏️ Exercice 1 — hello_Tulear.py

a) Déclarez trois variables : ville="Toliara", population=250000, superficie_km2=9515. Affichez une fiche formatée avec la densité calculée (population/superficie en hab/km², arrondie à 1 décimale).

b) Convertisseur Ariary/Euro : demandez un montant et le sens (1 pour Ar→€, 2 pour €→Ar). Taux : 1€ = 5200 Ar. Affichez arrondi à 2 décimales.

c) Calculatrice de superficie : demandez longueur et largeur en mètres. Affichez en m², hectares (1 ha = 10 000 m²) et ares (1 are = 100 m²).

d) BONUS — Bulletin de paie : demandez le salaire brut. Calculez CNAPS (1%), IRSA estimé (15% après abattement 30%), et le salaire net.

✓ Corrigé 1
hello_Tulear.py — a) Fiche descriptivePython
ville = "Toliara"; pop = 250000; sup = 9515
densite = pop / sup
print(f"=== Fiche de {ville} ===")
print(f"Population  : {pop:,} habitants")
print(f"Superficie  : {sup:,} km²")
print(f"Densité     : {densite:.1f} hab/km²")
b) Convertisseur Ariary/EuroPython
TAUX_CHANGE = 5200
sens    = int(input("Choisir : 1=Ariary vers Euro, 2=Euro vers Ariary : "))
montant = float(input("Montant : "))
if sens == 1:
    resultat = montant / TAUX_CHANGE
    print(f"{montant:,.0f} Ar  =  {resultat:.2f} €")
elif sens == 2:
    resultat = montant * TAUX_CHANGE
    print(f"{montant:.2f} €  =  {resultat:,.0f} Ar")
else:
    print("Choix invalide. Entrez 1 ou 2.")
c) Calculatrice de superficiePython
longueur = float(input("Longueur du terrain (m) : "))
largeur  = float(input("Largeur du terrain (m) : "))
superficie_m2 = longueur * largeur
superficie_ha = superficie_m2 / 10000
superficie_a  = superficie_m2 / 100
print(f"Superficie : {superficie_m2:,.2f} m²")
print(f"           = {superficie_ha:.4f} hectares")
print(f"           = {superficie_a:.2f} ares")
2

Structures conditionnelles if/elif/else

Semaine 1CM+TP · 2h
Écrire des conditions if/elif/else correctement indentées
Savoir expliquer
Maîtriser les 8 opérateurs de comparaison
Savoir faire
Combiner des conditions avec and, or, not
Savoir analyser
Traiter tous les cas limites (edge cases)
Savoir produire

1. Structure if / elif / else

Les instructions conditionnelles permettent au programme de choisir un chemin d'exécution selon les données. L'indentation (4 espaces) délimite les blocs. Les deux-points : après chaque condition sont obligatoires.

❌ Erreur fréquente
Oublier les deux-points : après if/elif/else. Python lève immédiatement une SyntaxError: expected ':'.
classification_notes.pyPython
note = float(input("Entrez votre note sur 20 : "))

if note >= 16:
    mention = "Très Bien"
elif note >= 14:
    mention = "Bien"
elif note >= 12:
    mention = "Assez Bien"
elif note >= 10:
    mention = "Passable"
else:
    mention = "Insuffisant — Ajourné"

print(f"Note : {note}/20 → Mention : {mention}")

2. Opérateurs de comparaison

OpérateurSignificationExempleRésultat
==Égal à5 == 5True
!=Différent de3 != 4True
>Strictement supérieur7 > 3True
<Strictement inférieur2 < 10True
>=Supérieur ou égal5 >= 5True
<=Inférieur ou égal3 <= 4True
inAppartient à"a" in "cat"True
not inN'appartient pas5 not in [1,2,3]True

3. Opérateurs logiques : and, or, not

operateurs_logiques.pyPython
age = 22; possede_cni = True
if age >= 18 and possede_cni:
    print("Peut voter aux élections")

est_etudiant = True; est_personnel = False
if est_etudiant or est_personnel:
    print("Accès au campus MUST autorisé")

pluie = False
if not pluie:
    print("Beau temps à Toliara — sortie possible !")

4. Conditions imbriquées

tarif_cinema.pyPython
age = int(input("Âge du spectateur : "))
a_carte_must = input("Carte MUST ? (oui/non) : ").lower() == "oui"

if age < 6:
    tarif = 0; categorie = "Gratuit"
elif age < 12:
    tarif = 1000 if a_carte_must else 2000
    categorie = "Tarif enfant"
elif age < 18:
    tarif = 3000; categorie = "Tarif jeune"
else:
    tarif = 4000 if a_carte_must else 5000
    categorie = "Tarif adulte"

print(f"{categorie} — Tarif : {tarif:,} Ar")
✏️ Exercice 2 — Classificateurs

a) IMC : Demandez poids (kg) et taille (m). Calculez IMC = poids/taille². Affichez catégorie : Maigreur (<18.5), Normal (18.5-25), Surpoids (25-30), Obésité (≥30).

b) Tarif transport : Taxi-brousse Toliara→Tana coûte 45 000 Ar. Réductions : -20% (<12 ans), -10% (≥60 ans), -15% (carte fidélité cumulable).

c) Année bissextile : si divisible par 4 ET (pas par 100 OU divisible par 400). Testez : 2000, 1900, 2024, 2026, 2028, 2100.

d) BONUS — Jeu de devinette : choix aléatoire 1-100, 7 essais, indications trop grand/petit/correct.

✓ Corrigé 2
IMC avec messagesPython
poids  = float(input("Poids en kg : "))
taille = float(input("Taille en m : "))
if taille <= 0:
    print("Erreur : taille positive requise")
else:
    imc = poids / (taille ** 2)
    print(f"IMC : {imc:.2f}")
    if imc < 18.5:
        cat, msg = "Maigreur", "Consultez un médecin."
    elif imc < 25:
        cat, msg = "Normal", "Continuez ainsi !"
    elif imc < 30:
        cat, msg = "Surpoids", "Exercice et équilibre."
    else:
        cat, msg = "Obésité", "Consultez un professionnel."
    print(f"Catégorie : {cat}\nConseil : {msg}")
Années bissextilesPython
def est_bissextile(annee):
    return (annee % 4 == 0 and annee % 100 != 0) or (annee % 400 == 0)
for a in [2000, 1900, 2024, 2026, 2028, 2100]:
    print(f"{a} : {'✓ Bissextile' if est_bissextile(a) else '✗ Non bissextile'}")
3

Boucles while et for — range(), break, continue

Semaine 2CM · 2h
Choisir entre while (nb itérations inconnu) et for (séquence fixe)
Savoir expliquer
Utiliser range() avec les 3 paramètres : start, stop, step
Savoir faire
Contrôler le flux avec break (sortir) et continue (passer)
Savoir analyser
Comprendre la notion de complexité O(n)
Savoir produire

1. La boucle while

La boucle while exécute son bloc tant que la condition est True. Toujours s'assurer que la condition deviendra False — sinon boucle infinie !

⚠️ Attention
Une boucle infinie gèle le programme. Ctrl+C dans le terminal, ou bouton Stop dans Jupyter.
while_demo.pyPython
# Saisie sécurisée
note = -1
while not (0 <= note <= 20):
    note = float(input("Note entre 0 et 20 : "))
print(f"Note enregistrée : {note}/20")

# Compte à rebours
compteur = 10
while compteur > 0:
    print(f"T-{compteur}...")
    compteur -= 1
print("Décollage !")

2. La boucle for

for_demo.pyPython
regions = ["Toliara", "Antananarivo", "Tamatave", "Fianarantsoa"]
for region in regions:
    print(f"Région : {region}")

for i in range(1, 11):
    print(i, end=" ")  # 1 2 3...10

for i in range(0, 101, 10):
    print(i, end=" ")  # 0, 10, 20...100

for i in range(10, 0, -1):
    print(i, end=" ")  # 10, 9, 8...1

3. break, continue et else sur boucle

break_continue.pyPython
# break
for n in range(1, 100):
    if n * n > 500:
        print(f"Premier n avec n² > 500 : n={n}, n²={n*n}")
        break

# continue
for i in range(1, 11):
    if i % 2 == 0:
        continue
    print(i, end=" ")  # 1 3 5 7 9

# else sur for : exécuté si PAS de break
for n in range(2, 10):
    if 97 % n == 0:
        print(f"97 divisible par {n}")
        break
else:
    print("97 est premier !")
✏️ Exercice 3 — Boucles

a) Table de multiplication : demandez N, affichez N×1 à N×12. Boucle externe jusqu'à ce que l'utilisateur entre 0.

b) Suite de Fibonacci : 20 premiers termes (0,1,1,2,3,5,8...). Somme, moyenne, pairs/impairs.

c) Nombres premiers entre 2 et 100. Utilisez √n pour l'optimisation.

d) BONUS — Triangle de Pascal : 8 premières lignes, format centré.

✓ Corrigé 3
a) Table de multiplicationPython
while True:
    N = int(input("\nNombre (0 pour quitter) : "))
    if N == 0:
        print("Au revoir !"); break
    print(f"=== Table de {N} ===")
    for i in range(1, 13):
        print(f"  {N} × {i:2d} = {N*i:4d}")
b) FibonacciPython
a, b = 0, 1; termes = []
for _ in range(20):
    termes.append(a)
    a, b = b, a + b
print("Suite :", termes)
print(f"Somme : {sum(termes)}, Moyenne : {sum(termes)/len(termes):.2f}")
nb_pairs = sum(1 for t in termes if t % 2 == 0)
print(f"Pairs : {nb_pairs}, Impairs : {20 - nb_pairs}")
c) Nombres premiersPython
import math
premiers = []
for n in range(2, 101):
    est_premier = True
    for d in range(2, int(math.sqrt(n)) + 1):
        if n % d == 0:
            est_premier = False; break
    if est_premier:
        premiers.append(n)
print(f"Premiers (25) : {premiers}")
4

Listes — indexation, slicing, méthodes, comprehensions

Semaine 3CM+TP · 2h
Créer et indexer une liste (indices positifs et négatifs)
Savoir expliquer
Utiliser les slices [début:fin:pas] pour extraire des sous-listes
Savoir faire
Appliquer les méthodes principales : append, insert, remove, sort, pop
Savoir analyser
Écrire des list comprehensions avec condition
Savoir produire

1. Listes — création et indexation

Une liste (list) est une collection ordonnée et modifiable d'éléments. L'indexation commence à 0. Les indices négatifs comptent depuis la fin.

📖 Différence importante
Les listes Python sont hétérogènes (éléments de types différents). En pratique, il est recommandé de n'avoir qu'un seul type par liste pour la clarté et la performance.
listes_bases.pyPython
notes = [15, 12, 18, 9, 14, 11, 16]
print(notes[0])   # 15
print(notes[-1])  # 16 (dernier)
print(notes[-3])  # 14 (3ème en partant de la fin)
notes[0] = 16     # Modification
print(notes)      # [16, 12, 18, 9, 14, 11, 16]

# Slicing
print(notes[1:4])     # [12, 18, 9]
print(notes[:3])      # [15, 12, 18] (3 premiers)
print(notes[::2])     # Un élément sur deux
print(notes[::-1])    # Inversé

3. Méthodes fondamentales

MéthodeDescriptionExemple
append(x)Ajoute x à la finlst.append(7)
insert(i, x)Insère x à l'index ilst.insert(0, 99)
remove(x)Supprime la 1ère occurrencelst.remove(12)
pop(i)Supprime et retourne à l'index ival = lst.pop()
sort()Trie en place (croissant)lst.sort()
sorted(lst)Retourne une copie triées = sorted(lst)
len(lst)Longueur de la listelen(notes)

4. List comprehension

Syntaxe : [expression for variable in itérable if condition]

comprehensions.pyPython
carres = [x**2 for x in range(1, 11)]
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

notes = [15, 12, 18, 9, 14, 11, 16]
admis = [n for n in notes if n >= 10]
mentions = [n for n in notes if n >= 14]

# Celsius → Fahrenheit
celsius = [0, 10, 20, 30, 40]
fahrenheit = [c * 9/5 + 32 for c in celsius]
# [32.0, 50.0, 68.0, 86.0, 104.0]
✏️ Exercice 4 — Listes

a) 10 températures Toliara (20-40°C). Calculez min, max, moyenne, médiane, étendue sans numpy.

b) 10 entiers aléatoires 1-100. Créez 3 listes : pairs, >50, pairs ET >50.

c) Matrice 3×3 : somme diagonale, somme par ligne, somme par colonne.

d) BONUS — Triez ["riz","mais","tomate","sel","huile","poivre"] par longueur puis alpha.

✓ Corrigé 4
a) StatistiquesPython
temps = [28, 31, 25, 33, 27, 30, 35, 29, 26, 32]
mini, maxi, etendue = min(temps), max(temps), max(temps)-min(temps)
moyenne = sum(temps) / len(temps)
tri = sorted(temps); n = len(tri)
mediane = (tri[n//2-1] + tri[n//2]) / 2 if n%2==0 else tri[n//2]
print(f"Min={mini} Max={maxi} Étendue={etendue} Moy={moyenne:.1f} Méd={mediane}")
c) Matrice 3×3Python
M = [[1,2,3],[4,5,6],[7,8,9]]
diag = sum(M[i][i] for i in range(3))
print(f"Diagonale : {diag}")  # 15
for i, ligne in enumerate(M):
    print(f"Ligne {i+1} : {sum(ligne)}")
for j in range(3):
    print(f"Colonne {j+1} : {sum(M[i][j] for i in range(3))}")
5

Fonctions — def, return, paramètres, scope

Semaine 4CM · 2h
Définir une fonction avec paramètres et valeur par défaut
Savoir expliquer
Comprendre le principe DRY (Don't Repeat Yourself)
Savoir faire
Maîtriser la portée des variables (LEGB)
Savoir analyser
Utiliser *args et documenter avec des docstrings
Savoir produire
Python
def saluer(nom, ville="Toliara"):
    """Retourne un message de salutation."""
    return f"Bonjour {nom}, bienvenue à {ville} !"

print(saluer("Marie"))
print(saluer("Paul", "Tana"))
print(saluer(ville="Mada", nom="Jean"))

# Retourner plusieurs valeurs
def stats_basiques(lst):
    return min(lst), max(lst), sum(lst)/len(lst)

mini, maxi, moy = stats_basiques([15, 12, 18, 9, 14])

# Portée LEGB
TAUX_TVA = 0.20  # Globale
def prix_ttc(prix_ht):
    tva = prix_ht * TAUX_TVA
    return prix_ht + tva
✏️ Exercice 5 — Fonctions

a) Écrivez moyenne(lst) : ValueError si vide.

b) Écrivez mediane(lst) : ne pas modifier l'originale.

c) Écrivez ecart_type(lst) : σ = √(Σ(xi-μ)²/n).

d) BONUS : Créez stats_lib.py avec ces 3 fonctions, testez sur 5 datasets.

✓ Corrigé 5
Python
import math

def moyenne(lst):
    if not lst:
        raise ValueError("Liste vide")
    return sum(lst) / len(lst)

def mediane(lst):
    if not lst:
        raise ValueError("Liste vide")
    s = sorted(lst); n = len(s)
    if n % 2 == 1:
        return s[n // 2]
    return (s[n//2-1] + s[n//2]) / 2

def ecart_type(lst):
    mu = moyenne(lst)
    var = sum((x - mu)**2 for x in lst) / len(lst)
    return math.sqrt(var)

# Test
temps_toliara = [28.5, 31.2, 27.0, 33.8, 26.5, 30.1, 29.4, 32.0]
print(f"Moy : {moyenne(temps_toliara):.1f}°C")
print(f"Écart-type : {ecart_type(temps_toliara):.2f}°C")
6

Fichiers CSV et JSON — lecture et écriture

Semaine 5CM+TP · 2h
Lire et écrire des fichiers texte avec open() et with
Savoir expliquer
Manipuler des CSV avec csv.DictReader et csv.writer
Savoir faire
Charger et sauvegarder des données JSON
Savoir analyser
Construire un pipeline fichier complet
Savoir produire
Python
# Écrire fichier texte
with open("journal.txt", "w", encoding="utf-8") as f:
    f.write("Lundi 01/07/2026 : cours Python MUST\n")
    f.write("Mardi 02/07/2026 : TP data analysis\n")

# Lire ligne par ligne
with open("journal.txt", "r", encoding="utf-8") as f:
    for num, ligne in enumerate(f, 1):
        print(f"Ligne {num}: {ligne.rstrip()}")

# CSV
import csv
with open("etudiants.csv", "w", newline="", encoding="utf-8") as f:
    csv.writer(f).writerows([
        ["nom","filiere","note"],
        ["RAKOTO","DATA",15],
        ["RASOA","IoT",12],
    ])

# JSON
import json
config = {"filiere":"DATA","annee":2026,"campus":"Toliara"}
with open("config.json","w",encoding="utf-8") as f:
    json.dump(config, f, ensure_ascii=False, indent=2)
✏️ Exercice 6 — Fichiers

a) Créez meteo_toliara.csv (7 jours juillet : date, t_max, t_min, humidite, pluie, vent).

b) Lisez avec DictReader. Calculez : t_max moy, t_min moy, total pluie, jour le plus chaud.

c) Exportez resume_meteo.json avec tous les champs + "ville":"Toliara".

d) BONUS — Graphique ASCII de t_max avec des #.

✓ Corrigé 6
Python
import csv, json

donnees = [
    ["date","t_max","t_min","humidite","pluie","vent"],
    ["2026-07-01",24,16,65,0,15], ["2026-07-02",26,17,60,0,12],
    ["2026-07-03",23,15,70,2,20], ["2026-07-04",22,14,75,8,25],
    ["2026-07-05",25,16,62,0,10], ["2026-07-06",27,18,58,0,8],
    ["2026-07-07",26,17,60,1,14],
]
with open("meteo_toliara.csv","w",newline="") as f:
    csv.writer(f).writerows(donnees)

with open("meteo_toliara.csv") as f:
    lignes = list(csv.DictReader(f))
tmax = [float(r["t_max"]) for r in lignes]
tmin = [float(r["t_min"]) for r in lignes]
pluie = [float(r["pluie"]) for r in lignes]
idx_max = tmax.index(max(tmax))

resume = {
    "ville":"Toliara","mois":"Juillet 2026",
    "t_max_moyenne":round(sum(tmax)/len(tmax),1),
    "t_min_moyenne":round(sum(tmin)/len(tmin),1),
    "total_pluie_mm":sum(pluie),
    "jour_le_plus_chaud":{"date":lignes[idx_max]["date"],"t_max":max(tmax)}
}
with open("resume_meteo.json","w",encoding="utf-8") as f:
    json.dump(resume, f, ensure_ascii=False, indent=2)
print(json.dumps(resume, indent=2, ensure_ascii=False))
7

Exceptions et logging — try/except, gestion robuste

Semaine 7CM+TP · 2h
Comprendre les concepts fondamentaux et savoir les expliquer
Savoir expliquer
Appliquer les méthodes sur des données réalistes
Savoir faire
Analyser les résultats et identifier les points d'amélioration
Savoir analyser
Réaliser les exercices et vérifier les corrigés
Savoir produire

1. Gestion des exceptions try/except

La gestion des exceptions rend les programmes robustes face aux erreurs prévisibles. try/except/else/finally attrape les erreurs sans arrêter le programme.

Python
try:
    valeur = int(input("Entrez un entier : "))
    resultat = 100 / valeur
except ValueError:
    print("Saisie invalide — entrez un nombre entier")
except ZeroDivisionError:
    print("Division par zéro impossible")
except Exception as e:
    print(f"Erreur inattendue : {e}")
else:
    print(f"Résultat : {resultat:.2f}")
finally:
    print("Bloc toujours exécuté — nettoyage")

# Logging
import logging
logging.basicConfig(level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s")
logging.info("Programme démarré")
logging.warning("Fichier manquant")
logging.error("Connexion échouée")
✏️ Exercice 7

a) Implémentez les concepts de "Exceptions et logging — try/except, gestion robuste" avec des données MUST/Madagascar.

b) Testez sur au moins 3 cas différents dont un cas limite.

c) Committez sur GitHub avec un message conventionnel.

d) BONUS — Ajoutez une fonctionnalité supplémentaire pertinente.

✓ Corrigé 7

Voir le code de démonstration ci-dessus comme base de solution. Adaptez les valeurs et les noms de variables au contexte malgache.

8

Modules, packages, pip et environnements virtuels

Semaine 8CM+TP · 2h
Comprendre les concepts fondamentaux et savoir les expliquer
Savoir expliquer
Appliquer les méthodes sur des données réalistes
Savoir faire
Analyser les résultats et identifier les points d'amélioration
Savoir analyser
Réaliser les exercices et vérifier les corrigés
Savoir produire

1. Modules de la bibliothèque standard

Python inclut une bibliothèque standard riche : os, math, random, datetime, collections. pip installe des packages tiers. Les environnements virtuels isolent les dépendances.

Python
import os, math, random
from datetime import datetime, date
from collections import Counter

print(os.getcwd())
os.makedirs("data/raw", exist_ok=True)

print(math.sqrt(144))  # 12.0
print(random.randint(1, 6))

now = datetime.now()
print(now.strftime("%d/%m/%Y %H:%M:%S"))

texte = "data science data python data analytics"
freq = Counter(texte.split())
print(freq.most_common(3))
✏️ Exercice 8

a) Implémentez les concepts de "Modules, packages, pip et environnements virtuels" avec des données MUST/Madagascar.

b) Testez sur au moins 3 cas différents dont un cas limite.

c) Committez sur GitHub avec un message conventionnel.

d) BONUS — Ajoutez une fonctionnalité supplémentaire pertinente.

✓ Corrigé 8

Voir le code de démonstration ci-dessus comme base de solution. Adaptez les valeurs et les noms de variables au contexte malgache.

9

Dictionnaires avancés — méthodes, imbrication, Counter

Semaine 9CM+TP · 2h
Comprendre les concepts fondamentaux et savoir les expliquer
Savoir expliquer
Appliquer les méthodes sur des données réalistes
Savoir faire
Analyser les résultats et identifier les points d'amélioration
Savoir analyser
Réaliser les exercices et vérifier les corrigés
Savoir produire

1. Dictionnaires et Counter

Un dictionnaire stocke des paires clé-valeur. Les dict comprehensions permettent la création concise. Counter compte automatiquement les fréquences.

Python
notes = {"Alice":15, "Bob":9, "Charlie":12, "Dia":17}
admis = {n:v for n,v in notes.items() if v >= 10}
inverse = {v:n for n,v in notes.items()}

annuaire = {
    "RAKOTO Jean": {"tel":"+261 34 12 34 56", "ville":"Toliara"},
    "RASOA Marie": {"tel":"+261 32 98 76 54", "ville":"Tana"},
}
print(annuaire["RAKOTO Jean"]["tel"])

from collections import Counter
freq = Counter(texte.split())
✏️ Exercice 9

a) Implémentez les concepts de "Dictionnaires avancés — méthodes, imbrication, Counter" avec des données MUST/Madagascar.

b) Testez sur au moins 3 cas différents dont un cas limite.

c) Committez sur GitHub avec un message conventionnel.

d) BONUS — Ajoutez une fonctionnalité supplémentaire pertinente.

✓ Corrigé 9

Voir le code de démonstration ci-dessus comme base de solution. Adaptez les valeurs et les noms de variables au contexte malgache.

10

POO — Classes, objets, héritage, @property

Semaine 10CM+TP · 2h
Comprendre les concepts fondamentaux et savoir les expliquer
Savoir expliquer
Appliquer les méthodes sur des données réalistes
Savoir faire
Analyser les résultats et identifier les points d'amélioration
Savoir analyser
Réaliser les exercices et vérifier les corrigés
Savoir produire

1. Programmation Orientée Objet

La POO organise le code autour d'objets qui combinent données (attributs) et comportements (méthodes). Une classe est un plan de construction. L'héritage permet de réutiliser du code.

Python
class Etudiant:
    nb_total = 0
    def __init__(self, nom, filiere):
        self.nom = nom
        self.filiere = filiere
        self.notes = []
        Etudiant.nb_total += 1
    def ajouter_note(self, note):
        if 0 <= note <= 20:
            self.notes.append(note)
    @property
    def moyenne(self):
        return sum(self.notes)/len(self.notes) if self.notes else None
    def __str__(self):
        moy = f"{self.moyenne:.1f}" if self.moyenne else "—"
        return f"[{self.filiere}] {self.nom} — Moy:{moy}/20"

class EtudiantBoursier(Etudiant):
    def __init__(self, nom, filiere, bourse_ar):
        super().__init__(nom, filiere)
        self.bourse_ar = bourse_ar
✏️ Exercice 10

a) Implémentez les concepts de "POO — Classes, objets, héritage, @property" avec des données MUST/Madagascar.

b) Testez sur au moins 3 cas différents dont un cas limite.

c) Committez sur GitHub avec un message conventionnel.

d) BONUS — Ajoutez une fonctionnalité supplémentaire pertinente.

✓ Corrigé 10

Voir le code de démonstration ci-dessus comme base de solution. Adaptez les valeurs et les noms de variables au contexte malgache.

11

NumPy — arrays, opérations vectorisées, algèbre linéaire

Semaine 11CM+TP · 2h
Comprendre les concepts fondamentaux et savoir les expliquer
Savoir expliquer
Appliquer les méthodes sur des données réalistes
Savoir faire
Analyser les résultats et identifier les points d'amélioration
Savoir analyser
Réaliser les exercices et vérifier les corrigés
Savoir produire

1. NumPy et le ndarray

NumPy fournit le ndarray permettant des opérations vectorisées 100× plus rapides que les boucles Python. Fondamental pour la Data Science.

Python
import numpy as np

a = np.array([1, 2, 3, 4, 5])
M = np.array([[1,2,3],[4,5,6]])
zeros = np.zeros((3, 4))
x = np.arange(0, 10, 0.5)

# Opérations vectorisées
print(a * 2)       # [2 4 6 8 10]
print(a ** 2)      # [1 4 9 16 25]
print(a.mean())    # 3.0
print(a.std())     # 1.41

# Monte Carlo — estimation de pi
N = 1_000_000
pts = np.random.uniform(-1, 1, (N, 2))
dans_cercle = (pts[:,0]**2 + pts[:,1]**2 <= 1).sum()
print(f"π = {4*dans_cercle/N:.5f}")
✏️ Exercice 11

a) Implémentez les concepts de "NumPy — arrays, opérations vectorisées, algèbre linéaire" avec des données MUST/Madagascar.

b) Testez sur au moins 3 cas différents dont un cas limite.

c) Committez sur GitHub avec un message conventionnel.

d) BONUS — Ajoutez une fonctionnalité supplémentaire pertinente.

✓ Corrigé 11

Voir le code de démonstration ci-dessus comme base de solution. Adaptez les valeurs et les noms de variables au contexte malgache.

12

Pandas — DataFrames, sélection, nettoyage

Semaine 12CM+TP · 2h
Comprendre les concepts fondamentaux et savoir les expliquer
Savoir expliquer
Appliquer les méthodes sur des données réalistes
Savoir faire
Analyser les résultats et identifier les points d'amélioration
Savoir analyser
Réaliser les exercices et vérifier les corrigés
Savoir produire

1. Pandas DataFrames

Pandas est la bibliothèque de référence pour les données tabulaires. Un DataFrame est un tableau 2D avec index et colonnes nommées.

Python
import pandas as pd

df = pd.DataFrame({
    "nom": ["RAKOTO","RASOA","RABE","RAFOLO","HERY"],
    "ville": ["Toliara","Tana","Toliara","Mahajanga","Toliara"],
    "filiere": ["DATA","IoT","DATA","MGT","IoT"],
    "note": [15, 12, 18, 9, 14]
})

print(df.shape)
print(df.dtypes)
print(df.describe())
print(df.isnull().sum())

# Filtrage
df[df["note"] >= 12]
df[(df["ville"]=="Toliara") & (df["note"]>10)]

# Colonne calculée
df["mention"] = df["note"].apply(
    lambda n: "TB" if n>=16 else "B" if n>=14 else "P" if n>=10 else "F")
✏️ Exercice 12

a) Implémentez les concepts de "Pandas — DataFrames, sélection, nettoyage" avec des données MUST/Madagascar.

b) Testez sur au moins 3 cas différents dont un cas limite.

c) Committez sur GitHub avec un message conventionnel.

d) BONUS — Ajoutez une fonctionnalité supplémentaire pertinente.

✓ Corrigé 12

Voir le code de démonstration ci-dessus comme base de solution. Adaptez les valeurs et les noms de variables au contexte malgache.

13

Matplotlib — graphiques 2D, subplots, dashboard

Semaine 13CM+TP · 2h
Comprendre les concepts fondamentaux et savoir les expliquer
Savoir expliquer
Appliquer les méthodes sur des données réalistes
Savoir faire
Analyser les résultats et identifier les points d'amélioration
Savoir analyser
Réaliser les exercices et vérifier les corrigés
Savoir produire

1. Matplotlib et la visualisation

Matplotlib permet de créer des graphiques publiables en PNG haute résolution. Seaborn complète Matplotlib pour les visualisations statistiques.

Python
import matplotlib.pyplot as plt
import numpy as np

fig, axes = plt.subplots(2, 2, figsize=(12, 8))

data = np.random.normal(28, 5, 200)
axes[0,0].hist(data, bins=20, color="#0A7C6E", edgecolor="white")
axes[0,0].axvline(data.mean(), color="red", ls="--", label="Moyenne")
axes[0,0].set_title("Distribution températures")

axes[0,1].bar(["DATA","IoT","MGT"], [40,35,25],
              color=["#0A7C6E","#1A237E","#B45309"])
axes[0,1].set_title("Répartition étudiants")

x = np.random.randn(200)
axes[1,0].scatter(x, x+np.random.randn(200)*0.5, alpha=0.5)

axes[1,1].boxplot([np.random.normal(13,3,50), np.random.normal(12,4,50)],
                  labels=["S1","S2"])
plt.tight_layout()
plt.savefig("dashboard_must.png", dpi=150, bbox_inches="tight")
✏️ Exercice 13

a) Implémentez les concepts de "Matplotlib — graphiques 2D, subplots, dashboard" avec des données MUST/Madagascar.

b) Testez sur au moins 3 cas différents dont un cas limite.

c) Committez sur GitHub avec un message conventionnel.

d) BONUS — Ajoutez une fonctionnalité supplémentaire pertinente.

✓ Corrigé 13

Voir le code de démonstration ci-dessus comme base de solution. Adaptez les valeurs et les noms de variables au contexte malgache.

14

Git & GitHub — versioning, branches, bonnes pratiques

Semaine 14CM+TP · 2h
Comprendre les concepts fondamentaux et savoir les expliquer
Savoir expliquer
Appliquer les méthodes sur des données réalistes
Savoir faire
Analyser les résultats et identifier les points d'amélioration
Savoir analyser
Réaliser les exercices et vérifier les corrigés
Savoir produire

1. Git et GitHub

Git trace l'historique de vos fichiers et permet la collaboration. GitHub est la plateforme de partage et de portfolio professionnel.

Git
# Initialisation
git init
git clone URL

# Workflow quotidien
git status
git add fichier.py
git commit -m "feat: add stats_lib"
git push origin main
git pull

# Branches
git checkout -b feature/visualisation
git merge feature/visualisation

# Conventions de commit
# feat: nouvelle fonctionnalité
# fix: correction de bug
# docs: mise à jour documentation
⚠️ .gitignore
Ne jamais versionner : .env, __pycache__/, *.pyc, .venv/, mots de passe.
✏️ Exercice 14

a) Implémentez les concepts de "Git & GitHub — versioning, branches, bonnes pratiques" avec des données MUST/Madagascar.

b) Testez sur au moins 3 cas différents dont un cas limite.

c) Committez sur GitHub avec un message conventionnel.

d) BONUS — Ajoutez une fonctionnalité supplémentaire pertinente.

✓ Corrigé 14

Voir le code de démonstration ci-dessus comme base de solution. Adaptez les valeurs et les noms de variables au contexte malgache.

15

APIs REST avec requests — collecter des données en ligne

Semaine 15CM+TP · 2h
Comprendre les concepts fondamentaux et savoir les expliquer
Savoir expliquer
Appliquer les méthodes sur des données réalistes
Savoir faire
Analyser les résultats et identifier les points d'amélioration
Savoir analyser
Réaliser les exercices et vérifier les corrigés
Savoir produire

1. APIs REST

Une API REST expose des ressources via des URLs. Le module requests permet d'interroger n'importe quelle API web depuis Python.

Python
import requests, pandas as pd, matplotlib.pyplot as plt

r = requests.get("https://api.open-meteo.com/v1/forecast", params={
    "latitude": -23.35,
    "longitude": 43.67,
    "daily": "temperature_2m_max,temperature_2m_min,precipitation_sum",
    "timezone": "Indian/Antananarivo",
    "forecast_days": 7
})
r.raise_for_status()

data = r.json()["daily"]
df = pd.DataFrame(data)
df.columns = ["date", "t_max", "t_min", "pluie_mm"]
df.to_csv("meteo_toliara_7j.csv", index=False)

plt.figure(figsize=(10, 4))
plt.fill_between(df["date"], df["t_min"], df["t_max"], alpha=0.3)
plt.plot(df["date"], df["t_max"], "o-", label="T max")
plt.plot(df["date"], df["t_min"], "o-", label="T min")
plt.title("Prévisions Toliara — 7 jours")
plt.xticks(rotation=45)
plt.legend()
plt.tight_layout()
plt.savefig("meteo_toliara_7j.png", dpi=150)
✏️ Exercice 15

a) Implémentez les concepts de "APIs REST avec requests — collecter des données en ligne" avec des données MUST/Madagascar.

b) Testez sur au moins 3 cas différents dont un cas limite.

c) Committez sur GitHub avec un message conventionnel.

d) BONUS — Ajoutez une fonctionnalité supplémentaire pertinente.

✓ Corrigé 15

Voir le code de démonstration ci-dessus comme base de solution. Adaptez les valeurs et les noms de variables au contexte malgache.