opendatasicilia / tansignari

"T'ansignari e t'appeddiri"
http://tansignari.opendatasicilia.it
Creative Commons Attribution 4.0 International
18 stars 10 forks source link

come ottenere un formato dati strutturato partendo da un formato proveniente dal validatore dataset di AGID #206

Closed UO-TransizioneDigitaleComunePalermo closed 2 years ago

UO-TransizioneDigitaleComunePalermo commented 2 years ago

salve dal validatore di dataset dell'AGID ho questo file:

https://dati.gov.it/opendata/api/3/action/package_search?facet.field=[%22holder_name%22]&facet.limit=-1&fq=holder_name:%22Comune%20di%20Palermo%22

Vorrei ottenere un formato dati strutturato, anche tabellare se possibile, per capire che dati sono contenuti. Come si fa? Grazie

gbvitrano commented 2 years ago

Nel documento ci sono schede per link agli opendata delle elezioni comunali del 2017 2022-02-22_19h18_04 2022-02-22_19h18_30

UO-TransizioneDigitaleComunePalermo commented 2 years ago

grazie @gbvitrano era quello che volevo conoscere

dennisangemi commented 2 years ago

Sorry ma non è stato spiegato il come :(

gbvitrano commented 2 years ago

Sorry ma non è stato spiegato il come :(

Usando Visidata :-) da terminale vd "https://dati.gov.it/opendata/api/3/action/package_search?facet.field=%5B%22holder_name%22%5D&facet.limit=-1&fq=holder_name:%22Comune%20di%20Palermo%22" il file è json e può essere facilmente convertito in csv con servizio online :-)

gbvitrano commented 2 years ago

@UO-TransizioneDigitaleComunePalermo ecco il file csv output.csv

aborruso commented 2 years ago

Caro @UO-TransizioneDigitaleComunePalermo alias @cirospat il formato JSON, diciamo che è il formato dati di oggi, output standard di molte API. Quella è una risposta delle API di CKAN.

Un JSON non è quasi mai una tabella di x righe per n colonne, non è mai così poco nidificato come questo file (che è una tabella 2x2):

[
  {
    "nome": "ciro",
    "altezza": "media"
  },
  {
    "nome": "andrea",
    "altezza": "poco più che media"
  }
]

È quasi sempre una specie di tabella che all'interno ne contiene tante altre. Lo vedi nella gif di sotto, in cui hai:

json

Allora l'operazione che ci sarebbe da fare, per renderlo leggibile come vuoi tu, è il così detto flattening, ovvero l'estrazione delle tabelle che lo compongono, tenendo una colonna chiave che possa metterle in relazione.

Ci vuole un tool per interpretare il formato. Ce ne sono tanti e chi sviluppa codice, può farlo in qualsiasi linguaggio di scripting.

Lo strumento a riga di comando più famoso è jq, che ha il suo modo (abbastanza tipico) di sfogliare la gerarchia.

Le risorse ad esempio, sono figlie di results, che è figlio di result. La query per arrivare a resources si scrive così .result.results.resources, sfogliando l'albero gerarchico da sinistra verso destra. Ma è in realtà è poco più complicato, perché sia results che resources contengono vari elementi al loro interno, sono degli array e allora ci vogliono le quadre .result.results[].resources[]

E con questa query estrai le risorse https://jqplay.org/s/Ll4rEyaBHY

image

E se ti interessano soltanto l'URL e il formato, la query si complica un po' .result.results[].resources[]|{URL:.download_url,formato:.format}.

Ma torniamo a estrarre una delle tabelle, le risorse. Io in questi casi, uso la coppia jq più miller:

<input.json jq '.result.results[].resources[]' | mlr --j2c unsparsify >output.csv

ti dà un CSV come quello visualizzato qui.

