Closed thbar closed 1 year 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)
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.
À 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.
Réglé par #2410 ?
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.
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.