indecis-it / data

Italian electoral programs data. Open data source for indecis.it
Creative Commons Attribution 4.0 International
6 stars 0 forks source link

defining data entry schema #16

Closed dennisangemi closed 2 years ago

dennisangemi commented 2 years ago

Alla luce di #13 e #15 butto giù la mia proposta per effettuare il data entry. L'ordine proposto di seguito è importante:

Che ne dite? @vi-enne @LorenzoRuff @angelogulina

vi-enne commented 2 years ago

La mia proposta: semplificare ancora, usando un approccio wide per il data entry. I fogli glossary, relic, items, status e i-list potrebbero divenire un unico foglio, con 3 colonne per ogni lista: endorsement, description e source_title, oltre alle colonne necessarie per subject (category, subject_slug, ...).

Esempio:

subject_id subject subject_slug category category_id pd_endorsement pd_source pd_description avs_endorsement avs_source avs_description ...
1 Alloggi popolari alloggi-popolari Protezione sociale 10 green Programma elettorale PD bla bla green Programma elettorale AVS bla bla

I subject possono venire aggiunti a mano in questo foglio, con la certezza che siano presenti per tutte le liste e con le stesse categorie. Da questo foglio è possibile in seguito ottenere la versione long.

dennisangemi commented 2 years ago

Ciao @vi-enne, atteso che odio versione wide della qualsiasi cosa (preferisco tidy data), la tua proposta mi sembra molto interessante.

Vedo però più di un problema per @angelogulina che dovrebbe riscrivere da 0 il codice per popolare la board a partire dal nuovo foglio items.

Una domanda per @vi-enne

Da questo foglio è possibile in seguito ottenere la versione long

come? (tecnicamente)

dovrebbe farlo Angelo?

Per quanto riguarda pubblicazione in formato open: Non possiamo pubblicare un csv così (almeno io mi rifiuto hahah)

Nonostante tutto però la tua proposta mi piace. Ci rifletto su ma sentirei @angelogulina

P.s. IMHO la procedura da seguire per data entry la sceglie:

  1. chi il data entry lo sta facendo ( grazie @vi-enne e @LorenzoRuff )
  2. Chi dovrà usare i dati (@angelogulina)

La mia è solo un"opinione

dennisangemi commented 2 years ago

@vi-enne come vorresti trattare i subject che appartengono a più categorie? Duplicando le righe?

ghost commented 2 years ago

L'approccio wide non mi convince a pieno, ma personalmente non cambia moltissimo sulla struttura. Cercherei solo di semplificare l'inserimento di un nuovo item, senza dover fare copia incolla in tutti i fogli.

dennisangemi commented 2 years ago

Cercherei solo di semplificare l'inserimento di un nuovo item, senza dover fare copia incolla in tutti i fogli.

Ciao @LorenzoRuff questo problema non dovrebbe presentarsi più perché ho inserito delle formule che popolano automaticamente la colonna subject nei fogli i-list

vi-enne commented 2 years ago

Cercherei solo di semplificare l'inserimento di un nuovo item, senza dover fare copia incolla in tutti i fogli.

Ciao @LorenzoRuff questo problema non dovrebbe presentarsi più perché ho inserito delle formule che popolano automaticamente la colonna subject nei fogli i-list

Dovrebbe funzionare allora (bisogna rifare le i-list già presenti?). Cosa succede a i-list se rimuovo un subject da glossary? Sto pensando alla pulizia e al consolidamento dei subjects.

dennisangemi commented 2 years ago

(bisogna rifare le i-list già presenti?)

Non credo @vi-enne, sarebbe da verificare se la formula per popolare i-lis sia presente effettivamente in tutti i fogli i-list. Attualmente purtroppo non posso guardare

Cosa succede a i-list se rimuovo un subject da glossary?

Quanto a questo, purtroppo succede un bel casotto. Se si rimuove un subject dal glossary, esso sarà rimosso anche da i-list però verranno alterate le relazioni tra subject e endorsement. Questo è senza dubbio problematico ma se prima si selezionano i subject in glossary, e poi NON si toccano più (ok rinominare, non ok eliminare, non ok spostare) allora sarà possibile compilare i-list senza problemi

dennisangemi commented 2 years ago

Sto pensando alla pulizia e al consolidamento dei subjects.

@vi-enne farlo adesso mi sembra ok (grazie)