cache_last_updated package_id id size download_url state hash description format mimetype_inner url_type revision_id mimetype cache_url name license created url uri last_modified license_type position access_url resource_type
null 90966e9d-cb06-454d-bbcb-2f0d396f2cca 4057e7af-1b49-4275-b559-6b19700124ec null http://circoscrizioni2017.comune.palermo.it/SEZ_3_999008_L21.xml active Distribuzione XML del dataset ELEZIONI AMMINISTRATIVE 2017 - VIII° CIRCOSCRIZIONE - VOTI AI CONSIGLIERI DI CIRC PER SEZ (LISTA 21) XML null null a28b38d3-7d7d-49ef-81e0-65573c1bfff8 null null Distribuzione XML del dataset ELEZIONI AMMINISTRATIVE 2017 - VIII° CIRCOSCRIZIONE - VOTI AI CONSIGLIERI DI CIRC PER SEZ (LISTA 21) https://creativecommons.org/licenses/by/4.0/ 2021-02-19T18:30:36.883765 http://circoscrizioni2017.comune.palermo.it/SEZ_3_999008_L21.xml http://circoscrizioni2017.comune.palermo.it/SEZ_3_999008_L21.xml null https://w3id.org/italia/controlled-vocabulary/licences/A21_CCBY40 0 https://opendata.comune.palermo.it/opendata-dataset.php?dataset=840 null
null 00419f01-0fc8-407d-8e5d-73ef2fa3bbdc c02a5768-4b08-4a0c-90de-edd50128a391 null http://circoscrizioni2017.comune.palermo.it/SEZ_3_999005_L28.xml active Distribuzione XML del dataset ELEZIONI AMMINISTRATIVE 2017 - V° CIRCOSCRIZIONE - VOTI AI CONSIGLIERI DI CIRC PER SEZ (LISTA 28) XML null null e8d86c66-9243-4e07-aaec-bbe546fbf7ee null null Distribuzione XML del dataset ELEZIONI AMMINISTRATIVE 2017 - V° CIRCOSCRIZIONE - VOTI AI CONSIGLIERI DI CIRC PER SEZ (LISTA 28) https://creativecommons.org/licenses/by/4.0/ 2021-02-19T18:35:10.677279 http://circoscrizioni2017.comune.palermo.it/SEZ_3_999005_L28.xml http://circoscrizioni2017.comune.palermo.it/SEZ_3_999005_L28.xml null https://w3id.org/italia/controlled-vocabulary/licences/A21_CCBY40 0 https://opendata.comune.palermo.it/opendata-dataset.php?dataset=760 null
null 0194c452-fdca-40d1-a5ba-b93ee045f024 ecb8bff6-ed05-44e1-8296-39c1fe8fd7d1 null http://consulta2018.comune.palermo.it/VotiCandEuroSez.xml active Distribuzione XML del dataset ELEZIONI CONSULTA DELLE CULTURE 2018 - DATI RELATIVI VOTI CANDIDATI PER SEZIONE XML null null 22d7643c-dd4d-4786-8648-81196963b6a2 null null Distribuzione XML del dataset ELEZIONI CONSULTA DELLE CULTURE 2018 - DATI RELATIVI VOTI CANDIDATI PER SEZIONE https://creativecommons.org/licenses/by/4.0/ 2021-02-19T18:33:20.380438 http://consulta2018.comune.palermo.it/VotiCandEuroSez.xml http://consulta2018.comune.palermo.it/VotiCandEuroSez.xml null https://w3id.org/italia/controlled-vocabulary/licences/A21_CCBY40 0 https://opendata.comune.palermo.it/opendata-dataset.php?dataset=1030 null
null 4177b9ea-81f4-4655-b12f-8f8af8dd172b 5b28a0e6-e1bc-4c1b-9e97-05b44410b99f null http://circoscrizioni2017.comune.palermo.it/SEZ_3_999006_L21.xml active Distribuzione XML del dataset ELEZIONI AMMINISTRATIVE 2017 - VI° CIRCOSCRIZIONE - VOTI AI CONSIGLIERI DI CIRC PER SEZ (LISTA 21) XML null null 3583d6a4-b0b9-4a24-91ec-bc4997807ab9 null null Distribuzione XML del dataset ELEZIONI AMMINISTRATIVE 2017 - VI° CIRCOSCRIZIONE - VOTI AI CONSIGLIERI DI CIRC PER SEZ (LISTA 21) https://creativecommons.org/licenses/by/4.0/ 2021-02-19T18:31:52.973775 http://circoscrizioni2017.comune.palermo.it/SEZ_3_999006_L21.xml http://circoscrizioni2017.comune.palermo.it/SEZ_3_999006_L21.xml null https://w3id.org/italia/controlled-vocabulary/licences/A21_CCBY40 0 https://opendata.comune.palermo.it/opendata-dataset.php?dataset=798 null
null 5c470b79-651a-43ba-9d95-49d2009eb455 f8239c5f-1f50-4774-a84d-e5bc7801e94a null http://circoscrizioni2017.comune.palermo.it/SEZ_3_999003_L2.xml active Distribuzione XML del dataset ELEZIONI AMMINISTRATIVE 2017 - III° CIRCOSCRIZIONE - VOTI AI CONSIGLIERI DI CIRC PER SEZ (LISTA 2) XML null null 78e355c4-489b-4630-a207-526d05cf6f8b null null Distribuzione XML del dataset ELEZIONI AMMINISTRATIVE 2017 - III° CIRCOSCRIZIONE - VOTI AI CONSIGLIERI DI CIRC PER SEZ (LISTA 2) https://creativecommons.org/licenses/by/4.0/ 2021-02-19T18:28:06.262820 http://circoscrizioni2017.comune.palermo.it/SEZ_3_999003_L2.xml http://circoscrizioni2017.comune.palermo.it/SEZ_3_999003_L2.xml null https://w3id.org/italia/controlled-vocabulary/licences/A21_CCBY40 0 https://opendata.comune.palermo.it/opendata-dataset.php?dataset=687 null
null 75f471b2-6184-41a6-8c9b-876f9283110c bd04c078-73d9-4910-9a52-1d7cd107b375 null http://circoscrizioni2017.comune.palermo.it/SEZ_3_999002_L7.xml active Distribuzione XML del dataset ELEZIONI AMMINISTRATIVE 2017 - II° CIRCOSCRIZIONE - VOTI AI CONSIGLIERI DI CIRC PER SEZ (LISTA 7) XML null null f6b818c5-b55d-458e-a2cc-9a2abefeccc2 null null Distribuzione XML del dataset ELEZIONI AMMINISTRATIVE 2017 - II° CIRCOSCRIZIONE - VOTI AI CONSIGLIERI DI CIRC PER SEZ (LISTA 7) https://creativecommons.org/licenses/by/4.0/ 2021-02-19T18:41:30.549975 http://circoscrizioni2017.comune.palermo.it/SEZ_3_999002_L7.xml http://circoscrizioni2017.comune.palermo.it/SEZ_3_999002_L7.xml null https://w3id.org/italia/controlled-vocabulary/licences/A21_CCBY40 0 https://opendata.comune.palermo.it/opendata-dataset.php?dataset=659 null
null 540ac937-e395-45a6-b5b8-bc5cb438661c 5ab4f07b-f4da-4e9a-b528-4cdc18eb9905 null https://opendata.comune.palermo.it/js/server/uploads/dataset/gtfs/_05102018083223.zip active Distribuzione ZIP del dataset AMAT PALERMO SPA - DATI DEL TRASPORTO PUBBLICO LOCALE 16-09-2018 31-12-2018 ZIP null null efa1d728-1919-4628-99b5-4a1f85cfb3ba null null Distribuzione ZIP del dataset AMAT PALERMO SPA - DATI DEL TRASPORTO PUBBLICO LOCALE 16-09-2018 31-12-2018 https://creativecommons.org/licenses/by/4.0/ 2021-02-19T18:41:41.062713 https://opendata.comune.palermo.it/js/server/uploads/dataset/gtfs/_05102018083223.zip https://opendata.comune.palermo.it/js/server/uploads/dataset/gtfs/_05102018083223.zip null https://w3id.org/italia/controlled-vocabulary/licences/A21_CCBY40 0 https://opendata.comune.palermo.it/opendata-dataset.php?dataset=1042 null

