Exercice - niveau intermédiaire¶
Les données¶
Nous reprenons le même genre de données marines en provenance de MarineTraffic que nous avons vues dans l’exercice précédent.
from corrections.exo_marine_set import exo_diff
from corrections.exo_marine_set import abbreviated, extendedRappels sur les formats¶
étendu: [id, latitude, longitude, date_heure, nom_bateau, code_pays...]
abrégé: [id, latitude, longitude, date_heure]print(extended[0])The history saving thread hit an unexpected error (OperationalError('no such table: history')).History will not be written to the database.[357008000, 49.47395, -3.810567, '2013-10-08T21:51:00', 'MIGHTY OCEAN', 'PA', '', 'SAO LUIS']
print(abbreviated[0])[255805450, 48.85957, -5.795033, '2013-10-08T22:58:00']
But de l’exercice¶
# chargement de l'exercice
from corrections.exo_marine_set import exo_diffNotez bien une différence importante avec l’exercice précédent : cette fois il n’y a plus correspondance entre les bateaux rapportés dans les données étendues et abrégées.
Le but de l’exercice est précisément d’étudier la différence, et pour cela on vous demande d’écrire une fonction
diff(extended, abbreviated)qui retourne un tuple à trois éléments :
l’ensemble (
set) des noms des bateaux présents dansextendedmais pas dansabbreviated;l’ensemble des noms des bateaux présents dans
extendedet dansabbreviated;l’ensemble des id des bateaux présents dans
abbreviatedmais pas dansextended(par construction, les données ne nous permettent pas d’obtenir les noms de ces bateaux).
# le résultat attendu
result = exo_diff.resultat(extended, abbreviated)
# combien de bateaux sont concernés
def show_result(extended, abbreviated, result):
"""
Affiche divers décomptes sur les arguments
en entrée et en sortie de diff
"""
print(10*'-', "Les entrées")
print(f"Dans extended: {len(extended)} entrées")
print(f"Dans abbreviated: {len(abbreviated)} entrées")
print(10*'-', "Le résultat du diff")
extended_only, both, abbreviated_only = result
print(f"Dans extended mais pas dans abbreviated {len(extended_only)}")
print(f"Dans les deux {len(both)}")
print(f"Dans abbreviated mais pas dans extended {len(abbreviated_only)}")
show_result(extended, abbreviated, result)---------- Les entrées
Dans extended: 7 entrées
Dans abbreviated: 4 entrées
---------- Le résultat du diff
Dans extended mais pas dans abbreviated 2
Dans les deux 2
Dans abbreviated mais pas dans extended 2
Votre code¶
def diff(extended, abbreviated):
"<votre_code>"Validation¶
exo_diff.correction(diff, extended, abbreviated)Des fichiers de données plus réalistes¶
Comme pour l’exercice précédent, les données fournies ici sont très simplistes ; vous pouvez, si vous le voulez, essayer votre code avec des données (un peu) plus réalistes en chargeant des fichiers de données plus complets :
Ce qui donnerait en Python :
# load data from files
import json
with open("data/marine-e2-ext.json", encoding="utf-8") as feed:
extended_full = json.load(feed)
with open("data/marine-e2-abb.json", encoding="utf-8") as feed:
abbreviated_full = json.load(feed)# le résultat de votre fonction sur des données plus vastes
# attention, show_result fait des hypothèses sur le type de votre résultat
# aussi si vous essayez d'exécuter ceci avec comme fonction diff
# la version vide qui est dans le notebook original
# cela peut provoquer une exception
diff_full = diff(extended_full, abbreviated_full)
show_result(extended_full, abbreviated_full, diff_full)---------- Les entrées
Dans extended: 205 entrées
Dans abbreviated: 200 entrées
---------- Le résultat du diff
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[9], line 7
1 # le résultat de votre fonction sur des données plus vastes
2 # attention, show_result fait des hypothèses sur le type de votre résultat
3 # aussi si vous essayez d'exécuter ceci avec comme fonction diff
4 # la version vide qui est dans le notebook original
5 # cela peut provoquer une exception
6 diff_full = diff(extended_full, abbreviated_full)
----> 7 show_result(extended_full, abbreviated_full, diff_full)
Cell In[5], line 14, in show_result(extended, abbreviated, result)
12 print(f"Dans abbreviated: {len(abbreviated)} entrées")
13 print(10*'-', "Le résultat du diff")
---> 14 extended_only, both, abbreviated_only = result
15 print(f"Dans extended mais pas dans abbreviated {len(extended_only)}")
16 print(f"Dans les deux {len(both)}")
TypeError: cannot unpack non-iterable NoneType objectJe signale enfin à propos de ces données plus complètes que :
on a supprimé les entrées correspondant à des bateaux différents mais de même nom ; cette situation peut arriver dans la réalité (c’est pourquoi d’ailleurs les bateaux ont un id) mais ici ce n’est pas le cas ;
il se peut par contre qu’un même bateau fasse l’objet de plusieurs mesures dans
extendedet/ou dansabbreviated.