Ho cercato di trovare una risposta a questa domanda per molti mesi mentre imparavo i panda. Uso SAS per il mio lavoro quotidiano ed è ottimo per il suo supporto out-core. Tuttavia, SAS è orribile come un software per numerose altre ragioni.
Un giorno spero di sostituire il mio uso di SAS con python e panda, ma al momento mi manca un flusso di lavoro fuori core per grandi set di dati. Non sto parlando di "big data" che richiedono una rete distribuita, ma piuttosto file troppo grandi per adattarsi alla memoria ma abbastanza piccoli da adattarsi a un disco rigido.
Il mio primo pensiero è quello di utilizzare HDFStore
per contenere set di dati di grandi dimensioni su disco e estrarre solo i pezzi necessari nei frame di dati per l'analisi. Altri hanno citato MongoDB come alternativa più facile da usare. La mia domanda è questa:
Quali sono alcuni flussi di lavoro delle migliori pratiche per realizzare quanto segue:
- Caricamento di file flat in una struttura di database permanente su disco
- Esecuzione di query su quel database per recuperare i dati da inserire in una struttura di dati panda
- Aggiornamento del database dopo aver manipolato i pezzi nei panda
Gli esempi del mondo reale sarebbero molto apprezzati, soprattutto da chiunque utilizzi i panda su "dati di grandi dimensioni".
Modifica - un esempio di come vorrei che funzionasse:
- Iterativamente importa un file flat di grandi dimensioni e memorizzalo in una struttura di database permanente su disco. Questi file sono in genere troppo grandi per adattarsi alla memoria.
- Per poter utilizzare Panda, vorrei leggere sottoinsiemi di questi dati (di solito solo poche colonne alla volta) che possono adattarsi alla memoria.
- Vorrei creare nuove colonne eseguendo varie operazioni sulle colonne selezionate.
- Dovrei quindi aggiungere queste nuove colonne nella struttura del database.
Sto cercando di trovare un modo ottimale per eseguire questi passaggi. Leggendo i collegamenti su panda e pytables sembra che aggiungere una nuova colonna potrebbe essere un problema.
Modifica: rispondendo alle domande di Jeff in particolare:
- Sto costruendo modelli di rischio di credito al consumo. I tipi di dati includono telefono, SSN e caratteristiche dell'indirizzo; valori di proprietà; informazioni dispregiative come casellari giudiziari, fallimenti, ecc ... I set di dati che utilizzo ogni giorno hanno in media da 1.000 a 2.000 campi in media di tipi di dati misti: variabili continue, nominali e ordinali di dati numerici e di caratteri. Raramente aggiungo righe, ma eseguo molte operazioni che creano nuove colonne.
- Le operazioni tipiche prevedono la combinazione di più colonne utilizzando la logica condizionale in una nuova colonna composta. Ad esempio
if var1 > 2 then newvar = 'A' elif var2 = 4 then newvar = 'B'
,. Il risultato di queste operazioni è una nuova colonna per ogni record nel mio set di dati. - Infine, vorrei aggiungere queste nuove colonne nella struttura dei dati su disco. Ripeterei il passaggio 2, esplorando i dati con campi incrociati e statistiche descrittive cercando di trovare relazioni interessanti e intuitive da modellare.
- Un file di progetto tipico è in genere di circa 1 GB. I file sono organizzati in modo tale che una riga sia costituita da una registrazione di dati del consumatore. Ogni riga ha lo stesso numero di colonne per ogni record. Questo sarà sempre il caso.
- È abbastanza raro che io crei un sottoinsieme per righe quando creo una nuova colonna. Tuttavia, è abbastanza comune per me creare un sottoinsieme nelle righe durante la creazione di report o la generazione di statistiche descrittive. Ad esempio, potrei voler creare una frequenza semplice per una specifica linea di business, ad esempio le carte di credito al dettaglio. Per fare ciò, selezionerei solo quei record in cui la linea di business = vendita al dettaglio oltre a qualsiasi colonna su cui voglio riferire. Quando creo nuove colonne, tuttavia, estraggerei tutte le righe di dati e solo le colonne di cui ho bisogno per le operazioni.
- Il processo di modellazione richiede che analizzi ogni colonna, cerchi relazioni interessanti con alcune variabili di risultato e crei nuove colonne composte che descrivano tali relazioni. Le colonne che esploro di solito sono fatte in piccoli gruppi. Ad esempio, mi concentrerò su una serie di dire 20 colonne che trattano solo di valori di proprietà e osserverò come si relazionano al default su un prestito. Una volta esplorate quelle e create nuove colonne, passo poi a un altro gruppo di colonne, dico istruzione universitaria e ripeto il processo. Quello che sto facendo è creare variabili candidate che spieghino la relazione tra i miei dati e alcuni risultati. Alla fine di questo processo, applico alcune tecniche di apprendimento che creano un'equazione da quelle colonne composte.
È raro che aggiungerei mai righe al set di dati. Quasi sempre creerò nuove colonne (variabili o caratteristiche nella statistica / linguaggio di apprendimento automatico).