etalab / transport-site

Rendre disponible, valoriser et améliorer les données transports
https://transport.data.gouv.fr
190 stars 29 forks source link

Assurer la disponibilité d'un identifiant unique stable pour toutes les ressources #1946

Closed thbar closed 1 year ago

thbar commented 2 years ago

Je crée ce ticket à part pour voir y faire référence, c'est une sous-partie vraiment essentielle de #1930.

Dans #1937 on refond complètement l'historisation des données, en ne traitant que GTFS pour l'instant.

Il y a une limitation toutefois, qui est que les ressources tirées d'OpenDataSoft qui sont stockées sous forme de CSV ayant N lignes avec 1 sous-ressource par ligne, ne sont plus historisables dès qu'on passe à plus d'une ligne.

Ce cas va se produire de plus en plus car on promeut pour l'instant la technique du CSV avec 2 lignes (1 gifs, 1 gtfs-rt) pour l'ouverture, mais sans identifiant correct pour l'instant.

Les impacts actuels sont (liste à compléter):

Idées variées (liste à compléter) pour remédier à cette situation:

Je propose d'organiser un petit atelier / brainstorm là dessus pour trouver une solution, avant de créer trop de jeux avec ces caractéristiques, qui vont venir polluer notre système.

thbar commented 2 years ago

J'ai fait une analyse pour me rendre compte de tous les contenus CSV de ce type ayant déjà plus d'une ligne, et avoir une vue d'ensemble du sujet, voilà les résultats.