E se per ogni dataset volessi i tag? La query si complica, perché i tags e l'id del dataset sono separati e devi metterli insieme: .result.results|map_values(.tags[] + {id_dataset:.id})

Per averli in CSV di nuovo qualcosa come

<input.json jq '.result.results|map_values(.tags[] + {id_dataset:.id})' | mlr --j2c cat
vocabulary_id state display_name id name id_dataset
null active amministrative-2017 cdf9926a-23eb-454f-81ae-d2587c50f062 amministrative-2017 90966e9d-cb06-454d-bbcb-2f0d396f2cca
null active amministrative-2017 cdf9926a-23eb-454f-81ae-d2587c50f062 amministrative-2017 00419f01-0fc8-407d-8e5d-73ef2fa3bbdc
null active consulta-culture f7fc48ed-932d-4ebf-9d88-028d3267f6ce consulta-culture 0194c452-fdca-40d1-a5ba-b93ee045f024
null active amministrative-2017 cdf9926a-23eb-454f-81ae-d2587c50f062 amministrative-2017 4177b9ea-81f4-4655-b12f-8f8af8dd172b
null active amministrative-2017 cdf9926a-23eb-454f-81ae-d2587c50f062 amministrative-2017 5c470b79-651a-43ba-9d95-49d2009eb455
null active amministrative-2017 cdf9926a-23eb-454f-81ae-d2587c50f062 amministrative-2017 75f471b2-6184-41a6-8c9b-876f9283110c
null active amat c78efeff-9ace-4da5-9ca1-0346da58146f amat 540ac937-e395-45a6-b5b8-bc5cb438661c
null active amministrative-2017 cdf9926a-23eb-454f-81ae-d2587c50f062 amministrative-2017 ac13d1b9-8752-4eef-8f6a-68be50d74593
null active 2014 0d7f2cc1-003f-4afd-847b-2755d133a09b 2014 46b2a122-9cc9-446c-8051-5a9fca38b9fd
null active 2017 60821792-fe44-4012-8c81-a04697650276 2017 42c490c7-d349-4b83-8f77-866e5e1f06ca

