Domanda

Sto implementando una libreria di tabulazione incrociata in Python come esercizio di programmazione per il mio nuovo lavoro e ho un'implementazione dei requisiti che funziona ma è inelegante e ridondante. Vorrei un modello migliore per questo, qualcosa che consenta uno spostamento piacevole e pulito dei dati tra il modello base, archiviato come dati tabulari in file flat e tutti i risultati dell'analisi statistica che potrebbero essere richiesti.

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

Quindi, qualche idea?

Modifica: ecco un esempio di alcuni dati e da cosa voglio poter costruire esso. Tieni presente che ". & Quot; indica un po 'di dati "mancanti", che sono solo condizionatamente contati.

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

Se guardassi la correlazione tra le colonne 0 e 2 sopra, questa è la tabella che avrei:

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

Inoltre, vorrei essere in grado di calcolare il rapporto di frequenza / totale, frequenza / subtotale, e amp; c.

È stato utile?

Soluzione

È possibile utilizzare un database sqlite in memoria come struttura di 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
# ...

Altri suggerimenti

SW ha pubblicato una buona ricetta di base per questo su activestate .com .

L'essenza sembra essere ...

  1. Definisci xsort = [] e ysort = [] come matrici dei tuoi assi. Popolarli ripetendo i tuoi dati o in altro modo.
  2. Definisci rs = {} come dettatura dei dati tabulati, ripetendo i tuoi dati e incrementando rs [yvalue] [xvalue]. Crea chiavi mancanti se / quando necessario.

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

Poiché questo è un esercizio di programmazione iniziale per Python, probabilmente vogliono che tu veda quali meccanismi integrati 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 sottoregistrato sarebbero un conteggio, inizializzato su 1 quando si aggiunge un nuovo sottoregistratore quando si incontra una coppia per la prima volta.

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

Modifica:

Ho appena riletto la domanda e stai chiedendo un modello di dati, non un modello di archiviazione. Per rispondere a questa domanda ...

Tutto dipende da come farai rapporto sui dati. Ad esempio, se eseguirai molti pivot o aggregazioni, potrebbe avere più senso memorizzarlo nell'ordine principale della colonna, in questo modo puoi semplicemente sommare una colonna per ottenere conteggi, ad esempio.

Aiuterà molto se spieghi che tipo di informazioni stai cercando di estrarre.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top