Je récupère (comme dans le job d'historisation) les ressources qui partagent un "id de resource datagouv", puis je télécharge le CSV, je le décode et je l'affiche.

Attention : si on ne voit ici que 21 ressources traitées de cette façon, il y a d'autres ressources qui n'apparaissent pas car elles sont seules dans leur fichier CSV (mais qui sont en fait déjà un peu concernées) ; il faudra que je refasse une analyse pour déterminer combien.

Ici on a 2 GTFS (un normal et un modifié). Ils ont chacun un UUID qui est assigné par le fournisseur (chez eux).

[
  %{
    "date_de_debut_de_validite" => "2021-07-05",
    "date_de_fin_de_validite" => "2022-07-03",
    "fichier" => "https://data.idelis.fr/api/v2/catalog/datasets/fichier-des-donnees-theoriques-du-reseau-idelis-au-format-gtfs/files/400d7da94eaacb5e52c612f8ac28e420",
    "id" => "GTFS"
  },
  %{
    "date_de_debut_de_validite" => "2021-07-05",
    "date_de_fin_de_validite" => "2022-07-03",
    "fichier" => "https://data.idelis.fr/api/v2/catalog/datasets/fichier-des-donnees-theoriques-du-reseau-idelis-au-format-gtfs/files/5b8c23004f654692dcd23549b9b6cb5f",
    "id" => "GTFS_modifie"
  }
]

Ici c'est une paire "GTFS" et "GTFS-RT":

[
  %{
    "description" => "Offre théorique de transport du réseau urbain Agglobus de BOURGES",
    "fichier" => "https://data.centrevaldeloire.fr/api/v2/catalog/datasets/agglobus-offre-theorique-mobilite-reseau-urbain-de-bourges/files/f1fc522c3aa23ef1efe553d9c1b02790",
    "id" => "BOURGES GTFS"
  },
  %{
    "description" => "Données temps réel du réseau urbain Agglobus de BOURGES",
    "fichier" => "https://data.centrevaldeloire.fr/api/v2/catalog/datasets/agglobus-offre-theorique-mobilite-reseau-urbain-de-bourges/files/07b1b166df5e5f866ad75589b3824978",
    "id" => "BOURGES GTFS RT"
  }
]

Là ce sont 2 GTFS, avec des dates de validité différentes:

[
  %{
    "debutvalidite" => "2021-11-29",
    "description" => "Version 2020.3.2 - Du 29/11/2021 au 19/12/2021",
    "fichier" => "https://data.explore.star.fr/api/v2/catalog/datasets/tco-busmetro-horaires-gtfs-versions-td/files/eff7a320eaf4b2549d7a62e5eef7ec56",
    "finvalidite" => "2021-12-19",
    "id" => "GTFS_2020.3.2_20211129_20211219",
    "publication" => "2021-11-25T12:08:38+01:00",
    "tailleoctets" => "6051526",
    "url" => "http://ftp.keolis-rennes.com/opendata/tco-busmetro-horaires-gtfs-versions-td/attachments/GTFS_2020.3.2_20211129_20211219.zip"
  },
  %{
    "debutvalidite" => "2021-12-20",
    "description" => "Version 2021.4.0.1 - Du 20/12/2021 au 02/01/2022",
    "fichier" => "https://data.explore.star.fr/api/v2/catalog/datasets/tco-busmetro-horaires-gtfs-versions-td/files/53bdbc4a52603094fbb75cd8a0f8625d",
    "finvalidite" => "2022-01-02",
    "id" => "GTFS_2021.4.0.1_20211220_20220102",
    "publication" => "2021-12-08T07:42:19+01:00",
    "tailleoctets" => "3719018",
    "url" => "http://ftp.keolis-rennes.com/opendata/tco-busmetro-horaires-gtfs-versions-td/attachments/GTFS_2021.4.0.1_20211220_20220102.zip"
  }
]

Là ce sont un GTFS et le Netex associé:

[
  %{
    "donnees" => "Horaires des trains Transilien GTFS",
    "download" => "https://eu.ftp.opendatasoft.com/sncf/gtfs/transilien-gtfs.zip",
    "format" => "GTFS"
  },
  %{
    "donnees" => "Horaires des trains Transilien NeTEx",
    "download" => "https://eu.ftp.opendatasoft.com/sncf/gtfs/transilien-netexfr.zip",
    "format" => "NeTEx"
  }
]

Là ce sont 5 GTFS différents:

[
  %{
    "description" => "Fichier GTFS du réseau régional ALEOP en Mayenne",
    "fichier" => "https://donnees.paysdelaloire.fr/data/pdl53.zip",
    "libelle" => "GTFS Aléop 53",
    "publication" => "2021-10-07"
  },
  %{
    "description" => "Fichier GTFS du réseau régional ALEOP en Sarthe",
    "fichier" => "https://donnees.paysdelaloire.fr/data/pdl72.zip",
    "libelle" => "GTFS Aléop 72",
    "publication" => "2021-10-07"
  },
  %{
    "description" => "Fichier GTFS rassemblant l'intégralité des réseaux urbains et le réseau régional des Pays de la Loire : ALEOP +  ALEOPPRESQUILE + AGGLOBUS + CARENE + CHOLETBUS + IMPULSYON + IRIGO + OLEANE + RESO + SETRAM + SNCFTAD + TAN + TUL + YEUCONTINENT",
    "fichier" => "https://donnees.paysdelaloire.fr/data/pdl.zip",
    "libelle" => "GTFS Pays de la Loire complet",
    "publication" => "2021-10-07"
  },
  %{
    "description" => "Fichier GTFS du réseau régional ALEOP en Maine-et-Loire",
    "fichier" => "https://donnees.paysdelaloire.fr/data/pdl49.zip",
    "libelle" => "GTFS Aléop 49",
    "publication" => "2021-10-07"
  },
  %{
    "description" => "Fichier GTFS du réseau régional ALEOP en Vendée",
    "fichier" => "https://donnees.paysdelaloire.fr/data/pdl85.zip",
    "libelle" => "GTFS Aléop 85",
    "publication" => "2021-10-07"
  },
  %{
    "description" => "Fichier GTFS du réseau régional ALEOP en Loire-Atlantique",
    "fichier" => "https://donnees.paysdelaloire.fr/data/pdl44.zip",
    "libelle" => "GTFS Aléop 44",
    "publication" => "2021-10-07"
  }
]

Là ce sont 2 GTFS, avec des dates de validités différentes:

[
  %{
    "debutvalidite" => "2021-11-29",
    "description" => "Version 2020.3.2 - Du 29/11/2021 au 19/12/2021",
    "fichier" => "https://data.rennesmetropole.fr/api/v2/catalog/datasets/versions-des-horaires-theoriques-des-lignes-du-reseau-star-au-format-gtfs/files/eff7a320eaf4b2549d7a62e5eef7ec56",
    "finvalidite" => "2021-12-19",
    "id" => "GTFS_2020.3.2_20211129_20211219",
    "publication" => "2021-11-25T12:08:38+01:00",
    "tailleoctets" => "6051526",
    "url" => "http://ftp.keolis-rennes.com/opendata/tco-busmetro-horaires-gtfs-versions-td/attachments/GTFS_2020.3.2_20211129_20211219.zip"
  },
  %{
    "debutvalidite" => "2021-12-20",
    "description" => "Version 2021.4.0.1 - Du 20/12/2021 au 02/01/2022",
    "fichier" => "https://data.rennesmetropole.fr/api/v2/catalog/datasets/versions-des-horaires-theoriques-des-lignes-du-reseau-star-au-format-gtfs/files/53bdbc4a52603094fbb75cd8a0f8625d",
    "finvalidite" => "2022-01-02",
    "id" => "GTFS_2021.4.0.1_20211220_20220102",
    "publication" => "2021-12-08T07:42:19+01:00",
    "tailleoctets" => "3719018",
    "url" => "http://ftp.keolis-rennes.com/opendata/tco-busmetro-horaires-gtfs-versions-td/attachments/GTFS_2021.4.0.1_20211220_20220102.zip"
  }
]

Là on a 5 GTFS différents:

[
  %{
    "description" => "Fichier GTFS du réseau régional de transports scolaires en Vendée",
    "fichier" => "ftp://ftp-data:71dcb87c7c@Ftpdata.paysdelaloire.fr/Pdlsco85.zip",
    "libelle" => "GTFS scolaire 85",
    "publication" => "2020-11-06"
  },
  %{
    "description" => "Fichier GTFS du réseau régional de transports scolaires en Mayenne",
    "fichier" => "ftp://ftp-data:71dcb87c7c@Ftpdata.paysdelaloire.fr/Pdlsco53.zip",
    "libelle" => "GTFS scolaire 53",
    "publication" => "2020-11-06"
  },
  %{
    "description" => "Fichier GTFS du réseau régional de transports scolaires en Sarthe",
    "fichier" => "ftp://ftp-data:71dcb87c7c@Ftpdata.paysdelaloire.fr/Pdlsco72.zip",
    "libelle" => "GTFS scolaire 72",
    "publication" => "2020-11-06"
  },
  %{
    "description" => "Fichier GTFS du réseau régional de transports scolaires en Loire-Atlantique",
    "fichier" => "ftp://ftp-data:71dcb87c7c@Ftpdata.paysdelaloire.fr/Pdlsco44.zip",
    "libelle" => "GTFS scolaire 44",
    "publication" => "2020-11-06"
  },
  %{
    "description" => "Fichier GTFS du réseau régional de transports scolaires en Maine-et-Loire",
    "fichier" => "ftp://ftp-data:71dcb87c7c@Ftpdata.paysdelaloire.fr/Pdlsco49.zip",
    "libelle" => "GTFS scolaire 49",
    "publication" => "2020-11-06"
  }
]

Le script utilisé est le suivant:

# mix run duplicates.exs
import Ecto.Query

base_url = "https://www.data.gouv.fr/api/1/datasets/r"

# from ResourceHistoryDispatcherJob
duplicates  = DB.Resource
  |> where([r], not is_nil(r.datagouv_id))
  |> group_by([r], r.datagouv_id)
  |> having([r], count(r.datagouv_id) > 1)
  |> select([r], r.datagouv_id)
  |> DB.Repo.all()
  |> Enum.map(fn(x) -> [base_url, x] |> Enum.join("/") end)

duplicates
|> Enum.each(fn(url) ->
  IO.puts "\n* #{url}\n\n"
  %{status_code: 200, body: body} = HTTPoison.get!(url, [], follow_redirect: true)

  {:ok, stream} = body |> StringIO.open()

  IO.puts "```elixir"
  stream
  |> IO.binstream(:line)
  |> CSV.decode!(headers: true, separator: ?;)
  |> Enum.into([])
  |> IO.inspect(IEx.inspect_opts)
  IO.puts "```"

end)
thbar commented 2 years ago

Je précise aussi qu'on réfléchit côté @fchabouis (Miro et on va tous discuter) à utiliser la clé primaire (ou pas) pour identifier de façon unique.

thbar commented 2 years ago

À court terme ça va être la clé primaire id de la resource.

Je pense que ça tend à dire que page_url peut être rajouté pour #2303.

AntoineAugusti commented 2 years ago

Réglé par #2410 ?

AntoineAugusti commented 1 year ago

On a fait de beaux efforts pour stabiliser resource.id dans les derniers mois (historisation, ODS, fichiers remplacés sur data.gouv.fr). À voir si on veut aller plus loin plus tard.