2010-01-26 13 views
11

Ho circa 100 file CSV ogni 100.000 x 40 righe colonne. Mi piacerebbe fare qualche analisi statistica su di esso, estrarre alcuni dati di esempio, tracciare le tendenze generali, fare la varianza e l'analisi del quadrato R e tracciare alcuni diagrammi di spettri. Per ora, sto pensando a numpy per l'analisi.Python: analisi su file CSV 100.000 righe x 40 colonne

Mi chiedevo quali problemi dovrei aspettarmi con file così grandi? Ho già controllato dati errati. Quali sono i tuoi consigli su come fare analisi statistiche? sarebbe meglio se dividessi semplicemente i file e facessi il tutto in Excel?

+5

Questi file non sono molto grandi. Perché stai chiedendo? Hai davvero provato a fare semplici letture per vedere quanto velocemente Python sarà? –

+4

A meno che tu non sia sposato con Python, potresti star meglio usando un linguaggio di statistiche dedicato come R - vedi http://www.r-project.org. –

+2

Di solito le righe e le righe sono sinonimi quando si parla di tabelle. Immagino tu intenda 40 colonne? –

risposta

12

Ho trovato che Python + CSV è probabilmente il modo più veloce e più semplice per eseguire alcuni tipi di elaborazione statistica.

Facciamo una discreta quantità di riformattazione e correzione di errori di dati dispari, quindi Python ci aiuta.

La disponibilità delle funzionalità di programmazione funzionale di Python lo rende particolarmente semplice. Puoi fare campionamenti con strumenti come questo.

def someStatFunction(source): 
    for row in source: 
     ...some processing... 

def someFilterFunction(source): 
    for row in source: 
     if someFunction(row): 
      yield row 

# All rows 
with open("someFile", "rb") as source: 
    rdr = csv.reader(source) 
    someStatFunction(rdr) 

# Filtered by someFilterFunction applied to each row 
with open("someFile", "rb") as source: 
    rdr = csv.reader(source) 
    someStatFunction(someFilterFunction(rdr)) 

Mi piace molto essere in grado di comporre funzioni più complesse da funzioni più semplici.

+0

Quando i dati devono essere massaggiati e filtrati, come dice @ S.Lott, è bello poterlo fare in Python. Se puoi inviare i dati direttamente a una funzione R, i pacchetti incredibili ti aiuteranno. Ma se devi giocarci prima, Python è da bomba. – telliott99

+0

È inoltre possibile utilizzare loadtxt e convertire automaticamente in array float numpy. – Navi

1

Python è molto bello per questo tipo di trattamento dei dati, soprattutto se i campioni sono "file" e si può elaborare ogni tale fila in modo indipendente:

row1 
row2 
row3 
etc. 

In realtà il programma può avere molto piccolo ingombro di memoria, grazie a generatori e espressioni generatrici, di cui puoi leggere qui: http://www.dabeaz.com/generators/ (non sono roba di base ma alcune applicazioni di generatori di torsione).

Per quanto riguarda la risposta di S.Lott, probabilmente si desidera evitare che il filtro() venga applicato alla sequenza di righe: potrebbe esplodere il computer se si passa a una sequenza sufficientemente lunga (provare: filter(None, itertools.count()) - dopo aver salvato tutti i dati :-)). E 'molto meglio per sostituire filter con qualcosa di simile:

def filter_generator(func, sequence): 
     for item in sequence: 
      if (func is None and item) or func(item): 
       yield item 

o più corto:

filtered_sequence = (item for item in sequence if (func is None and item) or func(item)) 

Questo può essere ulteriormente ottimizzata estraendo condizioni prima del ciclo, ma questo è un excersise per il lettore: -)

+1

... o semplicemente usa itertools.ifilter :) –

+0

Boom, e sto affondando! Facciamo finta di aver spiegato come funziona ifilter ;-) –

+0

Grazie. Risolto il problema con la mia risposta –

1

Ho avuto un grande successo utilizzando la lettura e la generazione di file Python e CSV. Usando un modesto laptop Core 2 Duo, sono riuscito a memorizzare vicino alla stessa quantità di dati e ad elaborarlo in memoria in pochi minuti. Il mio consiglio principale è quello di suddividere i tuoi lavori in modo che tu possa fare le cose in passaggi separati, poiché raggruppare tutti i tuoi lavori in una sola volta può essere un problema quando vuoi eseguire solo una funzione. Prepara un buon ritmo di battaglia che ti permetta di sfruttare al massimo le tue risorse.

Excel è utile per i batch di dati più piccoli, ma controlla matplotlib per fare grafici e grafici normalmente riservati per Excel.

1

In generale, non preoccuparti troppo delle dimensioni. Se i file diventano più grandi di un fattore 2-3, è possibile che inizi a esaurire la memoria su un sistema a 32 bit. Immagino che se ogni campo della tabella è 100 byte, vale a direogni riga è di 4000 byte, utilizzerai circa 400 MB di RAM per archiviare i dati in memoria e se ne aggiungi circa per l'elaborazione, utilizzerai comunque solo 800 MB. Questi calcoli sono molto indietro nell'inviluppo ed estremamente generosi (userete questa quantità di memoria solo se avete molti stringhe lunghe o numeri giganteschi nei vostri dati, poiché il massimo che userete per i tipi di dati standard è di 8 byte per un galleggiante o lungo).

Se si do si avvia la memoria insufficiente, 64 bit potrebbe essere la strada da percorrere. Ma a parte questo, Python gestirà grandi quantità di dati con aplomb, specialmente se combinato con numpy/scipy. L'utilizzo degli array di Numpy sarà quasi sempre più rapido rispetto all'utilizzo di liste native. Matplotlib si prenderà cura della maggior parte dei bisogni di trama e può certamente gestire le semplici trame che hai descritto.

Infine, se trovate qualcosa che Python non può fare, ma ha già scritto un codice in esso, date un'occhiata a RPy.

1

Per enormi set di dati che potrebbero essere interessati a ROOT. Può essere utilizzato per analizzare e memorizzare in modo molto efficace petabyte di dati. Inoltre è dotato di alcuni strumenti statistici di base e moreadvanced.

Mentre è scritto per essere utilizzato con C++, esistono anche collegamenti Python piuttosto completi. Non rendono estremamente facile ottenere l'accesso diretto ai dati grezzi (ad es. Usarli in R o numpy) - ma è sicuramente possibile (lo faccio sempre).

Problemi correlati