Strumenti utili ad acquisire, pulire, rielaborare dati

Un accenno per stimolare un approfondimento

Andrea Borruso

2022-11-03

Intro

onData è un’associazione promuove l’apertura dei dati pubblici per renderli un bene comune.

Oggi insieme

  • Acquisire
  • Pulire
  • Rielaborare

Ma non siamo maghi … abbiamo 30 minuti

Strumenti

Gusti, cultura, budget, team, tempo …

Cassetta degli attrezzi minima

  • browser;
  • editor di testo;
  • foglio elettronico;
  • caffé e buone letture.

Acquisire

Programmare

Niente vi può dare più super poteri nell’acquisire i dati. Nel linguaggio che preferite, ma ci sono dei linguaggi più vicini ai dati (R, Python, Julia, …).

Alcuni “fondamentali”:

  • espressioni regolari;
  • XPath e CSS selector;
  • SQL.

Perché (quasi) tutto è testo.

Estrarre “Ultima Ora” dal sito dell’ANSA

<div class="span3 breaking-news">
  <h2 class="pp-lbl lbl-sx lbl-red">Ultima ora</h2>
  <ol>
    <li>
      <em class="meta">21:19</em>
      <h3>
        <a href="/sito/notizie/topnews/2022/11/01/israele-exit-poll-almeno-61-seggi-su-120-per-netanyahu_1c0c7ba0-c0e3-4334-97a7-9d52071fb930.html">
        Israele: exit poll, almeno 61 seggi su 120 per Netanyahu
        </a>
      </h3>
    </li>
  </ol>
</div>

Estrarre l’“Ultima Ora” dal sito dell’ANSA

# scaria la homepage di ANSA
curl -kL 'https://www.ansa.it/' | \

# e poi estrai il resto di tutti i tag <a> dentro <h3>, dentro <div class="ultima-ora">
htmlq -t '.breaking-news h3 a'

Output:

Israele: exit poll, almeno 61 seggi su 120 per Netanyahu
Bolsonaro autorizza la transizione con Lula
Danimarca: exit poll, nessuna coalizione ha la maggioranza
Ucraina: Onu, domani nessuna nave in partenza
Wsj, 'imminente attacco dell'Iran contro l'Arabia Saudita'
Amb.russa, 'Razov parlava di cannoni italiani, non uomini'
Taylor Swift fa storia, conquista primi 10 posti classifica Usa

Il browser come strumento

Scaricare “Ultima Ora” dal sito dell’ANSA

# scaria la homepage di ANSA
curl -kL 'https://www.ansa.it/' | \

# estrai l'href dei link
htmlq -a href '.breaking-news h3 a' | while read -r url; do
  # scarica il contenuto della pagina
  wget  "https://www.ansa.it/$url"
done

“Pulire” i dati

Come è fatto un dato sporco

Guardiamo un esempio di file CSV

Distribuzione della patologia X nel territorio Y
id,Comune,temperatura_corporea,area,email,data
1,Cefalu',36.26,,info@email.it,12/27/2022
,,,,,
1,Santa  Flavia ,-28,,posta@emailit,28/3/2022
totale,,8.26,,,


+--------+----------------+----------------------+------+---------------+------------+
| 1      | 2              | 3                    | 4    | 5             | 6          |
+--------+----------------+----------------------+------+---------------+------------+
| id     | Comune         | temperatura_corporea | area | email         | data       |
| 1      | Cefalu'        | 36.26                | -    | info@email.it | 12/27/2022 |
| -      | -              | -                    | -    | -             | -          |
| 1      | Santa  Flavia  | -28                  | -    | posta@emailit | 28/3/2022  |
| totale | -              | 8.26                 | -    | -             | -          |
+--------+----------------+----------------------+------+---------------+------------+

Nel dettaglio

| id     | Comune         | temperatura_corporea | area | email         | data       |
| 1      | Cefalu'        | 36.26                | -    | info@email.it | 12/27/2022 |
| -      | -              | -                    | -    | -             | -          |
| 1      | Santa  Flavia  | -28                  | -    | posta@emailit | 28/3/2022  |
| totale | -              | 8.26                 | -    | -             | -          |
  • riga di intestazione inutile;
  • colonna completamente vuota;
  • spazi bianchi inutili;
  • riga compleamente vuota;
  • indirizzo e-mail non valido;
  • riga con il totale;
  • id ripetuti;
  • nome Comune scritto male;
  • date non uniformi e standard;
  • date in formato non standard;
  • codifica dei comuni;
  • temperatura senza senso.