Farlo in seguito mi sembra quasi impossibile

vi-enne commented 2 years ago

Il vantaggio del metodo wide sarebbe (anche) quello: per eliminare un subject basterebbe eliminare tutta la riga corrispondente. Non so, con il sistema attuale sarebbe il caso di consolidare/eliminare i subject che abbiamo adesso con priorità, altrimenti rischiamo di complicare le cose in seguito.

angelogulina commented 2 years ago

Grazie @vi-enne @LorenzoRuff e @dennisangemi – per quanto mi riguarda (parliamo solo lato codice), dovrei lavorare sia che si adotta l'approccio relic che quello wide.

Dal JSON alla UI ci sono 3 livelli. In entrambi i casi, le modifiche andrebbero applicate solo ad uno con basso rischio (siamo così bravi che abbiamo pure due unit test 😂).

Taggatemi pure quando avete preso una decisione, così buttiamo giù un piano per assicurarci che le modifiche apportate ai data non rompano il sito.

dennisangemi commented 2 years ago

Grazie @angelogulina, io lascerei decidere @vi-enne e @LorenzoRuff

L'approccio wide faciliterebbe il lavoro di data entry quindi se per voi è ok, per me è ok. L'unica cosa da tenere in considerazine è che bisogna effettuare un reshaping (wide to long) per pubblicare un csv long.

I fogli glossary, relic, items, status e i-list potrebbero divenire un unico foglio, con 3 colonne per ogni lista

A questo punto, se siamo indirizzati verso approccio wide, seguirei la struttura di proposta da @vi-enne ma

vi-enne commented 2 years ago

Oppure puliamo i subject adesso e li inseriamo con cura dopo, in modo da non cancellare mai.

dennisangemi commented 2 years ago

Oppure puliamo i subject adesso e li inseriamo con cura dopo, in modo da non cancellare mai.

Per me sono sono soluzioni valide entrambe. La tua (wide) sarebbe assolutamente più flessibile nella gestione dei subject (considererei comunque di mantenere relic).

dennisangemi commented 2 years ago

@vi-enne se in mente hai già idea di come fare reshaping (magari con action in R) seguirei la tua proposta. Ad angelo potremmo consegnare un csv/json che abbia la stessa struttura dell'attuale foglio (items)

Io domani potrei provare a giocare con R ma qui tittə sappiamo che non ti batte nessuno ;)

P.s. dubito che si possa fare reshaping in google sheets. Tutte le volte che tento mi metto le mani ai capelli e mi sembra folle il silenzio di Google. In passato sono riuscito a concatenate qualche array ma erano situazioni più facili di questa

angelogulina commented 2 years ago

@dennisangemi @vi-enne provo a esprimermi in maniera più chiara.

Ad angelo potremmo consegnare un csv/json che abbia la stessa struttura dell'attuale foglio (items)

Suggerisco quindi di scartare l'idea del codice in R. A meno che il lavoro in R non sia davvero veloce e banale da mantenere (non ho le competenze per valutarlo), meglio che ognuno dedichi tempo al proprio dominio (almeno in questo momento).

Considerando le opzioni che proponete, non vedo nessuna difficoltà da parte mia a riscrivere un po' di codice per fare mapping del JSON. Aggiungere un altro livello (con R) avrebbe invece queste conseguenze:

Grazie 🙇

dennisangemi commented 2 years ago

Chiaro @angelogulina, ma riflettevo anche sul fatto che il csv long servirebbe per la pubblicazione in formato open. Dal momento che non vedo come ottenerlo in google sheet, mi sa che siamo quasi obbligati a passare da R. A meno che qualcuno abbia un'altra idea

angelogulina commented 2 years ago

@dennisangemi, grazie per il chiarimento.

Teniamo comunque separate le cose:

  1. pubblicazione open
  2. quale formato fornire a me (sempre json comunque)
dennisangemi commented 2 years ago

Certo @angelogulina, ma con R probabilmente prendiamo due piccioni con una fava:

@vi-enne ho provato a buttar giù qualcosa in R

input (df): subject_id subject subject_slug url pd_endorsement pd_source pd_description avs_endorsement avs_source avs_description
1 Alloggi popolari alloggi-popolari https://it.wikipedia.org/wiki/Istituto_Autonomo_Case_Popolari green Programma elettorale PD bla bla green Programma elettorale AVS bla bla
2 blabla blabla https://it.wikipedia.org/wiki/Bla_Bla_Bla red Programma elettorale PD bla bla green Programma elettorale AVS bla bla
input (relic): subject category
Alloggi popolari persone
Alloggi popolari cura
blabla ciao
blabla persone