L'output che ti ha inviato @gbvitrano non è di quelli che mi piacciono: è fatto da più di 1000 record, quando abbiamo 10 dataset e 10 risorse. Sono lì così tanti perché è come se fossero la moltiplicazione dei record di tutte le tabelle.

Farlo pulito è meglio, ma bisogna entrare un po' in questo mondo e impadronirsi degli strumenti e della teoria per interrogare e trasformare un JSON.

Sono stato lungo

UO-TransizioneDigitaleComunePalermo commented 2 years ago

caro @aborruso grazie del tempo che hai investito nel fornire una chiarissima ed esaustiva spiegazione al mio quesito. La tua risposta è molto didattica perchè spiega il "come fare". Devo ammettere che ad oggi non avrei una competenza adeguata ad ottenere un file di tipo tabellare da quel file output dell'API di CKAN. Ero interessato a conoscere i contenuti di quel file e ho chiesto il formato tabellare. E avete soddisfatto la mia esigenza. Grazie sempre di cuore per il tempo dedicato a spiegare cose che spesso per me sono ostiche a primo approccio.

aborruso commented 2 years ago

Caro @UO-TransizioneDigitaleComunePalermo non sono sicuro che sei stato soddisfatto.

Le API danno un risultato paginato, di 10 in 10, mentre tu hai 1186 dataset.

{
  "count": 1186,
  "sort": "score desc, metadata_modified desc",
  "facets": {
    "holder_name": {
      "Comune di Palermo": 1186
    }
  }
}

La tua era una curiosità o vorresti avere un riscontro su tutti i 1186 dataset? Cosa vorresti vedere di ognuno?

UO-TransizioneDigitaleComunePalermo commented 2 years ago

caro @aborruso grazie del tuo approfondimento, a questo punto credo che è necessario spiegarmi meglio.

Io parto da questo file: https://dati.gov.it/opendata/api/3/action/package_search?facet.field=%5B%22holder_name%22%5D&facet.limit=-1&fq=holder_name:%22Comune%20di%20Palermo%22

Se lo leggo così: image non ci capisco nulla.

La mia domanda è: che dati ci sono dentro questo file? Siccome io sono scecco, allora il formato tabellare mi permette di capire che dati ci sono in un dataset. Posso anche capire che dati ci sono in un formato XML e in un formato JSON, ma in ambedue i formati, per capire, devo avere un dato per ogni singola riga altrimenti non ci capisco molto.

Spero di essermi spigato più chiaramente ora. Forse ... :)

dennisangemi commented 2 years ago

@UO-TransizioneDigitaleComunePalermo forse ti basterebbe un jsonparser (cercalo nel market delle estensioni del tuo browser).

aborruso commented 2 years ago

Spero di essermi spigato più chiaramente ora. Forse ... :)

Non avevo capito nulla e ti ho dato una risposta inutile 😢

In questo caso ti basta un'estensione per browser. Io in chrome uso questa e vedo quella pagina come sotto.

image

Anche i devtoys tra le mille cose, hanno un "parser" di json che li rende leggibili

image

pigreco commented 2 years ago

ti ho dato una risposta inutile

nulla è inutile,

grazie per il tempo dedicatoci :-)

UO-TransizioneDigitaleComunePalermo commented 2 years ago

infatti è come dice @pigreco nulla è inutile quando dietro c'è una spiegazione

grazie per il tempo, credo che con l'estensione per Chrome soddisfo il mio bisogno di conoscere che dati ci sono dentro quel file