Introduction
Bienvenue sur le site dédié à votre examen final de Python. Il devrait contenir toutes les ressources nécessaires à la réalisation de votre projet de groupe. Si vous avez des questions, n’hésitez pas à m’envoyer un mail.
Si vous êtes perdus, ou ne savez pas par où commencer, regardez bien les ressources mises à votre disposition. De plus, je vous recommande d’effectuer vos propres recherches sur internet (comme vous le feriez en entreprise). En informatique, les tutoriels/documentations/aide sur les erreurs sont majoritairement en anglais. Pensez donc à faire vos recherches dans cette langue si cela ne donne rien en français.
Pensez également à faire un tour sur les ressources des autres projets, vous pourriez éventuellement tomber sur des choses intéressantes.
La procédure est la suivante :
- Déposer le notebook jupyter (fichier .ipynb) sur le Cloud
- Créer un lien de partage
- Cliquer sur le fichier (…)
- Cliquer sur l’onglet partage
- Cliquer sur Liens Publics
- Créer un lien public
- Partager
- Un lien public a été créé : cliquer sur l’icône “Copier” (le plus à gauche sur la ligne du lien)
- M’envoyer un mail contenant le lien de partage à l’adresse
[email protected]
et ayant pour objet : “GR01 | Rendu Python” (remplacez 01 par votre numéro de groupe).
Vous devrez présenter votre travail lors d’une soutenance. Chacun devra expliquer une partie du code. 10 min environ par groupe (vous ne serez pas notés sur le temps)
Point sur la triche et objectif du projet
Le but de ce projet est que vous puissiez manipuler du Python à travers une activité qui se veut la plus ludique et utile possible. Je ne m’attends pas à ce que le code soit parfait, et je préfère un groupe qui a passé du temps à rendre un projet fonctionnel à 70% qu’un groupe qui a sous-traité pour présenter un projet “fini”.
D’expérience, ce sont les projets sous-traité qui obtiennent les moins bonnes notes, puisque les développeurs expérimentés ont pour habitude de faire comme ils l’entendent sans respecter les consignes : on se retrouve alors avec un code qui fait plein de chose, mais ne répond pas aux instructions demandées.
Comme en entreprise, je vous autorise à récupérer des morceaux de code disponibles sur internet, d’utiliser ChatGPT… Cependant, merci de ne pas récupérer un projet existant tel quel… (je n’ai aucun intérêt à passer du temps sur un code écrit par d’autres)
Fonctionnement du site
Chaque groupe va travailler sur un sujet qui lui est propre. La liste des sujets (et des groupes associés) est accessible via le menu latéral.
Pour chaque groupe, deux sections sont accessibles :
- Sujet : contient les instructions pour mener à bien le projet et les attendus.
- Ressources : contient du code expliqué pour que vous puissiez réaliser le projet (comme vous chercheriez du code sur StackOverflow en entreprise)
Base de données décès
L’objectif de ce projet est de pouvoir rechercher des individus dans la base de données de décès de l’INSEE. Aucune API n’étant mise à disposition pour effectuer directement les recherches, nous allons utiliser celle mise à disposition par matchid.io.
Membres du groupe :
Sujet
Palier 1
Le premier palier consiste à récupérer les informations relatives à une personne d’après différents champs :
- Nom
- Prénom
- Date de naissance
- Sexe
Pour savoir comment utiliser l’API, utiliser la documentation : https://deces.matchid.io/deces/api/v1/docs
Via un formulaire, demander à l’utilisateur de remplir les champs. Certains d’entre eux peuvent être laissés vides.
Palier 2
Le palier 2 doit permettre de récupérer des informations par lot. Pour cela, il faut utiliser l’endpoint /agg. Bien penser à renseigner les colonnes sur lesquelles aggréger via le paramètre obligatoire aggs.
Palier 3
Générer des documents exportés, des stats…
Bataille navale
Le but du projet est de réaliser une bataille navale. Pour rappel, les membres du groupe sont :
Sujet
Pour vous aider, une partie du code vous a été fourni.
Palier 1
Code à copier en haut de votre fichier
from IPython.display import display
from functools import reduce
import pandas as pd
def generate_grid(col_count, line_count, boat_count):
return Grid(col_count, line_count, boat_count)
def check_case(grid, num_col, num_line):
return grid._check_case(num_col, num_line)
def set_boat(grid, num_col, num_line):
return grid._set_boat(num_col, num_line)
def set_bombed(grid, num_col, num_line):
return grid._set_bombed(num_col, num_line)
def set_water(grid, num_col, num_line):
return grid._set_water(num_col, num_line)
def boat_remains(grid):
return grid._boat_remains()
def print_grid(grid):
grid._print_grid()
class Grid:
def __init__(self, col_count, line_count, boat_count):
self.col_count = col_count
self.line_count = line_count
self.board = [["" for i in range(col_count)] for j in range(line_count)]
self.boat_count = boat_count
def _check_case(self, num_col, num_line):
return num_line < self.line_count and num_col < self.col_count and not self.board[num_line][num_col]
def _set_boat(self, num_col, num_line):
self.board[num_line][num_col] = "⛵"
def _set_bombed(self, num_col, num_line):
self.board[num_line][num_col] = "💥"
def _set_water(self, num_col, num_line):
self.board[num_line][num_col] = "🌊"
def _print_grid(self):
display(pd.DataFrame(self.board, columns=[chr(i) for i in range(ord("A"), ord("A") + self.col_count)]))
def _boat_remains(self):
return reduce(lambda x, y: ("⛵" in y) or x, self.board, False)
Dans ce palier, il va falloir réaliser deux choses :
-
Demander à l’utilisateur les paramètres du jeu
- La longueur de la grille
- La largeur de la grille
- Le nombre de bateaux à placer
-
Demander aux deux joueurs leur pseudo
Une fois ces informations obtenues, utiliser la fonction generate_grid(col_count, line_count, boat_count)
pour générer
la grille.
Les utilisateurs devront maintenant placer les bateaux sur la gille à l’aide de leurs coordonnées. Pour simplifier, tous les bateaux sont identiques et ont une taille de 3. Ils peuvent être orientés à la verticale ou à l’horizontale.
Pour permettre aux joueurs de placer leurs bateaux, vous procèderez de la manière suivante :
Tant qu’il lui reste des bateaux à placer au joueur :
-
Demander à l’utilisateur d’entrer les coordonnées sous la forme de lettre, ligne (ex: A3, B7…) suivi de la lettre V ou H. Le point indiqué par l’utilisateur correspond au point le plus en haut en gauche du bateau. Il vous faut donc calculer la liste des 3 points sur lesquels placer le bateau
- Note : A1 est la case tout en haut à gauche
- B3V : On place le bateau à la verticale, avec son point le plus haut/gauche en B3. Le bateau occupe donc les cases B3, B4, B5
- C5H : On place le bateau à l’horizontable, avec son point le plus haut/gauche en C5. Le bateau occupe donc les cases C5, C6, C7
-
Vérifier pour chaque case déterminée à l’étape 1 et à l’aide de la fonction
check_case(num_col, num_ligne, grid)
, si elles sont toutes libres (la fonction renvoie True si elle existe et qu’elle est libre. Icigrid
est l’objet renvoyé par la fonctiongenerate_grid
utilisée dans le 1. Les deux premiers arguments sont des nombres, veillez à bien transformer vos lettre en nombre (A = 1, B = 2, etc). -
Plusieurs cas :
- Pas d’erreur lors des checks : alors on peut passer point 4.
- Au moins une erreur lors des checks : demander à l’utilisateur de fournir un autre point pour son bateau (retour point 1)
-
La fonction
set_boat(num_col, num_ligne, grid)
permet de “mettre un bateau” sur la grille donnée en paramètre aux coordonnées indiqués. Il faut donc l’utiliser avec tous les points calculés en 1 et vérifiés en 2.
Faites de même pour le second joueur
Utiliser la fonction print_grid(grid)
pour afficher les deux grilles l’une après l’autre.
Palier 2
Vient maintenant le temps du jeu !
Voilà comment se déroule une partie. Chaque joueur dispose de deux grilles : l’une sur laquelle sont positionnés ses bateaux, et l’autre lui permettant de se remémorer ses précédents coups, en mettant en avant les bateaux ennemis déjà touchés. Il vous fadra_donc générer deux nouvelles grilles de même taille que les deux premières.
Ensuite, chaque joueur joue son tour.
-
Demander au joueur la case qu’il souhaite bombarder
-
Vérifier que la case est valide via la fonction check_case : pour rappelle, elle envoie True si la case est vide ou en dehors des limites. Pensez bien à ce dernier cas ! De plus, pensez que cette vérification se fait sur la grille adverse. Imaginons que nous sommes au tour du Joueur 1 (J1). On note J1(1) le board personnel de J1 (avec ses bateaux) et J1(2) celui qui contient tous ses tirs précédents :
- Si la case adverse (J2(1)) contient un bateau :
- Passer la case J2(1) à “💥” (via
set_bombed(grid, num_col, num_line)
) - Passer la case du board J1(2) “💥” (via
set_bombed(grid, num_col, num_line)
)
- Passer la case J2(1) à “💥” (via
- Si c’est de l’eau :
- Passer la case J2(1) à “🌊” (via
set_water(grid, num_col, num_line)
) - Passer la case du board J1(2) à “🌊” (via
set_water(grid, num_col, num_line)
)
- Passer la case J2(1) à “🌊” (via
- Si la case adverse (J2(1)) contient un bateau :
Faire cela pour chaque joueur, à tour de role, et tant qu’aucun des deux n’a perdu tous ses bateaux. Il vous est
possible de vérifier la présence de bateaux sur une grille via la fonction boat_remains(grid)
qui renvoie True
s’il
reste au moins une case bateau ou False
s’ils sont tous coulés.
Palier 3
Pour ce palier, l’objectif est de pouvoir sauvegarder, pour chaque joueur, le nombre de coups tirés et le nombre de cibles touchés. Pour cela, vous utiliserez un fichier YAML. Des exemples vous sont donnés plus loin dans le sujet.
Fonctions fournies
generate_grid(col_count, line_count, boat_count)
check_case(grid, num_col, num_line):
set_boat(grid, num_col, num_line)
set_bombed(grid, num_col, num_line)
set_water(grid, num_col, num_line)
boat_remains(grid)
print_grid(grid)
Ressources
Fonctions pour lire/écrire dans un fichier Yaml un dictionnaire d
import yaml
from yaml import Loader, Dumper
def load_from_file(filename):
with open(filename, "r") as f:
return yaml.load(f, Loader=Loader)
def save_to_file(filename, d):
with open(filename, "w") as f:
f.write(yaml.dump(d, Dumper=Dumper))
Liens utiles
Exemples de code
Décompte votes
Le site de l’Assemblée Nationale permet de suivre les travaux parlementaires en mettant à dispositions des informations telles que :
- Les textes à l’étude
- Le résultat du vote de chaque texte de loi/amendements
L’objectif de ce projet est de pouvoir automatiser la collecte des données relatives aux votes des députés lors des scrutins.
Membres du groupe :
Sujet
Palier 1
La première étape consiste à utiliser l’API pour récupérer les informations liées à un vote. Le numéro du scrutin devra être demandé de manière interactive à l’utilisateur.
Cinématique attendue :
- Le programme demande à l’utilisateur de rentrer le numéro d’un scrutin
- Le programme détermine l’URL à requêter
- Elles sont de la forme https://www2.assemblee-nationale.fr/scrutins/detail/(legislature)/16/(num)/1693 pour le scrutin 1693
- Une requête est effectuée sur l’URL pour récupérer les informations relatives au scrutin
- Le programme affiche à l’écran les informations suivantes :
- Nombre de votants
- Nombre de suffrages exprimés
- Majorité absolue
- Pour l’adoption
- Contre
- Part de députés, en pourcentage, ayant pris part au vote (sur le 577), à calculer
Récupération de la page pour le vote 1693, localisation de la balise du titre, et affichage des balises soeurs (il vous faudra comprendre ce que le code fait pour l’adapter légèrement) :
from bs4 import BeautifulSoup
import requests
# URL de la page à récupérer
url = "https://www2.assemblee-nationale.fr/scrutins/detail/(legislature)/16/(num)/1693"
# On récupère la page
content = requests.get(url)
if content.status_code != 200:
print("Error")
# On transforme le contenu html récupéré sous la forme d'une chaine de caractères en un contenu que l'on peut manipuler en Python
page = BeautifulSoup(content.content, 'html.parser')
# Nous avons vu via le navigateur que le tag HTML du titre "Synthèse du vote" avait une classe synthese
class_ = "synthese"
# On récupère le bloc ayant la classe synthèse
bloc = page.find('h2', class_=class_)
# On affiche les "frères" du bloc en question
print(bloc.find_next_siblings('p'))
Pour récupérer les informations dans la page, on retrouve un élément marquant proche : le titre “Synthèse du vote”. On remarque que les éléments intéressants sont juste à la suite dans le code HTML : ils ne sont pas contenus dans la balise du titre, mais bien à la suite (si vous êtes perdus, envoyez-moi un mail on fera un appel, ou je ferai un tuto vidéo).
Palier 2
En utilisant la méthode précédente, extraire la liste des députés ayant pris par au vote, et l’afficher
ex :
- Nom Prénom (groupe) : Pour/contre/abst
Palier 3
Exemple d’un menu :
>>> print_menu()
1 - Titre du Menu 1
Description
2 - Titre du Menu 2
Description
>>> menu_nb = input()
2
>>> if menu == '1':
... # Action
... if menu == '2':
... # Autre action
Pour ce dernier palier, il vous faudra enregistrer les éléments des paliers 1 & 2 dans un document Word. L’utilisateur devra pouvoir avoir le choix entre afficher ou enregistrer le résultat.
La cinématique devra être :
- Demande à l’utilsiateur du numéro de scrutin
- Demande à l’utilisateur, via un menu, s’il souhaite :
- Afficher le résultat
- L’enregistrer dans un fichier word
- Dans le cas où l’utilisateur choisit d’enregistrer le fichier, un input doit lui demander le nom du fichier
- Récupération des informations à partir du scrapping
- Enregistrement du fichier ou affichage des données
Eclatez-vous !
Crypto
Le but du projet est de réaliser un outil pour chiffrer et déchiffrer des messages avec des algorithmes historiques. Pour rappel, les membres du groupe sont :
Sujet
En cryptographie, le chiffrement par décalage, aussi connu comme le chiffre de César ou le code de César (voir les différents noms), est une méthode de chiffrement très simple utilisée par Jules César dans ses correspondances secrètes (ce qui explique le nom « chiffre de César ») . Wikipédia
Le chiffre de Vigenère est un système de chiffrement par substitution polyalphabétique dans lequel une même lettre du message clair peut, suivant sa position dans celui-ci, être remplacée par des lettres différentes, contrairement à un système de chiffrement monoalphabétique comme le chiffre de César (qu’il utilise cependant comme composant)
Palier 1
Le palier 1 se concentrera sur l’implémentation du chiffre de César :
- Le programme demande à l’utilisateur s’il souhaite chiffrer ou déchiffrer
- Le programme demande à l’utilisateur le décalage (nombre >= 0)
- Le programme demande à l’utilisateur le message à transformer
- Le programme affiche le message
Palier 2
- Un menu doit permettre de sélectionner l’algorithme à utiliser :
- César
- Vigenère
- Implémenter Vigenere
Palier 3
- Ajouter une option dans le menu pour lire le message
- Depuis un fichier texte : l’utilisateur doit rentrer le nom du fichier
- Depuis un
input
classique
- Ajouter une option dans le menu pour enregistrer le message
- Dans un fichier texte : l’utilisateur doit rentrer le nom du fichier
- Avec un
print
classique
Ressources
Implémenter César
Prenons l’exemple d’une fonction qui permet de réaliser un décalage (shift)
>> > num = ord('y')
121
>> > num + 13 # Décalage
134
>> > chr(134)
'\x86' # Ce n'est pas un caractère affichable ! On a dépassé le z
def apply_shift(letter, shift):
pos_a_in_ascii_table = ord("a")
letter_as_nb = ord(letter)
pos_in_alphabet = letter_as_nb - pos_a_in_ascii_table
# On applique un modulo 26. [1]
count = shift % 26
# new_letter_code contient la position de la lettre dans l'alphabet [2]
new_letter_code = (pos_in_alphabet + count) % 26
letter = chr(pos_in_alphabet + new_letter_code)
return letter
Cette fonction n’est valide que pour les lettres minuscules et pour un décalage positif.
Le principe de l’algorithme est le suivant :
- Créer une chaine de caractère vide
- Parcourir la chaine d’entrée (la boucle
for
semble appropriée)- Pour chaque lettre, récupérer le code associé
- Ajouter au code le décalage
- Vérifier qu’il soit entre
ord('a') et ord('z')
- Retransformer la valeur numérique en caractère
[1] Le modulo va permettre de garder le reste de la division par 26.
Exemple : Si on applique une rotation de 26 à la lettre A, on retombe sur la lettre A. De la même manière, si on applique 11856 rotations à une lettre, on retombera sur cette même lettre (11 856 = 26 * 456). D’un autre côté, si on applique 27 rotations à la lettre A, on tombe sur la lettre B. En effet, on fait un tour complet plus un décalage. On remarque alors qu’il suffit seulement d’utiliser comme décalage le décalage donné, modulo 26 !
[2] Les ordinateurs utilisent une table de correspondance entre les nombres et les caractères. Il s’agit de la table ASCII. Sur le lien, on voit que les premiers caractères… ne sont pas imprimable. Le premier caractère visible est le ‘?’, dont la valeur est 32. La difficulté avec l’algorithme est justement que les lettres minuscules sont comprises entre 97 et 122, et les majuscules entre 65 et 90. Pour faciliter les choses, il vaut mieux se ramener entre 0 et 25, faire les calculs, puis repasser dans l’intervalle voulu.
Implémenter Vigenère
L’implémentation de Vigenère repose sur celle de César : il s’agit de faire un décalage de caractère sur chaque caractère. Ce qui change, c’est qu’au lieu d’avoir un décalage unique, celui-ci change en fonction d’une clef.
Exemple :
- Texte : Bonjour, mon nom est James
- Clef : mandarine
Clef | m | a | n | d | a | r | i | n | e | m | a | n | d | a | r | i | n | e | m | a | n |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Décalage | 12 | 0 | 13 | 3 | 0 | 17 | 8 | 13 | 4 | 12 | 0 | 13 | 3 | 0 | 17 | 8 | 13 | 4 | 12 | 0 | 13 |
Texte clair | B | o | n | j | o | u | r | m | o | n | n | o | m | e | s | t | J | a | m | e | s |
Texte chiffré | N | o | a | m | o | l | z | z | s | z | n | b | p | e | j | b | w | e | y | e | f |
Structure de l’algo :
- Convertir la clef en une liste de décalage (Exemple : mandarine ->
[12, 0, 13, 3, 0, 17, 8, 13, 4]
) - Pour chaque caractère du message :
- Si c’est une lettre : appliquer la rotation et avancer dans la clef
- Si ce n’est pas une lettre, passer au caractère suivant sans effectuer de rotation et sans avancer dans la clef.
Liens utiles
Créer un menu en Python
Exemple d’un menu :
>>> print_menu()
1 - Titre du Menu 1
Description
2 - Titre du Menu 2
Description
>>> menu_nb = input()
2
>>> if menu == '1':
... # Action
... if menu == '2':
... # Autre action
Pour plus d’informations, voir les liens utiles
Pour créer un menu, le plus simple est d’afficher des propositions numérotées et de demander à l’utilisateur le numéro du menu auquel il souhaite accéder.
Exemples de code
Ouvrir un fichier
Pour ouvrir un fichier texte nommé
my_message.txt
with open('my_message.txt', 'r') as f:
content = f.read()
Geoguessr
Pour rappel, les membres du groupe sont :
Sujet
Le but de ce sujet est de pouvoir intéroger une base de données CSV locale pour récupérer des informations utile sur certains pays, ou bien de pouvoir retrouver le ou les pays respectant certains critères
Format de la base de données
Pour la base de données, je vous conseille de respecter le format suivant :
Pays | Langue | Monnaie | … |
---|---|---|---|
France | Français | Euro | |
Royaume-Unis | Anglais | Livre Sterling | |
… |
De cette manière, votre données sera correctement structurée.
Comment gérer le nom des pays
Les fonction utiles
a = "Bienvenue au cours de PyThOn"
print(a.upper())
>>> BIENVENUE AU COURS DE PYTHON
print(a.lower())
>>> bienvenue au cours de python
print(a.title())
>>> Bienvenue Au Cours De Python
Lorsque l’on doit faire une recherche dans une base de données à partir d’une entrée utilisateur, c’est souvent un challenge. En effet, il faut être capable de faire correspondre “FRANCE” avec “France” ou avec “france”, selon le format dans lequel votre nom de pays est stocké.
Une technique généralement utilisée consiste à toujours traiter des données en minuscule. Ansi, même si l’utilisateur décide de taper “FrAnCe”, une fois converti en minuscule, la recherche sera sur “france”. Ci-dessous quelques fonctions utiles (avec à droite des exemples d’utilisation):
- Fonction
lower()
: Retourne la chaine de caractere en minuscule - Fonction
uppe()
: Retourne la chaine de caratere en majuscule - Fonction
title()
: Retourne la chaine de caractere avec toutes les lettres en minuscule a l’exception de la première lettre de chaque mot, en majuscule
Palier 1
Exemple d’utilisation
Voici la liste des champs disponibles :
- Langue
- Monnaie
...
Sélectionner le champ souhaité :
>>> Langue
Entrez le nom d'un pays :
>>> Totoland
Désolé, mais ce pays n'est pas dans notre base
Entrez le nom d'un pays :
>>> France
Le champ Langue pour le pays France vaut Euro
A partir de votre base de données :
- Afficher tous les champs disponibles (dans l’exemple ci-dessus, il s’agit du nom des colonnes)
- Demander à l’utilisateur d’entrer le nom d’un champ
- Demander à l’utilisateur d’entrer le nom d’un pays
- Afficher la valeur du champ demandé en (2) pour le pays entré en (3)
Palier 2
Exemple d’utilisation
Menu
1. Obtenir une information sur un pays
2. Obtenir la liste de pays respectant un critère donné
>>> 2
Voici la liste des champs disponibles :
- Langue
- Monnaie
...
Sélectionner le champ souhaité :
>>> Langue
Sélectionner la valeur à recherche :
>>> Anglais
Les pays pour lesquels le champ Langue vaut Français sont : France
- Demander à l’utilisateur de sélectionner un champ d’intérêt (par exemple la monnaie)
- Demander à l’utilisateur d’entrer une valeur (ex: Euro)
- Afficher le ou les pays correspondant à la valeur entrée
Palier 3
Exemple d’utilisation
Menu
1. Obtenir une information sur un pays
2. Obtenir la liste de pays respectant un critère donné
3. Exporter une fichier Pays
>>> 3
Entrez le nom du pays à exporter :
>>> France
Sélectionner le nom du fichier :
>>> France.txt
Le fichier a été correctement exporté
Contenu du fichier
France
======
Langue : Français
Monnaie : Euro
Dans ce palier, il vous faudra ajouter une troisième possibilité au menu : exporter toutes les informations disponibles sur un pays. Le fichier respectera la forme :
Nom du pays
===========
Nom du champ : Valeur du champ
Nom du champ : Valeur du champ …
Pays limitrophes
Le but du projet est de réaliser un outil permettant d’afficher les pays limitrophes d’un pays particulier. Pour rappel, les membres du groupe sont :
Sujet
Pour ce sujet, vous allez être contraint, dès le premier palier, de manipuler des fichiers. Rançon du talent. Par ailleurs, il vous faudra créer une base de données sur les pays (à voir s’il en existe une).
Palier 1
>> De quel pays souhaitez vous connaître les voisins ?
France
Les voisins de la France sont :
- Belgique
- Luxembourg
- Allemagne
- Suisse
- Italie
- Espagne
-...
Ce premier palier sera dédié aux ‘pays limitrophes’ à proprement parler. Il vous faut créer un fichier CSV de la forme suivante :
France | Belgique |
Belgique | Luxembourg |
Luxembourg | France |
Allemagne | France |
Suisse | Italie |
- Lire le fichier
- Créer un dictionnaire associant chaque pays à ses pays voisins
- Demander à l’utilisateur le pays pour lequel il souhaite avoir la liste des voisins
- Afficher la liste
Palier 2
Exemple d’un fichier YAML file.yaml
France:
population: 67
capitale: Paris
Royaume-Uni:
population: 67
capitale: Londres
...
En python, en utilisant la fonction fournie dans les ressources
>> d = load_from_yaml("file.yaml")
>> d['France']
{'population': 67, 'capitale': 'Paris'}
>> d['Royaume-Uni']
{'population': 67, 'capitale': 'Londres'}
Ajoutons un peu d’informations. Vous aurez besoin pour cela d’un second fichier qui comprendra la liste des informations
sur le pays (monnaie, population, superficie… à vous de voir). Je vous conseille d’utiliser un fichier YAML.
Ce format est très simple et permet, comme avec un dictionnaire, d’associer des clefs à des valeurs (voir ci-contre).
L’avantage d’utiliser ce type de fichier, c’est qu’il existe une bibliothèque permettant de faire la transformation
dict python <=> fichier YAML
.
Dans les ressources, vous trouverez un code permettant de lire un fichier YAML, et un autre permettant d’en écrire un.
- Utiliser la fonction
load_from_file
pour récupérer les pays avec les valeurs souhaitées
Palier 3
Code à copier/coller
!pip install cartopy
import cartopy.crs as ccrs
import cartopy.feature as cf
from matplotlib import pyplot as plt
import cartopy.io.shapereader as shpreader
from cartopy.feature import ShapelyFeature
class Carto:
def __init__(self):
self.shpfilename = shpreader.natural_earth(resolution='110m',
category='cultural',
name='admin_0_countries')
self.reader = shpreader.Reader(shpfilename)
self.proj = ccrs.Miller()
self.ax = plt.axes(projection=self.proj)
self.ax.set_extent([-13, 45, 30, 70])
self.ax.add_feature(cf.COASTLINE, lw=1)
self.ax.add_feature(cf.BORDERS)
self.ax.add_feature(cf.OCEAN,facecolor=(0.5,0.5,0.5))
def color_country(self, country_name, color='lime'):
country = [country for country in self.reader.records() if country.attributes["NAME_LONG"] == country_name][0]
shape_feature = ShapelyFeature([country.geometry], ccrs.PlateCarree(), facecolor=color, edgecolor='black', lw=1)
self.ax.add_feature(shape_feature)
def show(self):
plt.show()
Exemple d’utilisation (essayez pour voir le résultat)
c = Carto()
c.color_country("Germany")
c.color_country("Spain")
c.color_country("Italy")
c.color_country("Luxembourg")
c.color_country("Belgium")
c.color_country("Switzerland")
c.color_country("United Kingdom")
c.color_country("France", 'red')
c.show()
Dans ce palier, vous allez pouvoir afficher les pays limitrophes au pays recherché sur une carte !
- Vous devez copier/coller le code ci-contre dans votre playbook, tout en haut.
- A partir des exemples, vous devriez pouvoir générer les cartes dont vous avez besoin
L’idée étant que lorsque je tape le nom d’un pays européen, ce pays soit colorié en rouge et les pauys voisins en vert
Ressources
Fonctions pour lire/écrire dans un fichier Yaml un dictionnaire d
import yaml
from yaml import Loader, Dumper
def load_from_file(filename):
with open(filename, "r") as f:
return yaml.load(f, Loader=Loader)
def save_to_file(filename, d):
with open(filename, "w") as f:
f.write(yaml.dump(d, Dumper=Dumper))
Liens utiles
Exemples de code
Alertes marché
Le but du projet est de réaliser une application d’analyse sur les indices boursiers. Pour rappel, les membres du groupe sont :
Sujet
Pour pouvoir réaliser ce projet, je vous conseille d’utiliser le site Alphavantage. Avant tout, il vous faudra créer une clé API
Palier 1
- Demander à un utilisateur :
- Quel indice il souhaite récupérer
- De sélectionner parmi les temporalités proposées
- De sélectionner une date de début : vous devrez afficher tous les résultats à votre disposition après cette date.
Exemple : si vous avez les données à partir du 1er mai :
- Si on demande le 15 avril, vous afficherez toutes les valeurs dont vous disposez, c’est-à-dire depuis le 1er mai
- Si on demande le 3 mai, vous afficherez les valeurs à partir du 3 mai inclus. Ainsi, vous “supprimerez” les valeurs en trop
- Si pas d’erreur (pas de
Error Message
) : afficher tous les résultats. Sinon, afficher une erreur.
Palier 2
- Réaliser un graphique en utilisant pyplot à partir des valeurs (cf. Ressources)
- Faire des statistiques sur les valeurs :
- Plus haut
- Plus bas
- Moyenne
- Médiane…
Palier 3
- Enregistrer les graphiques générés dans des images
- Améliorer le graphique
Ressources
Si
l
contient les séries temporelles sous la forme dont elle est renvoyée par l’api
l = {
'Meta Data': {...},
'Time Series (5min)':
{'2022-05-06 20:00:00': {'1. open': '137.6700', '2. high': '137.6700', '3. low': '137.6700', '4. close': '137.6700', '5. volume': '103'},
'2022-05-06 19:55:00': {'1. open': '137.6500', '2. high': '137.6700', '3. low': '137.6500', '4. close': '137.6700', '5. volume': '1689'},
...
}
}
l = l["Time Series (5 min)"]
dates = [k for k in l.keys()]
dates.sort()
val = []
for date in dates:
val.append(l[date]['1. open'])
A l’issue du script, dates contient la liste des dates et val la liste des valeurs. Ces deux listes sont ordonnées et les valeurs correspondent bien aux dates à la même position. Pour afficher un graphique
import matplotlib.pyplot as plt
plt.plot(dates, val)
Vous aurez un premier graphique. A vous de l’embellir à l’aide de la documentation et de vos recherches
Liens utiles
Exemples de code
Mots clé media
Le but du projet est de réaliser un outil capable de récupérer les articles de presse à partir d’une date. Pour rappel, les membres du groupe sont :
Sujet
Sur internet, tous les sites sont tenus de mettre à disposition de leurs visiteurs un sitemap
. Ce document liste l’ensemble des pages présentes sur le site. En théorie, ces documents doivent suivre un format particulier, le xml. En pratique, c’est un peu plus compliqué, et certains d’entre eux s’affranchissent des règles pour proposer leur propre format (Le Figaro par exemple).
Le sitemap est un bon moyen d’automatiser la collecte d’information sur les sites d’actualités : en effet, il ne contient que le strict nécessaire et classent généralement les articles par date.
Palier 1
Exemple avec le site lefigaro.fr
Entrer l'année:
> 2022
Entrer le mois:
> 12
Entrer le jour:
> 31
Les articles publiés le 31/12/2022 sont les suivants :
- Les 46 soldats ivoiriens condamnés au Mali rentreront «bientôt», selon le président Ouattara
- Covid-19 : l'UE veut une attitude commune face aux voyageurs de Chine
- La Corée du Nord tire un missile balistique de courte portée
- Quatre croisiéristes condamnés à payer plus de 450 millions de dollars pour leurs escales à Cuba
- La situation dans l'est de la RDC est «pire que jamais», estime Kagame
- Feu d'artifice du Nouvel an annulé à Rennes en raison de la météo
- Réforme des retraites, coupures d'électricité, prix de l'énergie... Ce qu'il faut retenir des premiers «vœux aux Français» de «Macron 2»
[...]
Le premier palier vise à récupérer la liste des articles pour un jour donné sur le figaro. Il s’agit donc de demander à l’utilisateur trois informations (sous la forme de trois nombres) :
- L’année
- Le mois
- Le jour
A partir de ces trois données, il devient possible de déterminer l’URL de la page web contenant les articles qui nous intéressent.
Palier 2
Les jours de la semaine en Python
import datetime
year = 2022
month = 12
day = 31
date = datetime.datetime(year, month, day)
day_of_the_week = date.weekday()
monday_date = date - datetime.timedelta(days=day_of_the_week)
print(monday_date.date())
> 2022-12-26
Parsing d’une chaine de caractères xml
import xml.etree.ElementTree as ET
# La variable response contient la réponse à la requête HTTP (cf exemple)
content = response.content
tree = ET.fromstring(content)
root = tree.getroot()
- Ajouter le support du site lemonde.fr. Cela nécessitera d’ajouter un input supplémentaire en amont du choix de la date. Celui-ci devra permettre de sélectionner le site à requêter
Contrairement au Figaro, Le Monde utilise le format XML pour classer les données, et proposer plus de contexte au lecteur.
Palier 3
- Pour valider ce palier, il faudra être capable de faire des statistiques sur les différents articles. Par exemple :
- Fréquence des mots les plus utilisés
- Objectivité/subjectivité des tweets
Le but est de pouvoir récupérer, pour un jour donné, les mots les plus utilisés. Le mieux serait de croiser les données entre les deux sites supportés : est-ce que les mêmes mots sont présents ?
Ressources
Liens utiles
Exemples de code
Récupération d’une page HTML à partir de l’URL
import requests
response = requests.get("https://articles.lefigaro.fr/202212/29/")
if response.status_code != 200:
print("Error")
else:
# On affiche le contenu de la page
print(response.content)
Parsing d’une page web
# Récupération du module de parsing
from bs4 import BeautifulSoup
# Cf exemple précédent
page = response.content
# On parse le contenu de la page téléchargée et on stocke le résultat dans la variable parsed
parsed = BeautifulSoup(page, parser="html.parser")
# On stocke dans l l'ensemble des éléments de la page dont la classe est list-group
l = parsed.find_all(class_="list-group")
Morpion
Pour rappel, les membres du groupe sont :
Sujet
L’objectif de ce projet est de vous faire réaliser un jeu du Morpion interactif.
Code à copier dans le projet. Il est à utiliser tel quel
import pandas as pd
class Grid:
def __init__(self, col_count=3, line_count=3):
self.col_count = col_count
self.line_count = line_count
self.board = [["" for i in range(col_count)] for j in range(line_count)]
def _check_case(self, num_col, num_line):
return num_line < self.line_count and num_col < self.col_count and not self.board[num_line][num_col]
def _set_X(self, num_col, num_line):
self.board[num_line][num_col] = "X"
def _set_O(self, num_col, num_line):
self.board[num_line][num_col] = "O"
def _print_grid(self):
display(pd.DataFrame(self.board, columns=[chr(i) for i in range(ord("A"), ord("A") + self.col_count)]))
def generate_grid(col_count, line_count):
return Grid(col_count, line_count)
def check_case(grid, num_col, num_line):
return grid._check_case(num_col, num_line)
def set_X(grid, num_col, num_line):
return grid._set_X(num_col, num_line)
def set_O(grid, num_col, num_line):
return grid._set_O(num_col, num_line)
def print_grid(grid):
grid._print_grid()
Palier 1
Vous allez faire s’affronter deux joueurs
- Demander à l’utilisateur 1 son nom
- Demander à l’utilisateur 2 son nom
- Tant que la grille n’est pas pleine ou qu’il n’y a pas de gagnant
- Demander à chaque utilisateur les coordonnées sous la forme “A1” et placer le X ou le O correspondant
- Afficher le ou les vainqueurs (partie nulle)
Palier 2
Les joueurs doivent pouvoir entrer un nombre de manches. Chaque victoire rapporte 1 point, un match nul rapporte 0.5 et une défaite ne rapporte pas de point.
A la fin des manches, un message doit désigner le vainqueur et afficher son nombre de points
Palier 3
Les scores de chaque joueur doivent être sauvegardés dans un fichier YAML. Si un utilisateur entre le nom d’un joueur déjà en base, son score doit être chargé depuis le fichier.
Pendu
Le but du projet est de réaliser un jeu du pendu interactif. Pour rappel, les membres du groupe sont :
Sujet
Palier 1
Une structure qui pourrait être intéressante (pas obligatoire):
def get_word_from_user_input():
# Cette fonction récupère l'entrée utilisateur, vérifie qu'elle est correcte et la renvoie
# Si elle n'est pas correcte, alors elle affiche un message d'erreur et redemande à l'utilisateur
def get_letter_from_user_input():
# Cette fonction récupère l'entrée utilisateur, vérifie qu'elle est correcte et la renvoie
# Si elle n'est pas correcte, alors elle affiche un message d'erreur et redemande à l'utilisateur
[...] # Potentiellement autre chose (Mise à jour du mot, de l'affichage, des messages... à vous de voir !)
def game_loop():
# Récupère le mot à partir de get_word_from_user_input
# Répète les appels à get_letter_from_user_input tant que le joueur n'a pas trouvé le mot ou qu'il
# n'est pas à court de points
# Affiche le score !
Pour valider ce premier palier, le programme doit exécuter les tâches suivantes :
- Un premier champ demande au joueur d’entrer un mot : ce mot sera celui à faire deviner
- Un second champ permet de savoir combien d’erreur peut faire le joueur
- Le programme affiche autant de traits
_
que de lettres à faire deviner - Un champ permet au joueur de saisir une lettre
- On affiche le mot en remplaçant les
_
par les lettres découvertes et le nombre de vie restantes
Palier 2
Pour valider ce palier, vous devez :
- L’utilisateur doit pouvoir entrer le chemin vers un fichier contenant une liste de mot (un mot par ligne)
- Le programme sélectionne alors un mot au hasard parmi les mots dans le fichier et tente de le faire
Palier 3
Exemple d’un fichier YAML file.yaml
mot:
score: 1
player: Joel
vital:
score: 5
player: Louis
...
En python, en utilisant la fonction fournie dans les ressources
>> d = load_from_yaml("file.yaml")
>> d['mot']
{'score': 1, 'player': 'Joel'}
>> d['vital']
{'score': 5, 'player': 'Louis'}
Pour valider ce dernier palier, vous devez :
- Réaliser un tableau des scores, pour cela
- Demander le nom du joueur avant chaque nouvelle partie
- Le score correspond au nombre de tentatives du joueur pour trouver le mot
- Stocker ce résultat dans un fichier contenant les meilleurs scores
Pour le tableau des scores, un conseil est d’utiliser le format YAML. Ce format est très simple et permet, comme avec
un dictionnaire, d’associer des clefs à des valeurs (voir ci-contre).
L’avantage d’utiliser ce type de fichier, c’est qu’il existe une bibliothèque permettant de faire la transformation
dict python <=> fichier YAML
.
Dans les ressources, vous trouverez un code permettant de lire un fichier YAML, et un autre permettant d’en écrire un. Le fonctionnement de votre programme doit être le suivant :
- Utiliser la fonction
load_from_file
pour récupérer le tableau des scores dans un dictionnaire - Demander au joueur son nom
- Faire jouer
- Une fois la partie terminée:
- Vérifier le meilleur score dans le dictionnaire
- S’il est meilleur, le mettre à jour
- Sauvegarder avec
save_to_file
Ressources
Créer une liste à partir d’une chaine de caractère
def split_str_newline(text):
return text.split('\n')
Ici
\n
est un retour à la ligne : on coupe le texte à chaque saut de ligne, et chaque ligne est donc un élément de la liste
Implémentation
Afin de faciliter les opérations, voici une méthode d’implémentation du jeu. Il faut maintenir, en plus de la chaine de caractères contenant la solution, une liste de booléens (True ou False) de la taille du mot.
Exemple:
Exemple associé au tableau ci-contre
solution = "harbulot"
liste = [False] * len(solution) # On génère une liste de la même taille que celle du mot, dont toutes les valeurs sont à False
liste[0] = True # On dévoile le H
liste[-1] = True # On dévole le T. Pour rappel, l'indice -1 est celui du dernier élément
H | A | R | B | U | L | O | T |
---|---|---|---|---|---|---|---|
True | False | False | False | False | False | False | True |
De cette manière, une lettre n’est affichée que si la valeur qui lui est associée est à True
. Pour dévoiler une lettre,
il suffit alors de passer le booléen qui lui est associé à True
Liens utiles
- How to check if a string contains only letters in Python
- La fonction
len
- La fonction
split
*Introduction au YAML
Pour récupérer le contenu du fichier
toto.txt
dans la variabletext
:
Exemples de code
try:
filename = "toto.txt"
with open(filename, 'r', encoding='utf-8') as my_file:
text = my_file.read()
except FileNotFoundError:
print(f"Could not open file : not found. Check that {filename} exists")
Penser à remplacer
toto.txt
par le nom du fichier. Fonctions pour lire/écrire dans un fichier Yaml un dictionnaire d
import yaml
from yaml import Loader, Dumper
def load_from_file(filename):
with open(filename, "r") as f:
return yaml.load(f, Loader=Loader)
def save_to_file(filename, d):
with open(filename, "w") as f:
f.write(yaml.dump(d, Dumper=Dumper))
Pile ou face
Le but du projet est de réaliser un pile ou face. Pour rappel, les membres du groupe sont :
Sujet
Palier 1
Exemple d’interaction
>>> Combien de manches ?
4
>>> Choix ?
PPFF
Manche 1 : Pile. C'est gagné !
Manche 2 : Face. Perdu
Manche 3 : Face. C'est gagné !
Manche 4 ! Face. C'est gagné !
Score : 3 points
Pour réaliser ce palier:
- Demander à l’utilisateur un nombre de manches
- Demander à l’utilisateur de rentrer une chaine de caractère représentant ses choix:
- P ou p pour pile (les deux doivent fonctionner)
- F ou f pour face
- Exemples:
- Manche en 4 avec Pile, Pile, Face, Face : ppff ou PpFf ou ppFF…
- Manche en 2 avec Pile, Face : pf ou PF ou pF…
- Pour chaque manche, tirer un nombre aléatoire (0 ou 1, cf Ressources)
- 0 = Pile
- 1 = Face
- Afficher pour le joueur le score manche par manche
Palier 2
>>> Combien de manches ?
4
>>> Choix ?
PPFF
>>> Montant joué
10.50
Manche 1 : Pile. C'est gagné ! Vous avez 21.00€
Manche 2 : Face. Perdu. Il vous reste 7€
Manche 3 : Face. C'est gagné ! Vous avez 14.00€
Manche 4 ! Face. C'est gagné !Vous avez 28.00€
Score : 3 points. Vous avez gagné 18€ par rapport à votre mise initiale, bravo !
Ajoutons un peu d’enjeu à ce pile ou face.
- Vous devez demander au joueur une somme qu’il est prêt à parier (nombre à virgule)
- La règles est la suivante :
- Chaque fois que le joueur a raison, il double son gain
- Chaque fois qu’il a tort, il est divisé par 3
- ATTENTION : si le joueur est à court d’argent, la partie doit s’arrêter !
- Les informations suivantes doivent apparaitre
- L’argent en poche à chaque manche
- Le gain ou la perte par rapport à la mise de départ
Palier 3
John: 120.52
Loic: 3.00
Etienne: 8.00
>> d = load_from_file("balance.yaml")
>> d["John"]
120.52
>> "Ben" in d
False
>> d["Ben"] = 100.00
>> save_to_file(d)
Dans ce palier, vous allez devoir tenir à jour les comptes des joueurs dans un fichier.
- Vous devez demander au joueur son nom
- Si le joueur n’existe pas, lui donner 100.00€
- Si le joueur existe, récupérer l’argent qu’il lui reste
- Demander au joueur le nombre de manches, le choix et l’argent joué
- Bien vérifier qu’il ne joue pas plus que ce qu’il possède !
- A la fin de la partie, enregistrer dans le fichier les comptes mis à jour
Pour le fichier de suivi des comptes, un conseil est d’utiliser le format YAML. Ce format est très simple et permet,
comme avec un dictionnaire, d’associer des clefs à des valeurs (voir ci-contre). L’avantage d’utiliser ce type de
fichier, c’est qu’il existe une bibliothèque permettant de faire la transformation
dict python <=> fichier YAML
.
Dans les ressources, vous trouverez un code permettant de lire un fichier YAML, et un autre permettant d’en écrire un. Le fonctionnement de votre programme doit être le suivant :
- Utiliser la fonction
load_from_file
pour récupérer la liste des joueurs dans un dictionnaire - Regarder dans le dictionnaire si le joueur est présent
- S’il est présent, récupérer le montant de son compte
- S’il n’est pas présent, l’ajouter avec un compte de 100.00€
- Faire jouer
- Sauvegarder avec
save_to_file
Ressources
Fonctions pour lire/écrire dans un fichier Yaml un dictionnaire d
import yaml
from yaml import Loader, Dumper
def load_from_file(filename):
with open(filename, "r") as f:
return yaml.load(f, Loader=Loader)
def save_to_file(filename, d):
with open(filename, "w") as f:
f.write(yaml.dump(d, Dumper=Dumper))
Liens utiles
Exemples de code
Scraping brevet INPI
Pour rappel, les membres du groupe sont :
Sujet
L’objectif de ce projet est de vous faire récupérer des informations relatives à des brevets publiés sur le site de l’INPI
Palier 1
Demander à l’utilisateur d’entrer le numéro d’un brevet et trouver les informations relatives à celui-ci :
- Titre
- Date de publication de la demande
- Date de dépôt
- Date de priorité
- Abrégé
- Liste des inventeurs
Palier 2
A partir d’un numéro de SIREN, récupérer les informations relatives à une entreprise :
- Nom prénoms
- SIREN
- Date d’immatriculation
- Début d’activité
- Forme juridique
- Activité principale
- Adresse du siège
Palier 3
A partir d’un SIREN d’entreprise, afficher les informations relatives à cette entreprise, ainsi que la liste des brevets (limitée à 100) qu’elle a déposés. Enregistrer cette liste dans un CSV suivant le format :
Numéro | Titre | Date de publication de la demande | Date de dépôt | Date de priorité | Abrégé | Liste des inventeurs |
---|---|---|---|---|---|---|
FR3100683 | PROCEDE DE TRANSFERTS INTERCELLULAIRES | 12/03/2021 | 05/09/2019 | 05/09/2019 | L’invention concerne un procédé pour gérer le changement de cellule d’un utilisateur mobile au sein d’un système de communication dans lequel on utilise une boucle de prédiction - lorsque la condition de sortie de l’utilisateur mobile n’est pas vérifiée (26b), l’utilisateur mobile détermine (31) la valeur de puissance du signal estimée à partir d’une valeur prédite à l’instant futur t+Δt, l’utilisateur mobile compare la valeur de puissance prédite du signal émis par la station de base de desserte et la valeur de puissance prédite du signal émis par une station de base voisine, - l’utilisateur mobile vérifie si la condition de sortie est vérifiée, et si elle est vérifiée (32a), l’utilisateur mobile reste connecté à la station de base de desserte, - si la condition de sortie n’est pas vérifiée, (32b), l’utilisateur mobile compare l’instant t mes de mesure de la puissance à une valeur seuil t seuil et - retourne (27a) à la mesure de puissance des signaux (25) si l’instant de mesure est inférieur à la valeur du seuil - transmet la valeur de puissance mesurée pour le signal émis par la station de base de desserte et/ou par la station de base voisine, (28), afin que la station de base de desserte déclenche un changement de cellule, (29). Figure pour l’abrégé : Fig. 3 | PANAITOPOL Dorin - 92622 GENNEVILLIERS CEDEX - FR, PIPON François - 92622 GENNEVILLIERS CEDEX - FR, VIJAYANDRAN Luxmiram - 92622 GENNEVILLIERS CEDEX - FR, HAZIZA Nathalie - 92622 GENNEVILLIERS CEDEX - FR, PAINCHAULT Rémi - 92130 ISSY LES MOULINEAUX - FR |
FR3105895 | Dispositif radiofréquence | 02/07/2021 | 26/12/2019 | 26/12/2019 | L’invention concerne un dispositif radiofréquence comprenant au moins les éléments suivants : - Une antenne (30), - Un groupe de filtres (32) connecté entre l’antenne (30) et un émetteur/récepteur (33) comprenant une partie convertisseur (CAN, CNA) caractérisé en ce que : - Le groupe de filtres (32) comprend N filtres ayant des bandes de fréquences BN distinctes dans une largeur de bande donnée BT, le groupe de filtres (32) est relié à un gestionnaire (35) sélectionnant au moins un des filtres Fj du groupe de filtres afin d’atténuer un premier type de signaux perturbateurs P1, au voisinage de la fréquence centrale du canal à recevoir, - L’émetteur/récepteur (33) comprend un étage comprenant un filtre variable (333, 335, 341, 342), le filtre variable est configuré afin d’éliminer un deuxième type de signaux perturbateurs P2, ledit étage est connecté entre le groupe de filtres (32) et l’ensemble de conversion analogique-numérique et numérique-analogique, - Le nombre N de filtres du groupe de filtres est choisi en tenant compte de la valeur de bande de fréquences de fonctionnement de l’antenne, de la valeur d’une largeur de canal Bc choisie et d’un coefficient δ tenant compte des effets de recouvrement. Figure pour l’abrégé : Fig. 3. | MAILLOUX Pierre-Yves - 49309 CHOLET - FR, DEMENITROUX Wilfried - 49309 CHOLET - FR, BERTHOU Nicolas - 49300 CHOLET - FR |
Scraping WW1
Pour rappel, les membres du groupe sont :
Sujet
En cours de rédactions
Palier 1
A partir du site de la mairie de paris, afficher les informations relatives à une ou des personnes dont le nom correspond à celui entré par l’utilisateur.
Palier 2
A partir d’une date, afficher toutes les personnes décédées ce jour-là
Palier 3
Proposer à l’utilisateur de sauvegarder les résultats dans un fichier
Scrapping Instagram
Pour rappel, les membres du groupe sont :
Sujet
L’objectif de ce sujet est de pouvoir récupérer automatiquement des informations sur des profils instagram. Pour cela, il vous faudra utiliser l’API instagram.
Méthodologie
Passer du code Postman au code Python
# Le code généré par Postman se termine de la manière suivantes
...
print(response.text)
# Pour extraire le dictionnaire et l'enregistrer dans une variable, remplacer la ligne par
a = respone.json()
# a contient maintenant le dictionnaire contenu dans la réponse de l'API
Lorsque vous vous connectez sur instagram, que ce soit par l’application mobile ou le site internet, votre navigateur réalise des requêtes auprès de l’API pour récupérer les éléments à afficher dans l’interface graphique.
Le principe de cet exercice est donc d’identifier ces requêtes pour les reproduire programmatiquement et ainsi récupérer les données désirées.
L’utilisation de Postman est fortement encouragée pour vous permettre de reproduire les requêtes réalisées par votre navigateur, et également pour les “traduire” en Python.
La méthodologie de recherche et de copie des requête a été montrée en cours. Dans le cas où vous ne sauriez plus comment faire, n’hésitez pas à m’envoyer un email afin de prévoir une présentation en visio de la technique.
Palier 1
Exemple
Entrez le pseudo de l'utilisateur :
>>> barackobama
Nom d'utilisateur : barackobama
Nom complet : Barack Obama
Biographie : Dad, husband, President, citizen.
Nombre de followers : 36596311
Nombre de followings : 9
Compte vérifié : oui
---
Entrez le pseudo de l'utilisateur :
>>> toto_le_dozo
Ce compte n'existe pas
---
Savoir si un utilisateur n’existe pas
import requests
response = requests.get("https://www.instagram.com/toto_le_dozo/")
if response.status_code != 200:
print("Erreur")
else:
print("OK")
...
Lors du lancement du script, celui-ci doit :
-
Demander un nom d’utilisateur instagram (via la fonction
input()
) -
Récupérer les informations suivantes sur l’utilisateur :
- Nom d’utilisateur
- Nom complet
- Biographie
- Nombre de followers
- Nombre de followings
- Compte vérifié (oui/non)
Palier 2
Télécharger une photo depuis une URL
import requests
# Mettre ici les headers fournis pas Postman
headers = {}
url = "https://scontent-cdg4-3.cdninstagram.com/v/t51.2885-19/328293226_3430201983859375_8373421132276327740_n.jpg?stp=dst-jpg_s320x320&_nc_ht=scontent-cdg4-3.cdninstagram.com&_nc_cat=1&_nc_ohc=VUuB2D3wZicAX89XCBE&edm=AOQ1c0wBAAAA&ccb=7-5&oh=00_AfDxoxnK5UDsUQH8bdb-HNngCo3yfNkzgdWMh9VYitLgCw&oe=65551338&_nc_sid=8b3546"
rep = requests.get(url, headers=headers)
if rep.status_code != 200:
print("Error while downloading picture")
else:
picture = rep.content
# Picture contient l'image. Il n'est pas possible de la print, mais on peut l'enregistrer
Enregistrer une photo dans un fichier
# my_picture contient la photo (par exemple suite à un téléchargement comme dans l'exemple précédent
my_picture = ...
# Nous utilisons 'w' pour écriture, mais nous ajoutons le 'b' pour indiquer que nous n'allons pas écrire du texte
# dans ce fichier, mais de la donnée *brute*
with open('ma_photo.jpg', 'wb') as file:
file.write(my_picture)
Dans ce palier, il vous faudra récupérer la photo de profil de l’utilisateur, et la sauvegarder. Pour cela, identifiez l’URL de la photo de profil, et utilisez la pour la télécharger (à l’aide des exemples de code proposés)
- Récupérer la photo de profil
Palier 3
Exemple de fonctionnement du script:
Entrez les noms des utilisateurs :
>>> barackobama,emmanuelmacron
Nom d'utilisateur : barackobama
Nom complet : Barack Obama
Biographie : Dad, husband, President, citizen.
Nombre de followers : 36596311
Nombre de followings : 9
Compte vérifié : oui
---
Nom d'utilisateur : emmanuelmacron
Nom complet : Emmanuel Macron
Biographie : Président de la République française.
Nombre de followers : 3318519
Nombre de followings : 130
Compte vérifié : oui
---
Souhaitez-vous exporter les résultats dans un fichier CSV ? [oui/non]
>>> ouii
Réponse incorrecte
Souhaitez-vous exporter les résultats dans un fichier CSV ? [oui/non]
>>> oui
Entrez le nom du fichier
>>> export.csv
Le fichier a été exporté !
- Au lieu de ne demander qu’un seul nom d’utilisateur, le programme doit demander une liste d’utilisateurs, séparés par des virgules
- Générer un export CSV : un utilisateur par ligne. Les colonnes reprennent les informations demandées au palier 1. La photo de profil ne pourra pas être ajoutée
Base de donneés médicaments
L’objectif de ce sujet est de pouvoir travailler sur les médicaments et leurs principes actifs. Différentes bases de données vous seront nécessaire pour cet exercice. Elles sont disponibles en téléchargement sur le site de la BASE DE DONNÉES PUBLIQUE DES MÉDICAMENTS. La lecture de ce document explicatif est vivement recommandée.
Palier 1
Ouvrir un CSV avec un séparateur tabulation pour afficher toutes les lignes
import csv
# Etonnament, les français n'utilisent pas l'encodage UTF-8 standard, mais le 'ansi'
with open('C:\\Users\\Paul\\Downloads\\CIS_bdpm.txt', 'r', encoding='ansi', newline='') as csv_file:
# Utilisation de la tabulation comme séparateur #French #PasCommeToutLeMonde
reader = csv.reader(csv_file, delimiter='\t')
for line in reader:
print(line)
Dans ce premier palier, vous devrez, à partir des informations recueillies au sein des bases de données des médicaments, permettre à l’utilisateur d’interroger la base de données de la manière suivante :
- Demander à l’utilisateur le nom d’un médicament
- Afficher les éléments détaillés dans la liste ci-dessous :
- Son nom
- Son code CIS
- Sa forme pharmaceutique
- Une liste de voies d’administration
- Le Statut administratif de l’autorisation de mise sur le marché (AMM)
- Type de procédure d’autorisation de mise sur le marché (AMM)
- Etat de commercialisation
- Date d’AMM (format JJ/MM/AAAA)
- Numéro de l’autorisation européenne
Palier 2
Exemple d’exécution
== Menu principal ==
1. Lister les informations à partir du nom d'un médicament
1. Lister les informations à partir du code CIS
3. Quitter
Que souhaitez-vous faire ? > 4
Mauvais choix
== Menu principal ==
1. Lister les informations à partir du nom d'un médicament
1. Lister les informations à partir du code CIS
3. Quitter
Que souhaitez-vous faire ? > 1
Entrer le nom d'un médicament > EBERTHINUM BOIRON, degré de dilution compris entre 4CH et 30CH ou entre 8DH et 60DH
Nom : EBERTHINUM BOIRON, degré de dilution compris entre 4CH et 30CH ou entre 8DH et 60DH
Code CIS : 62962232
Forme pharmaceutique : comprimé et solution(s) et granules et poudre et pommade
Liste de voies d'administration :
- cutanée
- orale
- sublinguale
Statut administratif de l’autorisation de mise sur le marché (AMM) : Autorisation active
Type de procédure d'autorisation de mise sur le marché (AMM) : Enreg homéo (Proc. Nat.)
Etat de commercialisation : Commercialisée
Date d’AMM (format JJ/MM/AAAA) : 14/05/2020
Numéro de l’autorisation européenne :
== Menu principal ==
1. Lister les informations à partir du nom d'un médicament
1. Lister les informations à partir du code CIS
3. Quitter
Que souhaitez-vous faire ? > 2
Entrer le code CIS d'un médicament > 62962232
Code CIS : 62962232
- Désignation de l'élément pharmaceutique : comprimé
- Code de la substance : 64892
- Dénomination de la substance : EBERTHINUM POUR PRÉPARATIONS HOMÉOPATHIQUES
- Dosage de la substance : 4CH à 30CH et 8DH à 60DH
- Référence de ce dosage (exemple : '[pour] un comprimé') : un comprimé
- Nature du composant (principe actif : « SA » ou fraction thérapeutique : « ST ») : SA
- Numéro permettant de lier, le cas échéant, substances actives et fractions thérapeutiques : 18
Code CIS : 62962232
- Désignation de l'élément pharmaceutique : granules
- Code de la substance : 64892
- Dénomination de la substance : EBERTHINUM POUR PRÉPARATIONS HOMÉOPATHIQUES
- Dosage de la substance : 4CH à 30CH et 8DH à 60DH
- Référence de ce dosage (exemple : '[pour] un comprimé') : un comprimé
- Nature du composant (principe actif : « SA » ou fraction thérapeutique : « ST ») : SA
- Numéro permettant de lier, le cas échéant, substances actives et fractions thérapeutiques : 17
Code CIS : 62962232
- Désignation de l'élément pharmaceutique : pommade
- Code de la substance : 64892
- Dénomination de la substance : EBERTHINUM POUR PRÉPARATIONS HOMÉOPATHIQUES
- Dosage de la substance : 4CH à 30CH et 8DH à 60DH (pommade à 4 %)
- Référence de ce dosage (exemple : '[pour] un comprimé') : un comprimé
- Nature du composant (principe actif : « SA » ou fraction thérapeutique : « ST ») : SA
- Numéro permettant de lier, le cas échéant, substances actives et fractions thérapeutiques : 24
Code CIS : 62962232
- Désignation de l'élément pharmaceutique : poudre orale
- Code de la substance : 64892
- Dénomination de la substance : EBERTHINUM POUR PRÉPARATIONS HOMÉOPATHIQUES
- Dosage de la substance : 4CH à 30CH et 8DH à 60DH
- Référence de ce dosage (exemple : '[pour] un comprimé') : un comprimé
- Nature du composant (principe actif : « SA » ou fraction thérapeutique : « ST ») : SA
- Numéro permettant de lier, le cas échéant, substances actives et fractions thérapeutiques : 23
Code CIS : 62962232
- Désignation de l'élément pharmaceutique : solution buvable en ampoules
- Code de la substance : 64892
- Dénomination de la substance : EBERTHINUM POUR PRÉPARATIONS HOMÉOPATHIQUES
- Dosage de la substance : 4CH à 30CH et 8DH à 60DH
- Référence de ce dosage (exemple : '[pour] un comprimé') : un comprimé
- Nature du composant (principe actif : « SA » ou fraction thérapeutique : « ST ») : SA
- Numéro permettant de lier, le cas échéant, substances actives et fractions thérapeutiques : 25
Code CIS : 62962232
- Désignation de l'élément pharmaceutique : solution buvable en gouttes
- Code de la substance : 64892
- Dénomination de la substance : EBERTHINUM POUR PRÉPARATIONS HOMÉOPATHIQUES
- Dosage de la substance : 4CH à 30CH et 8DH à 60DH
- Référence de ce dosage (exemple : '[pour] un comprimé') : un comprimé
- Nature du composant (principe actif : « SA » ou fraction thérapeutique : « ST ») : SA
- Numéro permettant de lier, le cas échéant, substances actives et fractions thérapeutiques : 19
== Menu principal ==
1. Lister les informations à partir du nom d'un médicament
1. Lister les informations à partir du code CIS
3. Quitter
Que souhaitez-vous faire ? > 3
Dans ce palier, nous voulons afficher tous les composants associés à un code CIS entré par l’utilisateur
- Créer un menu qui demande à l’utilisateur ce qu’il souhaite rechercher
- Le nom d’un médicament (taper 1)
- Un code CIS (taper 2)
- Quitter (taper 3)
- Si l’utilisateur tape 1, il doit pouvoir retrouver les éléments du palier 1
- Si l’utilisateur tape 2, il doit :
- Entrer un code CIS
- Si le code CIS n’existe pas, le programme affiche une erreur
- Sinon, il doit afficher, pour toutes les lignes qui ont le bon code CIS :
- Code CIS
- Désignation de l’élément pharmaceutique
- Code de la substance
- Dénomination de la substance
- Dosage de la substance
- Référence de ce dosage (exemple : “[pour] un comprimé”)
- Nature du composant (principe actif : « SA » ou fraction thérapeutique : « ST »)
- Numéro permettant de lier, le cas échéant, substances actives et fractions thérapeutiques
- Entrer un code CIS
Palier 3
Dans ce palier, nous voulons exporter les informations obtenues dans un fichier.
- Ajouter une entrée au menu pour demander à l’utilisateur s’il souhaite afficher les résultats ou les mettre dans un fichier. Vous pouvez demander à l’utilisateur le nom du fichier, ou utiliser toujours le même nom (vous avez le choix).
- Créer un menu qui demande à l’utilisateur ce qu’il souhaite rechercher
- Le nom d’un médicament (taper 1)
- Un code CIS (taper 2)
- Quitter (taper 3)
- Demander à l’utilisateur s’il souhaite afficher les résultats, ou les enregistrer dans un fichier
- Si l’utilisateur tape 1, il doit retrouver les éléments du palier 1
- Si l’utilisateur tape 2, il doit retrouver les éléments du palier 2
Répertoire national des élus
A partir des fichier RNE, vous allez devoir permettre à un utilisateur d’effectuer des recherches sur les élus français.
Vous allez devoir télécharger plusieurs fichiers :
Palier 1
Ce palier se concentre uniquement sur le répertoire des maires. Dans ce palier, l’utilisateur doit entrer le nom de famille d’un maire. Vous devrez en retour afficher :
- Si le nom est inconnu, une erreur
- Si le nom est trouvé dans le fichier :
- Nom
- Prénom
- Date de naissance
- Sexe
- Ville d’élection
- Profession
- Début et fin de mandat
- Catégorie socio-professionnelle
Palier 2
Dans ce palier, l’utilisateur doit pouvoir sélectionner la base sur laquelle il souhaite faire la recherche (Maire, Sénateur, Député ou parlementaire européen). Vous pourrez pour cela recourir à un menu permettant à l’utilisateur de choisir la base de recherche.
Palier 3
Dans ce palier, vous devrez proposer à l’utilisateur d’exporter le résultat de la recherche qu’il vient d’effectuer dans un fichier. Le format du fichier est laissé libre, mais un fichier texte semble le plus approprié