Puliamo questi dati

Finché sono 5 righe lo possiamo fare a mano, ma se sono 5000?

<dati/input_01.csv tail -n +2 | \
mlr --c2p skip-trivial-records \
then remove-empty-columns \
then clean-whitespace \
then filter 'is_numeric($id)'


id Comune       temperatura_corporea email         data
1  Cefalu'      36.26                info@email.it 12/27/2022
1  Santa Flavia -28                  posta@emailit 28/3/2022

Due strumenti utilizzati: tail e Miller

Foglio elettronico - Google Sheets

Può essere uno strumento adatto per dati non grandi e per esplorare i dati (esempio).

La descrizione dei dati

È un po’ come entrare in una casa pulita.

Descrivere in modo “leggibile” (da noi e PC)

path: input_01_fd.csv
encoding: utf-8
name: input
profile: tabular-data-resource
format: csv
hashing: md5
dialect:
  delimiter: ","
schema:
  missingValues: ["NaN","-",""]
  fields:
    - name: id
      title: "Identificativo"
      description: "Codice univoco identificativo"
      type: integer
      constraints:
        required: true
        unique: true
      example: 1
    - name: Comune
      title: "Comune"
      description: "Nome del Comune in cui si è svolta la misurazione"
      type: string
      example: "Trieste"
    - name: temperatura_corporea
      title: "Temperatura corporea"
      description: "Valore in grado Celsius della temperatura corporea"
      type: number
      constraints:
        minimum: 34
      example: 36.12
    - name: area
      title: "Area"
      description: "Area geografica in una delle seguenti categorie: Nord, Centro, Sud"
      type: any
      constraints:
        enum:
          - Nord
          - Centro
          - Sud
      example: "Nord"
    - name: email
      title: "Indirizzo email"
      description: "Indirizzo email del soggetto"
      type: string
      format: email
      example: "esempio@tin.it"
    - name: data
      title: "Data misurazione"
      description: "Data in cui è stata effettuata la misurazione, nel formato YYYY-MM-DD"
      type: date
      format: default
      example: "2022-12-31"

Usare una descrizione standard per fare controlli

frictionless validate ./info.yml --path input_01_fd.csv


+-------+---------+------------+----------------------------------------------------+
|   row |   field | code       | message                                            |
+=======+=========+============+====================================================+
|     2 |       6 | type-error | Type error in the cell "12/27/2022" in row "2" and |
|       |         |            | field "data" at position "6": type is              |
|       |         |            | "date/%Y-%m-%d"                                    |
+-------+---------+------------+----------------------------------------------------+
|     3 |       3 | constraint | The cell "-28" in row at position "3" and field    |
|       |         | -error     | "temperatura_corporea" at position "3" does not    |
|       |         |            | conform to a constraint: constraint "minimum" is   |
|       |         |            | "34"                                               |
+-------+---------+------------+----------------------------------------------------+
|     3 |       5 | type-error | Type error in the cell "posta@emailit" in row "3"  |
|       |         |            | and field "email" at position "5": type is         |
|       |         |            | "string/email"                                     |
+-------+---------+------------+----------------------------------------------------+
|     3 |       6 | type-error | Type error in the cell "12/2/2022" in row "3" and  |
|       |         |            | field "data" at position "6": type is              |
|       |         |            | "date/%Y-%m-%d"                                    |
+-------+---------+------------+----------------------------------------------------+

Usare una descrizione standard per estrarre dati

🟩 I dati “giusti”

frictionless extract --csv --valid ./info.yml --path input_02_fd.csv


⚠️ E quelli “sbagliati”

frictionless extract --csv --invalid ./info.yml --path input_02_fd.csv


id,Comune,temperatura_corporea,area,email,data
1,Cefalu',36.26,,info@email.it,
3,Santa Flavia,-28,,,


Pulizie “intelligenti” e arricchimento

L’eccellente OpenRefine

Grazie

Andrea Borruso
mailto:andrea.borruso@ondata.it