Ogni scusa è buona per incontrarci e fare pulizia sui dati

Cantieri Culturali alla Zisa – Palermo – Google Maps
Cantieri Culturali alla Zisa – Interno

Appuntamento ai Cantieri Culturali alla Zisa dove troviamo l’inaugurazione di una piazza dedicata a Fabrizio De Andrè (la foto di sopra è un murales realizzato per l’evento – autore foto gbvitano).

Ma facciamo un passo indietro: la sera prima preparo il laptop da portare a Palermo e usarlo durante l’esercitazione con VisiData e Miller, ma alle ore 10:00, dopo quasi due ore di viaggio e 150 km percorsi, raggiunto il parcheggio alla Zisa sono assalito da un dubbio atroce: ma ho preso il notebook?? NOoooooo!!! dimentico lo strumento sulla sedia dello studio. 😦

Totò – Andrea -Gianni

Doveva partecipare anche Ciro ma la febbre l’ha costretto a stare a casa.

In anteprima mondiale l’agenda e il nuovissimo laptop di Andrea:

strumenti di lavoro di Andrea

Andrea inizia parlando dei dati messi a disposizione dall’ ISTAT, indicatori del Bes nelle province e città metropolitane italiane, e ci fa notare subito che hanno una struttura poco usabile:

Esempio di dataset poco usabile

in giallo righe usate come intestazioni; valori NULL con i puntini …. ed altri errori.

In meno di tre ore Andrea ci spiega come rendere usabile questi dataset usando la riga di comando e due tool grandiosi: VisiData e Miller.

Usando VisiData:

VisiData in azione

tradotto in testo:

  1. digitare gz* e scrivere: \.\.+/ invio;
  2. con le frecce spostarsi nella colonna ‘Indicatori del dominio’ e digitare SHIFT+^ per modificare e scrivere IndicatoriLong;
  3. spostarsi nella colonna ‘Unita di misura‘ e digitare za per aggiungere un campo e poi digitare Indicatori;
  4. posizionarsi nella prima colonna ‘N.‘ e prima riga e digitare , (virgola) verranno selezionati tutte le righe che hanno quella caratteristica;
  5. posizionarsi nella colonna appena aggiunta e digitare g= e scrivere il nome del campo modificato al punto 2 IndicatoriLong e invio;
  6. digitare gu per deselezionare;
  7. digitare la f per il fill-down;
  8. ripetere il punto 4 per selezionare le righe;
  9. cancellare le righe selezionate digitando gd;
  10. spostarsi nella prima colonna e digitare SHIFT+! per renderla indice, ripetere per le altre tre colonne;
  11. digitare M per il Melt;
  12. digitare CTRL+S per salvare.

Usando Miller:

#!/bin/bash

set -x

# crea variabile temporanea per memorizzare il nome della cartella
folder="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# rimuovi dalla cartella ogni CSV
rm "$folder"/*.csv

# estrai dal file xlsx tutti i fogli come CSV
# vengono creati dei CSV con nome che inizia con tmp__ seguito dal nome del foglio
pyexcel transcode "$folder"/"37_Sicilia_Indicatori per singola provincia, anno e dominio.xlsx" "$folder"/tmp.csv

# per ogni FILE CSV creato fai pulizia e ristrutturazione con Miller
for i in "$folder"/*.csv; do

# crea una variabile per raccogliere il nome di ogni file CSV, senza estensione
    nomefile=$(echo "$i" | sed -r 's|^(.*\/)(.+)(\.csv)$|\2|g')
# crea una variabile per creare un nome di output dei file senza il suffisso tmp__ e senza estensione
    nome=$(echo "$i" | sed -r 's|^(.*\/)(tmp__)(.+)(__)(.+.csv)$|\3|g')

# fai la pulizia e ristrutturazione con Miller
    mlr --csv clean-whitespace \
        then put -S 'if (${Unità di misura} == "") {$Indicatore = ${Indicatori del dominio}} else {$Indicatore = ""}' \
        then fill-down -f Indicatore \
        then filter -S '${Unità di misura} != ""' \
        then put -S 'for (k in $*) {$[k] = gsub($[k], "\.\.+", "");}' \
        then put -S 'for (k in $*) {$[k] = gsub($[k], "^-+$", "");}' \
        then reshape -r "^2" -o anno,valore \
        then reorder -f Indicatore \
        then put -S '$foglio="'"$nome"'"' \
        then filter '$valore>-999999' \
        then sort -f foglio,Indicatore -n anno,"N." "$folder"/"$nomefile".csv >"$folder"/"$nome".csv
done

# rimuovi tutti i CSV con nome con suffisso tmp__
rm "$folder"/tmp_*.csv

# crea un unico file di insieme
mlr --csv cat "$folder"/*.csv >"$folder"/Sicilia_Indicatori_per_singola_provincia_anno_e_dominio.csv

il codice va copiato e incollato in un editor di testo e salvato bes.sh

Miller non supporta i file xlsx di excel e quindi occorre preliminarmente trasformare il file in csv, per far questo occorre usare l’utility pyexcel che si installa cosi:

# si scrivi questo primo comando e si da invio
python3 -m pip install --user --upgrade pyexcel-cli
# e se tutto procede per bene si aggiunge il supporto per i file xlsx
python3 -m pip install --user --upgrade pyexcel-xlsx

dopo l’installazione portatevi nella cartella che contiene il file xlsx e lanciate il seguente codice:

pyexcel transcode ./"37_Sicilia_Indicatori per singola provincia, anno e dominio.xlsx" tmp.csv

creerà tanti file csv quanti sono i fogli presenti nel file xlsx.

cartella di output per testare il funzionamento

lo script bes.sh va lanciato a partire da questa cartella:

cartella da cui iniziare

video demo:

Miller in azione

NOTE FINALI: Purtroppo uso ancora poco la riga di comando ma resto sempre impressionato dalla potenza di questo strumento e soprattutto dalle sue utility come in questo caso VisiData e Miller: Visidata per singolo file e Miller per agire su insiemi di file. Vedere in azione Andrea è il miglior modo per apprezzare e innamorarsi della riga di comando.

Riferimenti:

Ringraziamenti:

Annunci

2 pensieri su “Ogni scusa è buona per incontrarci e fare pulizia sui dati

  1. Caro Totò è un post che mi fa scendere la lacrimuccia. Sono fortunato ad avervi incontrato.

    È stata una mattinata molto bella, come essere in vacanza con i compagni del liceo!!!

    Piace a 2 people

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.