code:

df %>%
    rename(item_source.pd = pd_source, 
           item_source.avs = avs_source, 
           item_description.pd = pd_description, 
           item_description.avs = avs_description, 
           item_endorsement.pd = pd_endorsement, 
           item_endorsement.avs = avs_endorsement) %>%
    pivot_longer(cols = starts_with("item"), 
          names_to = c(".value", "field"), names_sep = "_") %>%
    separate(field, into = c("type", "list"), sep = "\\.") %>%
    spread(type,item) %>%
    left_join(relic,., by = "subject")
output: subject category subject_id subject_slug url list description endorsement source
Alloggi popolari persone 1 alloggi-popolari https://it.wikipedia.org/wiki/Istituto_Autonomo_Case_Popolari avs bla bla green Programma elettorale AVS
Alloggi popolari persone 1 alloggi-popolari https://it.wikipedia.org/wiki/Istituto_Autonomo_Case_Popolari pd bla bla green Programma elettorale PD
Alloggi popolari cura 1 alloggi-popolari https://it.wikipedia.org/wiki/Istituto_Autonomo_Case_Popolari avs bla bla green Programma elettorale AVS
Alloggi popolari cura 1 alloggi-popolari https://it.wikipedia.org/wiki/Istituto_Autonomo_Case_Popolari pd bla bla green Programma elettorale PD
blabla ciao 2 blabla https://it.wikipedia.org/wiki/Bla_Bla_Bla avs bla bla green Programma elettorale AVS
blabla ciao 2 blabla https://it.wikipedia.org/wiki/Bla_Bla_Bla pd bla bla red Programma elettorale PD
blabla persone 2 blabla https://it.wikipedia.org/wiki/Bla_Bla_Bla avs bla bla green Programma elettorale AVS
blabla persone 2 blabla https://it.wikipedia.org/wiki/Bla_Bla_Bla pd bla bla red Programma elettorale PD
dennisangemi commented 2 years ago

@vi-enne probabilmente il codice è super sporco (sentiti libero di apportare modifiche) però ho immaginato questo workflow:

Qui lo script in R che sto preparando

dennisangemi commented 2 years ago

Ho predisposto un'action che esegue il workflow presentato sopra, sembra funzionare

Ci ha messo 7 min. Sono tantini. Sono sicuro che il Borruso riuscirebbe a fare wide2long usando miller (che gira in pochissimi secondi) ma io mi arrangio

dennisangemi commented 2 years ago

Aggiornamenti: A seguito di un piccolo confronto, io e @vi-enne siamo d'accordo ad utilizzare versione wide per la grande flessibilità che essa consente. Passeremo da R per pubblicare csv/json long e dare ad @angelogulina un items.json praticamente uguale a quello che esiste adesso.

Task:

dennisangemi commented 2 years ago

Ciao @angelogulina, io e @vi-enne oggi abbiamo finalizzato la struttura per il data entry. Domani scriveremo le istruzioni per i/le contributors che si vorranno unire a noi.

Siamo riusciti ad effettuare il reshaping del foglio wide senza troppi problemi. L'output in formato long è new_items.csv.

  1. Per favore puoi effettuare un sanity check?
  2. Mi dai il via libera per rinominare new_items in items per aggiornare i dati del sito?
  3. Mi confermi che non si dovrebbe rompere nulla e che non è richiesto un tuo intervento lato codice?

Grazie ;)

angelogulina commented 2 years ago

Ciao @dennisangemi, grazie a te e a @vi-enne per questo incredibile lavoro. Scusate il ritardo nella risposta.

  1. Fatto, sembra tutto OK
  2. Hai il via libera
  3. Non ho avuto bisogno di modificare il codice
dennisangemi commented 2 years ago

Grazie @angelogulina , ho modificato i file che vedi sopra ma mi pare che il sito non si stia aggiornando. Ho fatto danno o dobbiamo dare un po' di tempo per la compilazione del sito statico?

dennisangemi commented 2 years ago

Adesso funziona tutto. Grazie @angelogulina @vi-enne chiudo