Objectif:
Générer un graphe de liason entre un ensemble de drugs et leurs apparitions dans différentes sources de type article scientifique.
À propos:
La solution proposé se découpe par taches de type Task
placés dans une liste. Chaque taches est appelée à la chaine à l'image d'une pipeline.
Toutes les taches prennnent en entrée le résultat de la tache précédente, puis une fois terminé elle renvoie le résultat de son propre traitement. Le choix d'impléter chaque étapes sous forme de taches permet d'avoir un code modulable et réuitilisable pour d'autres besoins.
L'ensemble des paramètres du projet (path et format) sont stockés dans config/config.yaml
afin que chacun puisse avoir
les infos clés du projet facilement.
Éxecutions:
À executer depuis la racine du projet
Installation des package python :
python3 -m venv pipeline_env
source pipeline_env/bin/activate
pip install -r config/requirements.txt
Lancement de la pipeline (résultat dans /data/result)
python3 ./pipeline_main.py
Test
pytest ./test
Ad-hoc
python3 ./ad-hoc.py
Architecture:
.
/config :
config.yaml : decriptif de tout les paramètre utile au projet (path des dossier/fichier important, format des données des dataset et format d'affichage du logger
requirements.txt : package python requis
/data : contient les données à partir de la source jusqu'au graph de laison final
/src:
/task : Ensemble de classes qui von être appelé dans la pipeline. Ils héritent tous de la classe Task (abstract class) pour avoir un format uniforme
/tools : Diver outils utilisés communémant dans les tasks
/test:
/sample: exemple de data utiles pour les tests
/script: dossier qui contient les scripts de test
pipeline_main.py : fichier à executer depuis la racine du projet pour lancer le process
ad-hoc.py : Script de réccurération du journal avec le plus de citation
Pistes:
- Changer le format du stockage des données par un système de stockage plus performant (S3, HDFS, MongoDB,...)
- Approfondir les tests à l'ensemble des class du projet
- Mettre en place un système d'exception personnalisé
- Containerisé la solution
- Dans un cas plutôt real-time, placer chaque tache dans un worker relié à une fil d'attente de message (Kakfa, RabbitMQ)
Énoncé :
Trouver le chiffre d’affaires (le montant total des ventes), jour par jour, du 1er janvier 2019 au 31 décembre 2019. Le résultat sera trié sur la date à laquelle la commande a été passée
Postulat:
Je pars du principe que la colonne date
dans la table TRANSACTION
est enregistré au format VARCHAR
Solution:
SELECT T.date, SUM(T.prod_price * T.prod_qty) AS ventes
FROM TRANSACTION AS T
WHERE TO_DATE(T.date, 'DD/MON/YYYY') BETWEEN TO_DATE('01/01/2019', 'DD/MON/YYYY') AND TO_DATE('31/12/2019', 'DD/MON/YYYY')
GROUP BY T.date
ORDER BY T.date;
Énoncé :
Déterminer, par client et sur la période allant du 1er janvier 2019 au 31 décembre 2019, les ventes meuble et déco réalisées
Postulat:
Je pars du principe que la colonne date
dans la table TRANSACTION
est enregistré au format VARCHAR
Solution:
SELECT T.client_id,
SUM(CASE WHEN PN.product_type = "MEUBLE" THEN T.prod_price * T.prod_qty ) AS ventes_meuble,
SUM(CASE WHEN PN.product_type = "DECO" THEN T.prod_price * T.prod_qty) AS ventes_deco
FROM TRANSACTION AS T
JOIN PRODUCT_NOMENCLATURE AS PN ON T.prop_id = PN.product_id
WHERE TO_DATE(T.date, 'DD/MON/YYYY') BETWEEN TO_DATE('01/01/2019', 'DD/MON/YYYY') AND TO_DATE('31/12/2019', 'DD/MON/YYYY')
GROUP BY T.client_id