Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Licence CC BY-NC-ND Thierry Parmentelat & Arnaud Legout Inria - UCA

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, extended

Rappels 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_diff

Notez 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 :

# 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)
Loading...

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 object

Je signale enfin à propos de ces données plus complètes que :