17 febbraio 2013

data.table in R

Dopo circa due anni di utilizzo, posso dire che data.table sia la libreria alla quale non credo si possa rinunciare nello sviluppo di un qualunque script di analisi dati in R.
Esistono diversi tutorial in rete, moltissime discussioni nella relativa help-list , tante discussioni su Stack Overflow, quindi il progetto è davvero maturo e molto supportato.

Questa libreria permette di lavorare con i data.table, ossia una enhanced version of data.frame, così come specificato nella pagine ufficiali del progetto. E' possibile eseguire operazioni tipiche di data munging , ossia manipolazioni di dati grezzi al fine di ricavarne un formato finale "pulito" e più utile all'utente. Diviene facile lavorare con grossi volumi di dati (limitatamente alla RAM della macchina), eseguendo operazioni analoghe a quanto avviene nei db relazionali in SQL, utilizzando le altre librerie per la statistica e il data mining (già disponibili in R). Tra le modalità di "grouping" nei dati, quindi, diviene possibile eseguire (con opportuni accorgimenti) una qualunque funzione statistica più o meno avanzata...rendendo sostanzialmente illimitato il campo di applicazione!!!!

Tra le diversi funzionalità esistenti, sicuramente la più importante da evidenziare è la join. Con una sintassi davvero intuitiva e con un gran risparmio di tempo (...e codice...), è possibile (a mio parere) dimenticare un qualunque altro sistema, disponibile in R, per le operazioni di "merging" di dati. Tuttavia, invece di dilungarmi su questo aspetto già ampiamente trattato in rete, preferisco porre l'evienza sulla  rolling-join.
Quando si lavora con dati ordinati rispetto al tempo, quindi con dati in serie storica, diviene spesso necessario eseguire una rolling-join, nota anche con il termine di last observation carried forward (LOCF) join. Si tratta di un tipo di operazione che non è facile da realizzare nei linguaggi di analisi dati, SQL compreso, ma che in R diviene molto semplice. Mentre è complicato descrivere a parole l'utilità di questa funzionalità, è molto facile fare un esempio.
Immaginate di seguire la variazione di due prodotti (a e b) venduti da due diversi siti web, quindi di scaricare periodicamente le nuove quotazioni per ogni aggiornamento pubblicato dai siti.
In R si disporrà dei seguenti data.table:


che avranno i seguenti dati:


Quindi, i dati provenienti dal sito 2 evidenziano una maggiore frequenza di variazione di prezzo. 
Quello che si vuole è una join tra le due tabelle che indichi, in ogni istante, la quotazione esistente sui due siti.
Una normale join (in stile "data.table") fornisce il seguente output che, evidentemente, non è quello che ci interessa:

Il prezzo del prodotto a in data 18/02, non essendo cambiata la quotazione dal sito 1, rimane quello disponibile alla data più recente (stessa cosa deve accadere nelle altre date in cui vi è un NA).

La rolling-join fornisce proprio l'output che ci interessa:

rendendo immediato il confronto tra i prezzi.

Le funzionalità della libreria sono tantissime e un utilizzo continuo rende sempre più indispensabile l'uso dei data.table per gli utenti di R !!!!


Nessun commento: