Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Réalisation d'un mashup de données avec DSS de Dataiku et visualisation avec Palladio - Deuxième partie

1,926 views

Published on

cf. la première partie : https://www.slideshare.net/lespetitescases/ralisation-dun-mashup-de-donnes-avec-dss-de-dataiku-premire-partie

Tutoriel pour réaliser un mashup à partir de jeux de données libres téléchargés sur data.gouv.fr et Wikidata entre autres avec le logiciel DSS de Dataiku. Cette deuxième partie permet d'aborder le requêtage de Wikidata avec une requête SPARQL puis montre comment relier les jeux de données de data.gouv.fr et les données issues de Wikidata. Enfin, il aborde la visualisation des données via l'application en ligne Palladio.

Ce tutoriel a servi de support de cours au Master 2 "Technologies numériques appliqués à l'histoire" de l'Ecole nationale des chartes lors de l'année universitaire 2016-2017.

Published in: Data & Analytics
  • Be the first to comment

Réalisation d'un mashup de données avec DSS de Dataiku et visualisation avec Palladio - Deuxième partie

  1. 1. Gautier Poupeau gautier.poupeau@gmail.com @lespetitescases http://www.lespetitescases.net Réalisation d’un mashup de données Second cours
  2. 2. Visualisation du « flow »
  3. 3. RÉCUPÉRER DES DONNÉES DE WIKIDATA
  4. 4. PRÉSENTATION DE WIKIDATA
  5. 5. Les limites de Dbpedia • Données structurées complexes à modifier dans les Wikipedias • Délai d’attente pour disposer de la mise à jour (dbpedia mis à jour une fois par an) • Données dispersées dans les différentes versions de Dbpedia • Dbpedia ne propose pas un niveau de service compatible avec des impératifs de production • Erreurs dans les extractions
  6. 6. Wikidata • Projet officiel de la Wikimedia Foundation • Développée à partir de 2012 à l’initiative de l’association Wikimedia Deutschland • Ouvert à tous • Les données sont libres : CC0 • Le site est entièrement multilingue • Objectif 1er : centraliser et faciliter la maintenance des données structurées des Wikipedias
  7. 7. La gestion des liens interlangues Ancien système Nouveau système Gestion disséminée (données dispersées sur 280 Wikipédias) Gestion centralisée Maintenance par une noria de robots Collecte par robots (sauf ambiguïté), maintenance à la main
  8. 8. La gestion des liens interlangues [[af:Victor Hugo]] [[als:Victor Hugo]] [[an:Victor Hugo]] [[ar:]] [[arz:]] [[ast:Victor Hugo]] [[az:Viktor Hüqo]] [[bat-smg:Victor Hugo]] [[ba: , ]]Гюго Виктор [[be-x-old: ]]Віктор Юго [[be: ]]Віктор Гюго [[bg: ]]Виктор Юго [[bn:]] [[br:Victor Hugo]] [[cv: ]]Виктор Гюго [[cy:Victor Hugo]] [[da:Victor Hugo]] [[de:Victor Hugo]] [[diq:Victor Hugo]] [[el: ]]Βίκτωρ Ουγκώ [[en:Victor Hugo]] Ancien système Wikipédia Nouveau système Wikidata
  9. 9. La gestion des infobox Ancien système Nouveau système données dispersées (280 Wikipédias) données centralisées mise à jour variable selon les Wikipédias gestion simplifiée des données
  10. 10. La gestion des infobox {{Infobox Conjoint politique | nom = Berthe Faure | image = Faure.1212301544- 1-.jpg | légende = Dessin supposé de Berthe Faure, debout et de dos, lors du décès de son mari (une du ''[[Le Petit Journal (quotidien)|Petit Journal]]''). | statut = [[Liste des épouses des présidents de la République française| Épouse du {{7e}} président de la République française]] | début = {{date|17|janvier| 1895}} | fin = {{date|16|février| 1899}}<br /><small>(4 ans et 29 jours)</small> | conjoint = [[Félix Faure]] | prédécesseur = [[Hélène Casimir- Perier]] | successeur = [[Marie-Louise Loubet]] | nom de naissance = Marie-Mathilde Berthe Belluot | date de naissance = {{date de naissance| 21|février|1842}} | lieu de naissance = | date de décès = [[1920]] (à 78 ans) | lieu de décès = | profession = }}
  11. 11. STRUCTURE DES DONNÉES DE WIKIDATA
  12. 12. Structure des données de Wikidata
  13. 13. Lien avec l’article dans Wikipedia
  14. 14. Etiquettes, description et nature Lien avec une autre entité
  15. 15. CONSTRUIRE UNE REQUÊTE SPARQL AVEC WIKIDATA
  16. 16. Explorer les données disponibles pour le type d’entité interrogée
  17. 17. Repérer les codes qui vont servir à construire votre requête
  18. 18. Repérer les codes qui vont servir à construire votre requête
  19. 19. Repérer les codes qui vont servir à construire votre requête
  20. 20. Repérer les codes qui vont servir à construire votre requête
  21. 21. Résumé des ressources intéressantes • Etiquette de l’entité • Alias de l’entité • Nature de l’entité : P31 • Date de publication : P577 • Identifiant Imdb : P345 • Film : Q11424
  22. 22. et les URIS correspondantes • http://www.w3.org/2000/01/rdf-schema#label • http://www.w3.org/2004/02/skos/core#altLabel • http://www.wikidata.org/prop/direct/P31 • http://www.wikidata.org/prop/direct/P577 • http://www.wikidata.org/prop/direct/P345 • http://www.wikidata.org/entity/Q11424
  23. 23. Attention à la hiérarchie des natures Ce n’est pas la nature « Film » mais ses sous-classes…
  24. 24. Attention à la hiérarchie des natures Dans ce cas, il s’agit d’une sous-classe directe de film mais la hiérarchie peut être plus importante avec des entités associées à chaque niveau  à prendre en compte dans la construction de la requête !
  25. 25. Construire la requête SPARQL SPARQL endpoint de Wikidata : https://query.wikidata.org/ Zone de saisie de la requête SPARQL Choix des préfixes à ajouter dans la requête Bouton pour lancer la requête Zone d’affichage des résultats de la requête
  26. 26. Ajout des préfixes les plus communs pour construire une requête
  27. 27. Ajout des préfixes les plus communs pour construire une requête
  28. 28. Chercher les entités d’une nature précise
  29. 29. Chercher les entités d’une nature précise Nombre de résultats : 191 153 résultats pour des entités de nature « film » mais ce résultat ne prend pas en compte les entités qui ont pour nature une sous-classe de film
  30. 30. Chercher les entités d’une nature précise et ses sous-classes Cette ligne signifie : « les entités d’un type dont la super- classe quelque soit le niveau dans la hiérarchie est Film ». On utilise le caractère « * » placé juste après la propriété wdt:P279 = sous-classe de
  31. 31. Chercher les entités d’une nature précise et ses sous-classes Nombre de résultats : 435 030 résultats pour des entités de nature « film » ou une de ses sous-classes
  32. 32. Ajout de la fonction « blazegraph » pour récupérer les étiquettes des ressources Indication de la langue des étiquettes à récupérer Ajout de la chaîne « Label » à la variable de la ressource
  33. 33. Ajout de la fonction « blazegraph » pour récupérer les étiquettes des ressources La requête échoue car elle est trop large
  34. 34. Limiter le nombre de résultats
  35. 35. Récupérer la date de publication
  36. 36. Filtrer avec la date de publication
  37. 37. Filtrer avec la date de publication La requête échoue car le filtre n’est pas assez restreint
  38. 38. Filtrer avec la date de publication
  39. 39. Récupérer uniquement l’année
  40. 40. Récupérer l’identifiant Imdb
  41. 41. Récupérer les étiquettes alternatives éventuelles
  42. 42. CHARGER LES DONNÉES DANS DATAIKU
  43. 43. Ajouter un jeu de données depuis une URL
  44. 44. Saisir l’URL
  45. 45. Récupérer l’URL de la requête SPARQL
  46. 46. Construction de l’URL de requêtage URL du web service https://query.wikidata.org/bigdata/namespace/wdq/sparql Format de la réponse de la requête SPARQL valeur du paramètre « format » format=json Requête SPARQL avec l’encodage URL valeur du paramètre « query » query=PREFIX%20wd%3A%20%3Chttp%3A%2F%2Fwww.wikidata.org%2Fentity%2F%3E%0APREFIX%20wdt%3A%20%3Chttp%3A%2F %2Fwww.wikidata.org%2Fprop%2Fdirect%2F%3E%0APREFIX%20wikibase%3A%20%3Chttp%3A%2F%2Fwikiba.se%2Fontology%23%3E %0APREFIX%20p%3A%20%3Chttp%3A%2F%2Fwww.wikidata.org%2Fprop%2F%3E%0APREFIX%20ps%3A%20%3Chttp%3A%2F %2Fwww.wikidata.org%2Fprop%2Fstatement%2F%3E%0APREFIX%20pq%3A%20%3Chttp%3A%2F%2Fwww.wikidata.org%2Fprop%2Fqualifier %2F%3E%0APREFIX%20rdfs%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2F2000%2F01%2Frdf-schema%23%3E%0APREFIX%20bd%3A %20%3Chttp%3A%2F%2Fwww.bigdata.com%2Frdf%23%3E%0A%0ASELECT%20DISTINCT%20%3Ffilm%20%3FfilmLabel%20%3FaltLabel %20%3FimdbID%20%3Fyear%0AWHERE%20%7B%0A%20%7B%7B%3Ffilm%20wdt%3AP31%20wd%3AQ11424.%7D%20UNION%20%7B%3Ffilm %20wdt%3AP31%20%3Ftype.%20%3Ftype%20wdt%3AP279*%20wd%3AQ11424%7D%7D%0A%20%20%3Ffilm%20wdt %3AP345%20%3FimdbID.%0A%20%20OPTIONAL%20%7B%3Ffilm%20skos%3AaltLabel%20%3FaltLabel.%20FILTER%20(lang(%3FaltLabel)%3D %27fr%27)%7D%0A%20%20%3Ffilm%20wdt%3AP577%20%3Fdate%0A%20%20BIND%20(year(%3Fdate)%20AS%20%3Fyear)%0A%20%20FILTER %20(%3Fdate%20%3E%3D%20%222008-01-01T00%3A00%3A00Z%22%5E%5Exsd%3AdateTime)%0A%20%20FILTER%20(%3Fdate%20%3C%3D %20%222015-12-31T00%3A00%3A00Z%22%5E%5Exsd%3AdateTime)%0A%20%20SERVICE%20wikibase%3Alabel%20%7B%20%0A%09bd %3AserviceParam%20wikibase%3Alanguage%20%22fr%22%0A%20%20%7D%0A%20%20%0A%7D
  47. 47. Astuce : service en ligne pour encoder une chaîne pour une URL http://meyerweb.com/eric/tools/dencoder/
  48. 48. Astuce : service en ligne pour encoder une chaîne pour une URL http://meyerweb.com/eric/tools/dencoder/
  49. 49. Saisir l’URL construit
  50. 50. Télécharger le jeu de données
  51. 51. Echec du téléchargement  relancer le
  52. 52. Téléchargement effectué
  53. 53. Configurer le jeu de données Par défaut, Dataiku choisit le type CSV, il n’arrive donc pas à analyser les données.
  54. 54. Sélectionner le type « json »
  55. 55. Renseigner le jsonPath de boucle
  56. 56. La prévisualisation des données s’affiche
  57. 57. Exploration du jeu de données
  58. 58. Liste des jeux de données chargés Reproduire la procédure pour charger les films entre 2000 et 2007
  59. 59. Visualisation du « flow »
  60. 60. Empilement des deux jeux de données
  61. 61. Sélection du premier jeu de données
  62. 62. Sélection du second jeu de données
  63. 63. Saisie du nom du nouveau jeu de données
  64. 64. Interface pour empiler les jeux de données
  65. 65. Mise à jour du schéma
  66. 66. Visualisation du « flow »
  67. 67. PRÉPARER LE 1ER JEU DE DONNÉES AVANT SA MISE EN RELATION
  68. 68. Interface de préparation des données
  69. 69. AJOUTER UNE VALEUR FIXE DANS DES CELLULES VIDES
  70. 70. Résultat d’une jointure pour la colonne « Premier Film ? » Une valeur n’est présente que dans les lignes jointes
  71. 71. Sélectionner le traitement « Fill empty cells with fixed value »
  72. 72. Configuration du traitement
  73. 73. Résultat du traitement
  74. 74. SIMPLIFIER UN TEXTE POUR SA COMPARAISON
  75. 75. Sélectionner le traitement « Simplify text »
  76. 76. Créer une colonne avec le texte simplifié
  77. 77. Validation du nouveau schéma
  78. 78. PRÉPARER LE 2ND JEU DE DONNÉES AVANT SA MISE EN RELATION
  79. 79. Exploration des données
  80. 80. Suppression des colonnes inutiles
  81. 81. Renommer les colonnes
  82. 82. Conserver uniquement l’identifiant Wikidata
  83. 83. PRÉPARER LES DONNÉES POUR COMPARER LES TITRES
  84. 84. Objectifs • Obtenir une ligne par titre ou titre alternatif à comparer avec l’autre jeu de données • Conserver uniquement les colonnes nécessaires à la comparaison • Normaliser le texte de la chaîne de la même manière que dans l’autre jeu de données
  85. 85. Créer une chaîne de caractère à partir du titre et du titre alternatif
  86. 86. Créer une ligne pour chaque partie de la chaîne créée précédemment
  87. 87. Paramétrer le traitement
  88. 88. Supprimer la colonne altLabel
  89. 89. Simplification du texte
  90. 90. PRÉPARER LES DONNÉES POUR COMPARER LES ANNÉES
  91. 91. Problématique et objectifs L’année de publication dans Wikidata correspond à l’année de production du film alors que l’année dans le jeu de données du CNC correspond à l’année de sortie du film en France, il peut parfois se passer plusieurs années entre les deux. Pour optimiser les chances de jointure sans trop augmenter le risque d’erreur, il est nécessaire de comparer les deux jeux de données à deux années près. C’est-à-dire dans le jeu de données provenant de Wikidata de créer autant de lignes que d’années en plus (deux ans avant, un an avant, un an après, deux après).
  92. 92. Construire la chaîne de caractères
  93. 93. Créer une ligne pour chaque année
  94. 94. Sauvegarde et exécution du traitement
  95. 95. RELIER LES DEUX JEUX DE DONNÉES
  96. 96. Visualisation du « flow »
  97. 97. Choix du 1er jeu de données à joindre
  98. 98. Configuration du résultat de la jointure
  99. 99. Choix du type de jointure
  100. 100. Sélection des champs pour effectuer la jointure
  101. 101. Sélection des champs pour effectuer la jointure
  102. 102. Choix des colonnes à conserver
  103. 103. Sauvegarde et mise à jour du schéma de données
  104. 104. Exécution du traitement
  105. 105. SUPPRIMER LES LIGNES EN DOUBLONS ET RÉORGANISER LE JEU DE DONNÉES Utilisation des recettes Python
  106. 106. Certaines lignes sont identiques…
  107. 107. Sélection d’une recette python
  108. 108. Création d’un nouveau jeu de données résultat de la recette python
  109. 109. Création de la recette
  110. 110. Interface de la recette python Chargement de la bibliothèque Pandas http://pandas.pydata.org
  111. 111. Code pour dédoubloner les lignes
  112. 112. Affichage des colonnes
  113. 113. Réorganisation/suppression des colonnes
  114. 114. Résultat du traitement
  115. 115. RÉCUPÉRER LES IMAGES D’IMDB VIA OMDB
  116. 116. Visualisation du « flow »
  117. 117. Utilisation du site OMDb API OMDb API est un service gratuit qui met à disposition une API pour obtenir des informations sur les films dont les images des affiches. Un film est trouvé via son identifiant IMDb ou son titre
  118. 118. Récupérer les données d’OMDb API Un plugin Dataiku propose une recette spécifique pour récupérer les infos à partir de l’identifiant IMDDB ce qui correspond parfaitement à notre besoin. Malheureusement, un petit bug empêche son utilisation (cf. https://github.com/dataiku/dataiku-contrib/issues/42 ) Pour simplifier le tutoriel, un jeu de données contenant les informations d’OMDb pour les films traités est mis à disposition sur GitHub : https://github.com/lespetitescases/datasets/blob/master/imdbInformations.csv?raw=true
  119. 119. Ajout d’un nouveau jeu de données depuis le « flow »
  120. 120. Saisie de l’URL et récupération du jeu de données
  121. 121. Configuration du jeu de données
  122. 122. Création d’une jointure
  123. 123. Choix du type de jointure
  124. 124. Choix des colonnes pour la jointure
  125. 125. Choix des colonnes à conserver
  126. 126. Exécution du traitement
  127. 127. Résultat de la jointure
  128. 128. Création d’une recette à partir de l’IHM d’exploration
  129. 129. Création d’une nouvelle recette de préparation
  130. 130. Construire une URL complète pour les affiches https://image.tmdb.org/t/p/w300/ + URL relative récupérée d’OMDB
  131. 131. Construire l’URL vers la page du film sur IMDb http://www.imdb.com/title/ + imdbId +/
  132. 132. VISUALISER DANS PALLADIO
  133. 133. EXPORTER LES DONNÉES DE DATAIKU
  134. 134. Exporter les données depuis Dataiku
  135. 135. Configuration de l’export
  136. 136. Exécution de l’export
  137. 137. CHARGER LES DONNÉES DANS PALLADIO
  138. 138. Page d’accueil de Palladio http://hdlab.stanford.edu/palladio/
  139. 139. Interface de chargement des données Il faut glisser le fichier CSV obtenu précédemment dans cette zone
  140. 140. Les données sont directement chargées dans la zone de texte
  141. 141. Interface de configuration des données
  142. 142. Interface de configuration d’un champ Configuration du type de données Si le champ contient un identifiant, il est posible de charger les données associées via un autre fichier CSV
  143. 143. Gestion des champs à valeurs multiples Configuration du caractère de séparation des valeurs
  144. 144. Configuration du nom de la table
  145. 145. L’ONGLET « GALLERY »
  146. 146. Paramétrer la vue « Gallery » Association d’un champ aux différentes informations de la Gallery
  147. 147. Choix du champ
  148. 148. Résultat final
  149. 149. Résultat final
  150. 150. QUELQUES RECETTES PYTHON INDISPENSABLES ANNEXES http://pandas.pydata.org/
  151. 151. RÉORGANISER DES COLONNES Recette n°1
  152. 152. Sélectionner une recette python
  153. 153. Modifier le script python # -*- coding: utf-8 -*- import dataiku import pandas as pd, numpy as np from dataiku import pandasutils as pdu # Chargement du jeu de donnée Dataiku Dataset_en_entree = dataiku.Dataset(« Nom_du_dataset") # Transformation du jeu de donnée en Panda Dataframe Dataset_en_entree _df = Dataset_en_entree .get_dataframe() #Réorganisation et sélection des colonnes dans l’ordre de déclaration ci-dessous final_df = Dataset_en_entree _df [[‘nom colonne 1', 'tnom colonne 2',‘nom colonne 3']] # Déclaration d’un nouveau jeu de donnée Dataiku final = dataiku.Dataset("final") # Alimentation du jeu de donnée avec le dataframe obtenu précédemment final.write_with_schema(final_df) Par défaut, le script Python contient les déclarations d’imports de bibliothèques, le jeu de données en entrée , le jeu de données en sortie
  154. 154. SUPPRIMER LES LIGNES EN DOUBLON Recette n°2
  155. 155. Sélectionner une recette python
  156. 156. Modifier le script python # -*- coding: utf-8 -*- import dataiku import pandas as pd, numpy as np from dataiku import pandasutils as pdu # Chargement du jeu de donnée Dataiku Dataset_en_entree = dataiku.Dataset(« Nom_du_dataset") # Transformation du jeu de donnée en Panda Dataframe Dataset_en_entree _df = Dataset_en_entree .get_dataframe() #Supprimer les lignes en doublon en prenant en compte les valeurs de toutes les colonnes final_df = Dataset_en_entree _df.drop_duplicates() #Supprimer les lignes en doublon en prenant en compte les valeurs d’une colonne #final_df = Dataset_en_entree _df drop_duplicates(subset=‘nom de la colonne') #Supprimer les lignes en doublon en prenant en compte les valeurs de plusieurs colonnes #final_df = Dataset_en_entree _df drop_duplicates(subset=[‘nom de la colonne 1‘, ‘nom de la colonne 2‘]) # Déclaration d’un nouveau jeu de donnée Dataiku final = dataiku.Dataset("final") # Alimentation du jeu de donnée avec le dataframe obtenu précédemment final.write_with_schema(final_df)
  157. 157. DÉNORMALISER LES LIGNES Recette n°3
  158. 158. Objectif Une ligne par film et personne distincte Une ligne par film
  159. 159. Sélectionner une recette python
  160. 160. Modifier le script python # -*- coding: utf-8 -*- import dataiku import pandas as pd, numpy as np from dataiku import pandasutils as pdu # Chargement du jeu de donnée Dataiku Dataset_en_entree = dataiku.Dataset(« Nom_du_dataset") # Transformation du jeu de donnée en Panda Dataframe Dataset_en_entree _df = Dataset_en_entree .get_dataframe() #Supprimer les lignes en doublon en prenant en compte les valeurs de toutes les colonnes groupby= Dataset_en_entree _df.groupby(‘nom colonne distincte‘)[‘nom colonne liste'].apply(lambda x: x.tolist()).to_frame().reset_index().to_dict(orient='list') #Transformer un dictionnaire Python en dataframe Panda final_df = pd.DataFrame.from_dict(groupby) # Déclaration d’un nouveau jeu de donnée Dataiku final = dataiku.Dataset("final") # Alimentation du jeu de donnée avec le dataframe obtenu précédemment final.write_with_schema(final_df)
  161. 161. SYNCHRONISER LES DONNÉES AVEC UNE BASE DE DONNÉES MYSQL
  162. 162. Installer le driver JDBC https://doc.dataiku.com/dss/latest/installation/jdbc.html
  163. 163. Entrer dans l’administration
  164. 164. Ajouter une connexion
  165. 165. Configuration de la connexion
  166. 166. Exemple de connexion Penser à ajouter la propriété avancée suivante
  167. 167. Ajouter une recette de synchronisation
  168. 168. Paramétrer et exécuter la synchronisation

×