SINAMET : Éléments opérationnels

De Metabolisme territorial
Aller à : navigation, rechercher

Unités

  • Coefficient : k, M, G, T, P, E, Z, Y
  • Coefficient : h(hecto), da (deca), deci (d), centi (c), milli (m), micro (u), nano (n), pico (p), femto(f), atto (a), zepto(z), yocto (y)
  • Énergie : Wh, J, tep
  • Surface : m2, ha, are
  • volume : m3, L
  • Poids : g, t
  • Autre : g eq.CO2, t eq.CO2
  • indirect : embed_

Territoires

Règlementations associées

  • Loi n° 2015-991 du 7 août 2015 portant nouvelle organisation territoriale de la République (1). En ligne.


Recensement des codes d'identification possibles pour les territoires

Codes de références

  • Code Insee. Problème : références communes départements et région, non conformité aux recommandations.
  • NUTS-3
  • ISO 3166 (en versions alpha-2 code, alpha-3 code, numeric code)
  • Wikidata ID, qui recense la plupart des différents codes
  • DBedia

Autres

  • FIPS (code de pays normalisé du Federal Information Processing Standards des États-Unis)
  • Freebase ID
  • National Archives Identifier
  • YSO ID (Finnish Thesaurus and Ontology Service)
  • STW Thesaurus for Economics ID (voir en ligne)
  • TGN ID
  • UNESCO Thesaurus ID
  • FAST Linked Data (http://experimental.worldcat.org/fast/1204289/)

Identifiant relatifs à la géographie des territoires

  • OpenStreetMap Relation identifier
  • GeoNames ID

Identifiant relatifs à des bibliothèques nationales

  • BnF ID
  • National Library of Israel ID,
  • GND (Gemeinsame Normdatei) de la bibliothèque nationale allemande Nationalbibliothek
  • Viaf ID

Identifiant dans des library en ligne

  • Encyclopædia Britannica Online ID, Global Anabaptist Mennonite Encyclopedia Online ID

Identifiants de services privés

  • Michelin Voyages ID, Reddit, Facebook profile ID, Wall Street Journal

Librairie python utilisées

Obsolète ?

  • Swifter (pour le calcul parallélisé)

Modules d'importations

Prenons par exemple le territoire de la Meurthe-et-Moselle. D'après le modèle conceptuel de données, un territoire est identifié par un code, un nom, une population, des relations d'appartenance, de frontière, ... Pour ajouter la Meurthe-et-Moselle dans la base de données, il faut construire un dictionnaire qui ressemble à cela :

dic = {}
dic["Code@insee"] = "54"
dic["Name@fr"] = "Meurthe-et-Moselle"
dic["Scale"] = "Departement"
dic["Population"] = 734403
dic["PopulationDate"] = "01/01/2015"
dic["Source"] = "insee_2015"
dic["BorderWithCode@insee"] = "55"
dic["BorderWithCode@insee"] = "57"
dic["BorderWithCode@insee"] = "88"
dic["IsInCode@insee"] = "R41"

Puis appeler l'interface de base de données (DBI) pour ajouter l'instance (de type Territoire) et ses propriétés dans la base de données :

DBI.insert("Territory", dic)

En pratique, le code présenté ci-dessus peut poser problèmes pour différentes raisons. D'un part, la causalité des références : on ne peut faire référence à une instance que si celle-ci est déjà insérée dans la base de données. Si l'on souhaite ajouter les départements français avec les frontières et leur appartenance régionale, il faut procéder en plusieurs temps : (1) Ajouter les régions à la BDD, (2) Ajouter les départements et leur appartenance régionale (3) faire le lien entre les départements frontaliers. Cela se traduit par cette typologie de code :

# On dispose d'une liste de régions (liste_regions), d'une liste de départements (liste_departements), d'une liste de lien entre départements
for reg in liste_regions: # On ajoute toutes les régions
    dic = {}
    dic["Code@insee"] = "R" + reg.code # On ajout R pour distinguer les codes Régions et Départements
    dic["Name@fr"] = reg.nom
    dic["Scale"] = "Region"
    DBI.insert("Territory", dic)
for dep in liste_departements: # On ajoute tous les départements
    dic = {}
    dic["Code@insee"] = dep.code
    dic["Name@fr"] = dep.nom
    dic["Scale"] = "Departement"
    dic["IsInCode@insee"] = dep.regioncode
    DBI.insert("Territory", dic)
for lien in liste_liens_departements: # Pour chacun des liens d'un table
    dic = {}
    dic["Code@insee"] = lien.code1
    dic["BorderWithCode@insee"] = lien.code2
    DBI.insert("Territory", dic)

BorderWith est un attribut symétrique : Insérer dans la base de données l'information que un département A a pour territoire frontalier un département B va également ajouter l'information que B a pour territoire frontalier A.

D'autre part, de nombreux attributs sont temporalisés. Une instance peut donc avoir plusieurs fois le même attributs, à des dates ou périodes différentes. Pour gérer cela, les clefs peuvent comprendre une extension Date ou Period pour préciser la temporalité les données

dic["Population"] = 734403
dic["PopulationDate"] = "01/01/2015"

Si un attribut doit être inséré à plusieurs temporalités, on pourra construire des clefs numérotés :

dic["Population/1"] = 734403
dic["PopulationDate/1"] = "01/01/2015"
dic["Population/2"] = 729768
dic["PopulationDate/2"] = "01/01/2008"

Une fois le travail de définition du dictionnaire réalisé, ce qui est une tâche relativement simple, la fonction insert() de la DBI est en charge de toute la partie pénible. C'est cette fonction qui va construire les liens entre les instances. En effet, lorsque l'on indique qu'un territoire fait partie d'un autre, on utilise la clef de dictionnaire "IsInCode@insee". Cette clef fait référence à la propriété fondamentale IsIn (qui la relation d'appartenance d'un territoire dans un autre plus vaste) et indique que le territoire à lier est identifié par son Code Insee. Ce sont les algorithmes de la DBI qui vont se charger de trouver ce territoire et d'établir une réelle connexion dans la base de données, et non simplement une référence par le code. Toutefois, pour faire le lien entre des objets, il est possible d'indiquer directement l'instance de base de données qui en est issue. Par exemple :

dic = {}
dic["Code@insee"] = "54"
territoire_a_lier = DBI.get_territory(name = "Meuse")
dic["BorderWith"] = territoire_a_lier
DBI.insert("Territory", dic)

Dans la documentation du prototype du SINAMET, nous détaillons les différentes clefs utilisables pour créer de nouvelles instances dans la bases de données.

L'usage de la fonction insert() de la DBI est théoriquement contournable, mais il est conseillé de ne pas insérer des données autrement dans la BDD. En effet, cette fonction d'insertion embarque tout un panel de fonctionnalités à la fois pour contrôler l'intégrité des données chargées, et également pour mettre en cohérence la construction des liens. Ainsi, si on tente de faire référence à un territoire non existant dans la BDD (exemple : dic["BorderWithCode@insee"]="865"), la fonction insert signalera à l'utilisateur l'erreur de référence et n'enregistrera pas la donnée erronée. Nous avons également rencontré dans nos données des périodes dont la date de fin se situait avant la date de début. A nouveau, cette fonction insert va alerter l'utilisateur de l'erreur d'intégrité. En ce qui concerne la mise en cohérence, il s'agit d'ajouter automatiquement les rélations symétriques (notamment les territoires frontaliers : si A a pour frontalier B, alors B a pour frontalier A), et relations héritées (Si B appartient à A et que C appartient à B alors C appartient à A).

Enfin, la fonction insert() tient compte de la nature quantifiable ou non des instances à créer. Notamment, les territoires ne sont pas quantifiables : lorsqu'on insert un territoire avec sa clef "Code@insee", le territoire est créé si aucun territoire ne possède ce code, ou il est mis à jour s'il existe déjà dans la base de données.

Ainsi, répéter le code suivant plusieurs fois ne va pas créer plusieurs territoires, juste un seul la première fois. :

dic = {}
dic["Code@insee"] = "54"
dic["Name@fr"] = "Meurthe-et-Moselle"
dic["Scale"] = "Departement"
DBI.insert("Territory", dic)

Au contraire, les consommations sont quantifiables. Répéter le code suivante va quant à lui créer plusieurs instance "Consommations" dans la base de données :

dic = {}
dic["TerritoryCode@insee"] = "54"
dic["OmesCode"] = "01.12"
dic["OmesNomenclature"] = "NST-2007"
dic["Quantity"] = 100
dic["Unity"] = "t"
DBI.insert("Consumption", dic)

Nous noterons que les instances non quantifiables sont repérée par des codes ou des noms, au contraire des instances quantifiables qui n'ont pas de nom ou de code propre à elles : elles ne font que références à des codes ou noms des instances non quantifiables (Territoire, Omes, Acteur).

Problèmes rencontrés sur l'importation de données

  • Format d'export incorrect (mauvais jeu de caractère Xls)
  • Les cellules fusionnées complexifient les données (solution envisagée : persistance d'une ligne à l'autre)
  • Les titres intermédiaires empêchent une lecture automatique directe ligne à ligne

Code de référence / Clef primaire & de jointure

Une des opérations extrêmement fréquente est la "jointure" de données. Il s'agit de rassembler plusieurs jeux de données en un seul.

Exemple : Nous souhaitons obtenir un tableau présentant pour chaque département sa population et la production céréalière. Il est peu probable de trouver directement ce tableau disponible. Nous trouverons les deux jeux de données séparément, puis nous devrons réaliser leur jointure. Dans le cas idoine, chaque jeu de données va mentionner le code du département : il s'agit de la "clef de jointure", celle qui est commune aux jeux de données à joindre. Sans cette clef commune, l'opération de jointure devient au mieux chronophage, sinon impossible.

Aussi, il est nécessaire de garantir aux jeux de données des codes de références pouvant être utilisé comme clef de jointure. Afin d'éviter tout malentendu, ces clefs devraient (ce n'est malheureusement pas toujours le cas) respecter quelques règles :

Faits relatifs à « SINAMET : Éléments opérationnels »
Texte de loiLoi portant nouvelle organisation territoriale de la République +