etalab / notebooks

🤓 📓 📊
4 stars 4 forks source link

IRVE : nettoyage observations #8

Closed AntoineAugusti closed 4 years ago

AntoineAugusti commented 4 years ago

Il y a déjà plusieurs opérations de nettoyage en place pour la consolidation IRVE, voir par exemple #6.

La colonne observations est indiquée comme obligatoire dans le schéma. C'est un choix que j'ai du mal à comprendre : il me parait raisonnable qu'il n'y ait parfois rien à noter.

Mes propositions :

Qu'en pensez-vous ?

AntoineAugusti commented 4 years ago

J'ai voulu compter les erreurs principales par colonne et code, j'ai utilisé validata-core en faisant quelques modifications. Voici ce que j'obtiens.

Il y a 11325 dans le CSV et actuellement 8668 erreurs de valeurs.

{
  "count": 8669,
  "structure-errors": {
    "count": 1,
    "count-by-code": {
      "extra-header": 1
    }
  },
  "value-errors": {
    "count": 8668,
    "count-by-code": {
      "pattern-constraint": 564,
      "required-constraint": 7532,
      "type-or-format-error": 572
    },
    "count-by-col-and-code": {
      "Xlongitude": {
        "required-constraint": 2,
        "type-or-format-error": 10
      },
      "Ylatitude": {
        "required-constraint": 2,
        "type-or-format-error": 9
      },
      "acces_recharge": {
        "required-constraint": 3
      },
      "accessibilité": {
        "required-constraint": 560
      },
      "code_insee": {
        "pattern-constraint": 564,
        "required-constraint": 917
      },
      "id_station": {
        "required-constraint": 446
      },
      "n_enseigne": {
        "required-constraint": 397
      },
      "n_station": {
        "required-constraint": 2
      },
      "nbre_pdc": {
        "required-constraint": 1671
      },
      "observations": {
        "required-constraint": 3532
      },
      "puiss_max": {
        "type-or-format-error": 553
      }
    },
    "rows-count": 5303
  }
}

Le script utilisé

from validata_core import validate

from collections import defaultdict
import json
import sys

source = "https://static.data.gouv.fr/resources/fichier-consolide-des-bornes-de-recharge-pour-vehicules-electriques/20200320-224347/bornes-irve-20200320.csv"
schema = "https://schema.data.gouv.fr/schemas/etalab/schema-irve/1.0.2/schema.json"
report = validate(source, schema)

columns = report["tables"][0]["headers"]

res = {}
for error in report["tables"][0]["errors"]:
    if error["tag"] != "value":
        continue
    col = columns[(error["column-number"] - 1)]
    if col not in res:
        res[col] = defaultdict(int)
    res[col][error["code"]] += 1

report["tables"][0]["error-stats"]["value-errors"]["count-by-col-and-code"] = res
json.dump(
    report["tables"][0]["error-stats"],
    sys.stdout,
    ensure_ascii=False,
    indent=2,
    sort_keys=True,
)

qui requiert un patch de validata-core: https://git.opendatafrance.net/validata/validata-core/-/issues/11

AntoineAugusti commented 4 years ago

J'ai soumis l'idée d'ajouter cette information directement dans validata-core https://git.opendatafrance.net/validata/validata-core/-/issues/12

abulte commented 4 years ago

Je ne vois pas (plus) pourquoi cette colonne est obligatoire. Je pense que c'est une interprétation trop rapide du décret de ma part :

Tous les champs sont obligatoires. Si la donnée n’est pas disponible (comme l’identifiant, par exemple) la colonne doit être présente et vide.

Il se trouve que pour GoodTables tous les champs (ie les colonnes) sont toujours obligatoires selon la définition de l'arrêté. Inutile donc d'ajouter la contrainte required.

AntoineAugusti commented 4 years ago

D'accord, dans ce cas je ferai une proposition de modification du schéma IRVE 👍

geoffreyaldebert commented 4 years ago

Ok avec vous, on retire la mention required du schéma. Pas besoin du coup d'ajouter une valeur "Rien à signaler".

abulte commented 4 years ago

C’est bon maintenant je crois ?