2009-06-19 5 views
6

Sto implementando una libreria di cross-tabulation in Python come esercizio di programmazione per il mio nuovo lavoro e ho un'implementazione dei requisiti che funziona ma è inelegante e ridondante. Mi piacerebbe un modello migliore per questo, qualcosa che permetta un movimento di dati bello e pulito tra il modello base, memorizzato come dati tabulari in file flat e tutti i risultati delle analisi statistiche che potrebbero essere chiesti a questo.Qual è un buon modello di dati per la tabulazione incrociata?

In questo momento, ho una progressione da una serie di tuple per ogni riga nella tabella, a un istogramma che conta le frequenze delle apparizioni delle tuple di interesse, a un serializzatore che - in modo maldestro - compila il output in un set di celle di tabella per la visualizzazione. Tuttavia, finisco per dover tornare al tavolo o all'istogramma più spesso di quanto voglio perché non ci sono mai abbastanza informazioni sul posto.

Quindi, qualche idea?

Edit: Ecco un esempio di alcuni dati, e quello che voglio essere in grado di costruire da esso. Nota che "." denota un po 'di dati' mancanti ', che sono contati solo condizionatamente .

1 . 1 
1 0 3 
1 0 3 
1 2 3 
2 . 1 
2 0 . 
2 2 2 
2 2 4 
2 2 . 

Se io stavamo cercando la correlazione tra le colonne 0 e 2 di cui sopra, questo è il tavolo che avrei dovuto:

. 1 2 3 4 
1 0 1 0 3 0 
2 2 1 1 0 1 

Inoltre, avrei voluto essere in grado di calcolare il rapporto di frequenza/totale, frequenza/subtotale, & c.

+0

Non è molto chiaro per me quello che stai cercando di fare. Puoi descrivere i requisiti o dare un esempio con alcuni dati e mostrare le trasformazioni che vuoi fare? –

+0

In questo esempio è meglio scrivere in ordine di colonna principale. – jonnii

+0

jonnii, non sono un gran esperto di statistica; puoi chiarire cosa intendi con questo? –

risposta

1

È possibile utilizzare un database in memoria sqlite come struttura dati e definire le operazioni desiderate come query SQL.

import sqlite3 

c = sqlite3.Connection(':memory:') 
c.execute('CREATE TABLE data (a, b, c)') 

c.executemany('INSERT INTO data VALUES (?, ?, ?)', [ 
    (1, None, 1), 
    (1, 0, 3), 
    (1, 0, 3), 
    (1, 2, 3), 
    (2, None, 1), 
    (2, 0, None), 
    (2, 2, 2), 
    (2, 2, 4), 
    (2, 2, None), 
]) 

# queries 
# ... 
-1

Perché non memorizzarlo utilizzando tabelle HTML? Potrebbe non essere il migliore, ma potresti quindi, molto facilmente, visualizzarlo in un browser.

Edit:

Ho appena riletto la domanda e si sta chiedendo per il modello di dati, non è un modello di memorizzazione. Per rispondere a questa domanda ...

Tutto dipende da come si sta segnalando sui dati. Ad esempio, se stai facendo un sacco di pivot o aggregazione, potrebbe avere più senso archiviarlo nell'ordine delle colonne, in questo modo puoi sommare una colonna per ottenere i conteggi, per esempio.

Aiuta molto se spieghi che tipo di informazioni stai cercando di estrarre.

+0

Non sono sicuro del tipo di dati, in realtà; gli esercizi vengono parcellizzate un passo alla volta (fase 1: leggere il file separato da tabulazioni e contare le coppie di colonne 1/2 (tabella pivot/mi allontana da wikipedia ...) Si supponga che voglio fare tutto qui: http://en.wikipedia.org/wiki/Cross_tabulation#Statistics_related_to_cross_tabulations –

+1

Cosa intendi per coppie di conti in una colonna? – jonnii

0

Poiché questo è un esercizio di programmazione iniziale per Python, probabilmente vogliono vedere quali meccanismi incorporati di Python sarebbero appropriati per la versione iniziale del problema. La struttura del dizionario sembra un buon candidato. Il primo valore di colonna dal tuo file tab-sep può essere la chiave in un dizionario. La voce trovata da quella chiave può essere essa stessa un dizionario, la cui chiave è il valore della seconda colonna. Le voci del subdictionary sarebbero un conteggio, inizializzato a 1 quando si aggiunge un nuovo sottodictionary quando si incontra per la prima volta una coppia.

1

S W ha pubblicato a good basic recipe for this on activestate.com.

L'essenza sembra essere ...

  1. Definire xSORT = [] e ysort = [] come array di tuoi assi. Popolarli iterando attraverso i tuoi dati, o in qualche altro modo.
  2. Definire rs = {} come dict di dicts dei dati tabulati, scorrendo i dati e incrementando rs [yValue] [xValue]. Crea chiavi mancanti se/quando necessario.

Poi, per esempio, il totale per la riga y sarebbe sum([rs[y][x] for x in xsort])