Vous êtes sur la page 1sur 46

Langage de Programmation Evolué - BI

L3 BI-EBUS

Chapitre 6 : Les entrepôts de données et ETL avec


PyGramETL

Haïfa Nakouri

hayfa.nakouri@esen.tn

ESEN Manouba

2021/2022
Objectifs du chapitre

Extraction, transformation et chargement des


données dans un entrepôt de données (Data
Warehouse) avec le package PyGramETL

Haïfa Nakouri LPE-BI ESEN 2021/2022 2


DW : notions de base

 Le Datawarehouse est une collection de données


orientées sujet, intégrées, non volatiles et
historisées, organisées pour la prise de décision.

 C’est est une vision centralisée et universelle de


toutes les informations de l'entreprise.

 C'est une structure (comme une base de données)


qui a pour but, contrairement aux bases de données,
de regrouper les données de l'entreprise pour des
fins analytiques et pour aider à la décision
stratégique.

Haïfa Nakouri LPE-BI ESEN 2021/2022 3


DW : notions de base

Haïfa Nakouri LPE-BI ESEN 2021/2022 4


DW : données orientées sujet

 Le DW est orienté sujets, ce qui signifie que les


données collectées doivent être orientées métier, et
donc triées par thème

Haïfa Nakouri LPE-BI ESEN 2021/2022 5


DW : données integrées

 Le DW est composé de données intégrées, c’est à


dire qu’un « nettoyage » préalable des données est
nécessaire dans un souci de rationalisation et de
normalisation

Haïfa Nakouri LPE-BI ESEN 2021/2022 6


DW : données historisées et non volatiles

 Les données du DW sont non volatiles, ce qui


signifie qu’une donnée entrée dans l’entrepôt l’est
pour de bon et n’a pas vocation à être supprimée
 Les données du DW doivent être historisées, donc
datées

Haïfa Nakouri LPE-BI ESEN 2021/2022 7


Modélisation multidimensionnelle

 Exemple: Fait: Montant et quantité des ventes,


chaque jour pour chaque produit dans chaque
magasin
 A en général plusieurs lignes et peu de colonnes

Haïfa Nakouri LPE-BI ESEN 2021/2022 8


Modèles d’un DW

 Modèle en étoile

 Modèle en flocon de neige

 Modèle en constellation

Haïfa Nakouri LPE-BI ESEN 2021/2022 9


Modèle en étoile

Haïfa Nakouri LPE-BI ESEN 2021/2022 10


Modèle flocon de neige
 Dérivé du schéma en étoile où les tables de dimensions sont normalisées
 La table des faits reste inchangée
 Chacune des dimensions est décomposée selon sa (ou ses) hiérarchie(s)
Exemple : Commune, Département, Région, Pays, Continent
 Utilisé lorsque les tables sont très volumineuses

(+) Réduction du
volume
(+) Permettre des
analyses par pallier
(drill down) sur la
dimension
(-) Navigation difficile
hiérarchisé
Haïfa Nakouri LPE-BI ESEN 2021/2022 11
(-) Nombreuses jointures
Modèle en constellation

 Fusionner plusieurs modèles en étoile qui utilisent


des dimensions communes
 Un modèle en constellation comprend donc :
 Plusieurs tables de faits
 Des tables de dimensions communes ou non à ces tables
de faits.

Haïfa Nakouri LPE-BI ESEN 2021/2022 12


Data Warehouse : ETL

 Outil d’alimentation pour


 Extraire
 Transformer
 Changer dans un DW

Haïfa Nakouri LPE-BI ESEN 2021/2022 13


Data Warehouse : ETL
Le package PyGramETL

 Pygrametl est un package pour créer des


