Giter Site home page Giter Site logo

betagouv / data-inclusion Goto Github PK

View Code? Open in Web Editor NEW
4.0 2.0 1.0 7.61 MB

data·inclusion aggrège les données de l'insertion sociale et professionnelle

Home Page: https://api.data.inclusion.beta.gouv.fr/api/v0/docs

License: MIT License

Shell 0.69% Dockerfile 0.94% Procfile 0.02% Python 50.39% Mako 0.08% PLpgSQL 1.98% Jupyter Notebook 41.08% HTML 4.81%

data-inclusion's Introduction

data-inclusion

data·inclusion aggrège les données de l'insertion sociale et professionnelle.

Présentation

Les sources de données traitées comprennent notamment:

  • les données du GIP de l'inclusion: les emplois de l'inclusion et dora,
  • les lieux de médiations numérique,
  • la base de ressources partenariales de Pole Emploi,
  • des données de collectivités territoriales (e.g. l'Ille-et-Vilaine)
  • des acteurs publics: 1jeune1solution, mes aides de pôle emploi.

Les données collectées sont:

  • historisées,
  • géocodées,
  • sirétisées automatiquement,
  • enrichies via les outils développés par data·inclusion:
    • l'outil de correspondance, qui permet de faire correspondre 2 jeux de données brutes,
    • l'outil de sirétisation, qui permet d'attribuer un siret aux structures, afin de croiser,
  • alignées sur le schéma de données de data·inclusion
  • publiées régulièrement en open data sur data.gouv, la plateforme de données publiques,
  • consultables via une api.

Architecture

architecture

Pipeline

pipeline

Contribuer

Auteurs

Licence

data-inclusion's People

Contributors

colinmaudry avatar dependabot[bot] avatar vmttn avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

jonathanperret

data-inclusion's Issues

Add geographic availability to services

ODS PEP RES_PARTENARIALE table has a PERIMETRE_GEO_RSP column that indicates the range of the availability of the service. From the documentation:

0 - National
1 - Régional (liste des régions dans la table DD009_REGION_RESSOURCE)
2 - Direction territoriale OFII (liste des OFII dans la table DD009_DIR_TERRITORIALE_OFII)
3 - Département (liste des départements dans la table DD009_DEPARTEMENT_RESSOURCE)
4 - Bassin d'emploi (liste des bassins dans la table DD009_BASSIN_RESSOURCE)
5 - Commune (liste des communes dans la table DD009_COMMUNE_RESSOURCE)

Problem: the RES_PARTENARIALE doesn't mention directly the place that would map with zone_diffusion_code (commune, département, etc.) and zone_diffusion_nom, we must get it from the address of the structure.

To do:

  • a join with ADRESSE via the RES_PARTENARIALE.ID_ADR (in sources or intermediate?)
  • get the right place code/name depending on the value of PERIMETRE_GEO_RSP

Envoi d'un message dans Mattermost en cas d'erreur Airflow

Pour qu'un email soit envoyé en cas d'échec dans n'importe quel DAG :

  • Mettre la variable d'environnement AIRFLOW__EMAIL__DEFAULT_EMAIL_ON_FAILURE sur True
  • (c'est aussi configurable tâche par tâche avec la propriété email_on_failure (booléen)
  • configurer l'envoi d'emails (SMTP)

Activer le backoff exponentiel et augmenter le nombre de retries

Actuellement, les tâches Airflow :

  • sont retentées deux fois avant d'être marquées comme "failed"
  • ces tentatives sont peu espacées

Source

Cette stratégie n'est pas optimale car les nouvelles tentatives ont peu de chance de réussir car trop rapprochées.

Je suggère donc :

  • qu'on active le backoff exponentiel en ajoutant la propriété retry_exponential_backoff = True
  • qu'on monte le nombre de nouvelles tentatives à 4

Nettoyage des caractères inutiles dans les noms de structures

Exemples de noms de structures problématiques, qui peuvent potentiellement limiter le matching et la déduplication (les guillemets proviennent des données) :

  • "UTPAS DENAIN LOURCHES - Alloc mensuelle d'aide sociale à l'enfance ( AMASE) "
  • « les Filoux »
  • : Centre Hospitalier Saint-Amand-les-Eaux

Donc il faudrait :

  • supprimer les guillemets doubles et en chevron
  • supprimer certains signes de ponctuation en début et fin de champ
  • finir par un TRIM() pour les espaces

Déduplication des structures

Les données de la Base de Ressources Partenariale ODSPEP combinent structures et services : chaque ligne de la BRP contient à la fois les données du service et de la structure qui le propose.

Notre process doit donc :

  • 1. répartir les données dans deux tables distinctes (structures, services)
  • 2. maintenir le lien entre la structure et ses services
  • 3. tester le lien structure/source pour toutes les sources (pas seulement odspep)
  • 4. dédupliquer les services malgré l'absence d'identifiant de structure

Actuellement, 1. est OK, mais 2. n'est pas testé et 3. est à refaire.

Séparer l'exécution par source

  • Toutes les sources n'ont pas les mêmes contraintes en terme de fréquence d'exécution. Certaines sources ne changent pas (eg. odspep) et n'ont besoin d'être exécutée qu'une seule fois sur la dernière version des transformations.

Lister les erreurs de validation en sortie

int__validated_services et int__validated_structures filtre déjà les lignes invalides. Il s'agit d'ajouter un ou plusieurs modèles pour lister les erreurs de validation.

Mapping champs ODSPEP 2023 <=> format intermédiaire

Les données ODSPEP sont converties au format data.inclusion à partir d'un format intermédiaire, une version normalisée de fichiers Excel envoyés en 2022.

Fichier Excel => format intermédiaire normalisé => data.inclusion

Afin de faciliter le chargement des données reçues en janvier 2023, nous convertissons ces données au même format normalisé. Ce format normalisé se compose de plusieurs fichiers :

  • ressources.csv
  • contacts.csv
  • familles.csv
  • horaires.csv
  • sous-categories.csv

Première étape : faire le mapping.

resources.csv

Champ cible Champ source 2023 Commentaire
ID_RES RES_PARTENARIALE.ID_RES
LIBELLE_SERVICE RES_PARTENARIALE.LIBELLE_COURT_RSP
DESCRIPTION_SERVICE RES_PARTENARIALE.SERVICE_DESCRIPTION_RSP
STRUCTURE RES_PARTENARIALE.NOM_STRUCTURE_RSP
SERVICE_RSP RES_PARTENARIALE.SERVICE_RSP
ID_ADR RES_PARTENARIALE.ID_ADR
L1_IDENTIFICATION_DEST_ADR ADRESSE.L1_IDENTIFICATION_DEST_ADR
L2_IDENTITE_DEST_ADR ADRESSE.L2_IDENTITE_DEST_ADR
L4_NUMERO_LIB_VOIE_ADR ADRESSE.L4_NUMERO_LIB_VOIE_ADR
L3_COMPLEMENT_ADR ADRESSE.L3_COMPLEMENT_ADR
L5_MENTION_ADR ADRESSE.L5_MENTION_ADR
L7_PAYS_ADR ADRESSE.L7_PAYS_ADR
LATITUDE_ADR ADRESSE.LATITUDE_ADR
LONGITUDE_ADR ADRESSE.LONGITUDE_ADR
EST_NORMALISEE_ADR ADRESSE.EST_NORMALISEE_ADR
CODE_COMMUNE_ADR ADRESSE.CODE_COMMUNE_ADR
CODE_POSTAL_ADR ADRESSE.CODE_POSTAL_ADR
LIBELLE_COMMUNE_ADR ADRESSE.LIBELLE_COMMUNE_ADR
DATE DERNIERE MAJ RES_PARTENARIALE.DATE_DERNIERE_MODIF_RSP

Reading an Excel downloaded from S3 with pandas

So far I haven't succeeded in properly reading an Excel file with pd.read_excel and an object downloaded from S3.

Here is what I've tried:

with boto3 client

S3.Client.get_object

obj: dict = boto3_client.get_object(
	Bucket=os.environ['SCALEWAY_BUCKET'],
    Key=s3_filepath)

df = pd.read_excel(obj['Body'], dtype=str, engine='openpyxl')

Output

--> 516     self.handles.handle.seek(0)
    517     try:
    518         self.book = self.load_workbook(self.handles.handle)

UnsupportedOperation: seek

Vérifier le status code de toutes les requetes d'extraction

datagouv nous a renvoyé une 500 sur un téléchargement du dataset hinaura, mais le résultat n'est pas vérifié et ne déclenche pas d'exception.

def get_resources_url_from_dataset_url(dataset_url: str) -> dict[str, str]:

Il faudrait réutiliser ce snippet:

def log_and_raise(resp: requests.Response, *args, **kwargs):

Permettre l'utilisation du templater `dbt` de sqlfluff

  • l'intégration simultanée de l'extension vscode et du precommit hook est assez laborieuse et ne permet pas à l'heure actuelle d'utiliser le templater dbt qui est évidemment le mieux adapté à notre usage.
  • il y a qqes problèmes de compatibilité entre les packages sqlfluff-dbt-templater et dbt à prendre en compte

ODSPEP pipeline with dbt

sources / Intermediate

The sources step is partially implemented.

Either

  • I clean all the other tables first.
  • or I skip to intermediate and only clean in sources the data I need in intermediate

Clean is:

  • casting data to the right datatype
  • column names to snake case
  • date formatting
  • JSONB data extraction

Remember: all the data we deal with in dbt must be in an intermediate table, not in the source table.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.