programmes Extract-Transform-Load (ETL) en
Python.
 L’installation de ce package est indispensable (
disponible sur http://pygrametl.org/)
 Le paquet contient :
 un certain nombre de classes pour remplir les tables de
faits et les dimensions,
 des classes pour extraire des données de différentes
sources,
 des classes pour définir des «étapes» dans un flux ETL ,
 des fonctions pratiques pour la fonctionnalité ETL souvent
nécessaires .

Haïfa Nakouri LPE-BI ESEN 2021/2022 14


Data Warehouse : ETL
Le package PyGramETL

 Les modules du paquet sont :


 datasources pour l'accès à différentes sources de données
 tables pour donner un accès facile et abstrait aux tableaux
de dimension et de faits
 parallel pour paralléliser les opérations ETL
 JDBCConnectionWrapper et jythonmultiprocessing pour
la prise en charge de Jython (implémentation Java de
Python)
 aggregators pour l'agrégation de données
 steps pour définir des étapes dans un flux ETL
 FIFODict pour fournir un dict avec une taille limitée et où les
éléments sont enlevés en FIFO
Haïfa Nakouri LPE-BI ESEN 2021/2022 15
Installation de PygramETL

1. Lancer l’invite de commande et taper cmd

1. Exécuter la commende pip install pygrametl


PIP : Python Installation Package

Haïfa Nakouri LPE-BI ESEN 2021/2022 16


Connexion à une source de données
(Connexion au DW PostgreSQL)

 Il faut installer de plus le module psycopg2 et l’importer :


import psycopg2
import pygrametl
 Créer une connexion à une base de données PostgreSQL:
Exemple de connection au dw nommé pygrametlexa:
pgconn = psycopg2.connect(dbname='pygrametlexa',
user='postgres', password='0000')
connection = pygrametl.ConnectionWrapper(pgconn)
connection.setasdefault()
connection.execute(‘Connexion établie')

Haïfa Nakouri LPE-BI ESEN 2021/2022 17


PyGramETL Dimensions et Fait
Un objet doit alors être créé pour chaque dimension dans
l'entrepôt de données, ainsi qu'un objet pour la table des faits.
Pygrametl contient plusieurs types d'abstractions d'objets de
table de dimensions et de faits.
Objet Dimension
book_dimension = Dimension(
name='book',
key='bookid',
attributes=['book', 'genre'])
Objet FactTable
fact_table = FactTable(
name='facttable',
keyrefs=['bookid', 'locationid', 'timeid'],
measures=['sale'])

Haïfa Nakouri LPE-BI ESEN 2021/2022 18


Les types de tables de dimension
 Dimension
 CachedDimension
 un cache pour réduire la latence des recherches en réduisant le nombre d'allers-retours
vers la base de données
 BulkDimension
 une dimension optimisée pour un débit élevé lors de l'insertion de lignes et des
recherches rapides.
 CachedBulkDimension
 très similaire à BulkDimensionet est également destiné au chargement en bloc d'une
dimension, de sorte que seules leurs différences sont décrites ici
 TypeOneSlowlyChanging Dimension
 permet la création d'une dimension de type 1 à évolution lente
 SlowlyChangingDimension
 permet la création soit d'une dimension à évolution lente de type 2, soit d'une dimension
combinée à évolution lente de type 1 et de type 2
 SnowflakedDimension
 représente une dimension floconnée (normalisée) en tant qu'objet unique avec la même
interface que Dimension
Voir le lien de documentation pour plus d’exemples et de détails sur l’implémentation
: https://chrthomsen.github.io/pygrametl/doc/examples/dimensions.html

Haïfa Nakouri LPE-BI ESEN 2021/2022 19


Voir le lien de la documentation :
PyGramETL Fait https://chrthomsen.github.io/pygrame
tl/doc/examples/facttables.html
 La classe la plus élémentaire pour effectuer des
opérations sur la table de faits est la classe FactTable.
 L'utilisation de la classe FactTable est très simple et
requiert seulement qu'une table appropriée ait été
préalablement créée dans la base de données et qu'une
connexion à la base de données ait été créée à l'aide
d'une instance de la classe ConnectionWrapper.
 Deux classes filles sont proposées par PyGramETL
 BatchFactTable
 charge les faits dans la table des faits par lots au lieu d'un à la fois
comme FactTable.
 BulkFactTable
 insère également des faits par lots mais écrit les faits dans un
fichier temporaire au lieu de les conserver en mémoire. Ainsi, la
taille d'un lot est limitée par la taille du disque au lieu de la quantité
de mémoire disponible.
Haïfa Nakouri LPE-BI ESEN 2021/2022 20
ETL : Extraction

 Extraction des données de leur environnement


d’origine (base de données relationnelles, fichiers
plats, fichiers csv, fichiers texte…)
 Besoin d’outils spécifiques pour accéder aux bases
de production (requêtes sur des BD hétérogènes)
 Besoin d’une technique appropriée pour n’extraire
que les données nécessaires
 Données créées ou modifiées depuis la dernière
opération d’extraction
 Attention:
 L’extraction ne doit pas perturber l’activité de production

Haïfa Nakouri LPE-BI ESEN 2021/2022 21


Extraction avec PyGramETL
 Pygrametl prend en charge de nombreuses sources de
données. Les données de pygrametl sont déplacées
dans un dictionnaire que nous appelons par convention
row.
 Au lieu de mettre en œuvre une classe spécifique,
pygrametl utilise les dictionnaires intégrés de Python qui
fournissent des couples avec des clefs et valeurs de
données.
 Chacune des sources de données de cette classe est
itérable.
 La récupération de vos propres données dans pygrametl
est facile, car la seule exigence est que la source de
données soit itérable :
for row in datasource:
...

Haïfa Nakouri LPE-BI ESEN 2021/2022 22


Extraction avec PyGramETL
 Extraction de lignes à partir d'une base de données en utilisant une
connexion PEP 249 et SQL
name_mapping= ‘champs1', ' champs2', ' champs3', ‘champs4'
sales_source = SQLSource(connection=nom_connection, \
query="SELECT * FROM table", names=name_mapping)
Remarque : le nombre de noms fournis dans le name_mapping doit
correspondre au nombre de noms dans le résultat de la requête de la
base de données.
 L’extraction de lignes à partir d'un fichier CSV ne nécessite pas une
requête SQL, juste l’appel de open nous permet d’accéder au
fichier, comme pygrametl utilise DictReader pour les fichiers CSV,
et l'en-tête du fichier CSV contient des informations sur chaque
colonne.
fichierSource = open(‘nomfichier.csv', 'r', 16384)
region_source = CSVSource(csvfile= fichierSource,
delimiter=',')
Haïfa Nakouri LPE-BI ESEN 2021/2022 23
Extraction avec PyGramETL
MergeJoiningSource
 En plus des sources de données précitées, pygrametl comprend également
un certain nombre de façons de joindre et de combiner des sources de
données existantes.
 La classe MergeJoiningSource peut être utilisée pour égaliser les lignes à
partir de deux sources de données. Les lignes des deux sources de
données qui doivent être fusionnées doivent fournir leurs lignes dans un
ordre trié. Il est également nécessaire de fournir les attributs communs sur
lesquels la jointure doit être effectuée.

import pygrametl
from pygrametl.datasources import CSVSource, MergeJoiningSource
products = CSVSource(csvfile=open('products.csv', 'r', 16384),
delimiter=',')
sales = CSVSource(csvfile=open('sales.txt', 'r', 16384), delimiter='\t')
data = MergeJoiningSource(src1=products, key1='productID',
src2=sales, key2='productID')

Haïfa Nakouri LPE-BI ESEN 2021/2022 24


Extraction avec PyGramETL
HashJoiningSource

 La classe HashJoiningSource fonctionne de la même


manière que MergeJoiningSource, mais effectue la jointure
à l'aide du H-Map. En tant que tel, il n'est pas nécessaire
de trier les deux sources de données d'entrée.
import pygrametl
from pygrametl.datasources import CSVSource, HashJoiningSource
products = CSVSource(csvfile=open('products.csv', 'r', 16384),
delimiter=',')
sales = CSVSource(csvfile=open('sales.txt', 'r', 16384), delimiter='\t')
data = HashJoiningSource(src1=products, key1='productID',
src2=sales, key2='productID')

Haïfa Nakouri LPE-BI ESEN 2021/2022 25


Extraction avec PyGramETL
FilteringSource
 La classe FilteringSource est utilisée pour appliquer un filtre à une
source. Par défaut, une fonction booléenne Python est utilisée, qui
peut être utilisée pour supprimer des lignes vides. Alternativement,
l'utilisateur peut fournir un filtre personnalisé, qui devrait être une
fonction nommée f (row), qui retourne True quand une ligne doit être
transmise.
import pygrametl
from pygrametl.datasources import CSVSource, FilteringSource
def locationfilter(row):
if row['location'] == 'Aalborg':
return True
else:
return False
sales = CSVSource(csvfile=open('sales.csv', 'r', 16384),
delimiter='\t')
sales_filtered = FilteringSource(source=sales, filter=locationfilter)

Haïfa Nakouri LPE-BI ESEN 2021/2022 26


Extraction avec PyGramETL
Autres Jointure de sources

 UnionSource

 TransformingSource

 RoundRobinSource

 ProcessSource

 CrossTabbingSource

Haïfa Nakouri LPE-BI ESEN 2021/2022 27


Lecture des bases de données
avec PostGreSQL

 Exemple
import psycopg2
pgconn = psycopg2.connect(dbname=‘DWProduit',
user='postgres', password='0000')
cursor = pgconn.cursor()
cursor.execute("""SELECT montantVente FROM
"DWProduit".Ventes""")
ListV=[]
for vente in cursor:
ListV.append(vente)
print(ListV) classe cursor.
Permet au code Python d’exécuter une
commande PostgreSQL dans une session de
Haïfa Nakouri LPE-BI ESEN 2021/2022 28
base de données
ETL : Transformation

 Intégration des données


 Homogénéisation du vocabulaire, structures, valeurs
 Suppression et fusion des redondances
 Épuration des données (suppression des données incohérentes)
 Transformation des données dans un format cible

Haïfa Nakouri LPE-BI ESEN 2021/2022 29


Extraction avec PyGramETL
TransformingSource

 La classe TransformingSource peut être utilisée pour


appliquer des fonctions aux lignes d'une source. La
classe peut être fournie avec un certain nombre de
fonctions appelés sous la forme f (row), qui seront
appliquées à la source dans l'ordre donné.
import pygrametl
from pygrametl.datasources import CSVSource,
TransformingSource
def dinar_to_eur(row):
prix_din = int(row['prix'])
row['price'] = prix_din / 2,48
sales = CSVSource(csvfile=open('sales.csv', 'r', 16384),
delimiter=',')
sales_transformed = TransformingSource(source=sales,
dinar_to_eur)

Haïfa Nakouri LPE-BI ESEN 2021/2022 30


Transformation des données en Python
Ecrire des fonctions spécifiques
 Il faut bien spécifier ce qu’on veut extraire selon le schéma du
DW conçu ainsi que la structure des données sources que
nous disposons.
Exemple de méthode:

def extractdomaininfo(row):
# Extraire la partie 'www.domain.org' de cette
# adresse 'http://www.domain.org/page.html'
domaininfo = row['url'].split('/')[-2]
row['domain'] = domaininfo
Haïfa Nakouri LPE-BI ESEN 2021/2022 31
Transformation des données en Python
Ecrire des fonctions spécifiques

 Un deuxième exemple qui traite la date :

def split_timestamp(row):
# récupérer la date de format jj-mm-aaaa
timestamp = row['timestamp']
timestamp_split = timestamp.split(‘-')
# Récupérer chaque élément à part et le rajouter
#dans le dictionnaire
row['year'] = timestamp_split[0]
row['month'] = timestamp_split[1]
row['day'] = timestamp_split[2]

Haïfa Nakouri LPE-BI ESEN 2021/2022 32


ETL : Chargement

 Opérations de calcul et d’agrégation des données


 Remplacement de certaines bases si aucune solution
d’extraction satisfaisante n’est possible
 Mise en place de procédures de chargement
(nocturne?) et de restauration (en cas de problème)
 Envisager la mise en place de systèmes redondants si la
disponibilité du système ne peut être interrompue
 Prise en compte de la notion de granularité
 Conservation des données détaillées
 Possibilité d’agrégation des données pour la synthèse

Haïfa Nakouri LPE-BI ESEN 2021/2022 33


Data Warehouse : ETL
Chargement des données

 Deux cas sont à prendre en compte, le chargement initial


et les chargements incrémentiels.
 Le chargement initial est effectué au tout premier
chargement de l'entrepôt et dans des cas spéciaux
comme après la perte des données de l'entrepôt. Dans
ce cas, on charge toutes les données de l'entreprise
dans l'entrepôt.
 Le chargement incrémentiel est le fait d'ajouter des
données à un entrepôt existant, c'est l'opération qui va se
répéter dans le temps (chaque jour par exemple). Il
faudra faire attention dans ce cas à ne charger que les
informations nouvelles, et ne pas charger deux fois la
même information.

Haïfa Nakouri LPE-BI ESEN 2021/2022 34


PyGramETL
Chargement des dimensions

 La dimension est chargée à partir du fichier CSV

Exemple

[location_dimension.insert(row) for row in region_source]

Haïfa Nakouri LPE-BI ESEN 2021/2022 35


PyGramETL
Chargement du Fait (1/3)

insert(row)
insère de nouveaux faits directement dans la table de faits
lorsqu'ils sont transmis à la méthode.
Exemple simple pour charger les faits à partir d’une liste de
dictionnaires :

facts = [ {'storeid' : 1, 'productid' : 13, 'dateid' : 4, 'price': 50},


{'storeid' : 2, 'productid' : 7, 'dateid' : 4, 'price': 75},
{'storeid' : 1, 'productid' : 7, 'dateid' : 4, 'price': 50},
{'storeid' : 3, 'productid' : 9, 'dateid' : 4, 'price': 25} ]
for row in facts:
factTable.insert(row)
conn.commit()

Haïfa Nakouri LPE-BI ESEN 2021/2022 36


PyGramETL
Chargement du Fait (2/3)

Lookup({cle1:valeur1},{cle2:valeur2}, …)
vérifie si la base de données contient un fait avec la
combinaison donnée de clés référençant les dimensions.

factTable.lookup({'storeid' : 1, 'productid' : 13, 'dateid' : 4})

Haïfa Nakouri LPE-BI ESEN 2021/2022 37


PyGramETL
Chargement du Fait (3/3)

ensure(row, bool , mappage_noms)

combine FactTable.lookup () et FactTable.insert () en


s'assurant d'abord qu'un fait n'existe pas déjà dans le
tableau avant de l'insérer.

Haïfa Nakouri LPE-BI ESEN 2021/2022 38


PyGramETL
Chargement du Fait (3/3) (suite)

newFacts = [ {'storeid' : 2, 'itemid' : 7, 'dateid' : 4, 'price': 75},


{'storeid' : 1, 'itemid' : 7, 'dateid' : 4, 'price': 50},
{'storeid' : 1, 'itemid' : 2, 'dateid' : 7, 'price': 150},
{'storeid' : 3, 'itemid' : 3, 'dateid' : 6, 'price': 100} ]
for row in newFacts:
factTable.ensure(row, True, {'productid' : 'itemid'})
conn.commit()
conn.close()

 Le 2ème argument « True » oblige FactTable à ne pas


seulement correspondre aux clés pour que les faits soient
considérés comme égaux, mais vérifie également si les
mesures sont les mêmes pour les faits avec la même clé et
sinon soulève une ValueError
 Le 3ème argument permet de renommer 'itemid' en 'productid'
à l'aide de la fonctionnalité de mappage de noms
Haïfa Nakouri LPE-BI ESEN 2021/2022 39
Etude de cas : sécurité routière

1. Télécharger le fichier : « BI-SecuriteRoutiereEtudiant.py »

2. Terminer le code nécessaire afin d’assurer toutes les


phases de l’ETL.

Haïfa Nakouri LPE-BI ESEN 2021/2022 40


Le schéma du DataWarehouse SecuiteRoutiere

Haïfa Nakouri LPE-BI ESEN 2021/2022 41


Créer le DW SecuiteRoutiere avec Postgres (1/4)

(1) Clic droit


(2) Clic

Haïfa Nakouri LPE-BI ESEN 2021/2022 42


Créer le DW SecuiteRoutiere avec Postgres (2/4)

(1) Clic droit

(2) Clic

Haïfa Nakouri LPE-BI ESEN 2021/2022 43


Créer le DW SecuiteRoutiere avec Postgres (3/4)

Copier/coller les requêtes


SQL dans le fichier
“SecuriteRoutiere,sql” ici
puis executer.

Haïfa Nakouri LPE-BI ESEN 2021/2022 44


Créer le DW SecuiteRoutiere avec Postgres (4/4)

Le nouveau schema de la
BD est crée

Les 4 tables sont crées

Haïfa Nakouri LPE-BI ESEN 2021/2022 45


Référence du cours

Supports de Cours
 Zahra KODIA AOUINA- « Langage évolué et BI» -
ISG Tunis
 Karima Tekaya – « Informatique Décisionnelle » -
INSAT
 Fatma Baklouti – « Les entrepôts de données (Data
Warehouses) » - INSAT
Livres
 Ralph Kimball - « Concevoir et déployer un Data
Warehouse » - Editions Eyrolles, 2000

Haïfa Nakouri LPE-BI ESEN 2021/2022 46

Vous aimerez peut-être aussi