2010-01-26 30 views
11

Tengo alrededor de 100 archivos csv cada 100,000 x 40 filas columnas. Me gustaría hacer un análisis estadístico sobre él, extraer algunos datos de muestra, trazar tendencias generales, hacer varianza y análisis de cuadrado R, y trazar algunos diagramas de espectros. Por ahora, estoy considerando numpy para el análisis.Python: Análisis en archivos CSV 100,000 líneas x 40 columnas

Me preguntaba qué problemas debería esperar con archivos tan grandes? Ya revisé datos erróneos. ¿Cuáles son sus recomendaciones sobre el análisis estadístico? ¿Sería mejor si simplemente dividiera los archivos y lo hiciera todo en Excel?

+5

Esos no son archivos terriblemente grandes. ¿Porque lo preguntas? ¿Has intentado hacer lecturas simples para ver qué tan rápido será Python? –

+4

A menos que esté casado con Python, puede ser mejor usar un lenguaje de estadísticas dedicado como R - ver http://www.r-project.org. –

+2

Normalmente, las líneas y las filas son sinónimos cuando se habla de tablas. Supongo que te refieres a 40 columnas? –

Respuesta

12

Descubrí que Python + CSV es probablemente la forma más rápida y sencilla de hacer algunos tipos de procesamiento estadístico.

Hacemos una gran cantidad de reformateo y corrección de errores de datos impares, por lo que Python nos ayuda.

La disponibilidad de las funciones de programación funcional de Python lo hace particularmente simple. Puedes hacer muestreos con herramientas como esta.

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)) 

Me gusta mucho poder componer funciones más complejas a partir de funciones más simples.

+0

Cuando los datos necesitan ser masajeados y filtrados, como dice @ S.Lott, es genial poder hacerlo en Python. Si puede alimentar los datos directamente a una función R, los increíbles paquetes ayudarán. Pero si tienes que jugar con eso primero, Python es una bomba. – telliott99

+0

También puede usar loadtxt y convertir automáticamente a numpy float arrays. – Navi

1

Python es muy agradable para este tipo de proceso de datos, especialmente si las muestras son "filas" y se puede procesar cada una de dichas filas de forma independiente:

row1 
row2 
row3 
etc. 

De hecho, su programa puede tener muy poca memoria, gracias a los generadores y las expresiones del generador, sobre los que puede leer aquí: http://www.dabeaz.com/generators/ (no es algo básico, pero algunas aplicaciones de generadores que tuercen la mente).

En cuanto a la respuesta de S.Lott, probablemente desee evitar que filter() se aplique a la secuencia de filas: podría explotar su computadora si pasa a una secuencia lo suficientemente larga (intente: filter(None, itertools.count())) después de guardar todos sus datos :-)). Es mucho mejor para sustituir filter con algo como esto:

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

o más corto:

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

Esto se puede optimizar aún más mediante la extracción de condiciones antes del bucle, pero esto es un excersise para el lector: -)

+1

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

+0

¡Boom, y me estoy hundiendo! Supongamos que he explicado cómo funciona ifilter ;-) –

+0

Gracias. Solucionado mi respuesta. –

1

He estado teniendo un gran éxito usando la lectura y generación de archivos Python y CSV. Utilizando una modesta computadora portátil Core 2 Duo, pude almacenar cerca de la misma cantidad de datos que usted y procesarla en la memoria en pocos minutos. Mi principal consejo al hacer esto es dividir sus trabajos para que pueda hacer las cosas en pasos separados ya que procesar todos sus trabajos a la vez puede ser complicado cuando solo desea ejecutar una característica. Crea un buen ritmo de batalla que te permita aprovechar al máximo tus recursos.

Excel es bueno para lotes de datos más pequeños, pero echa un vistazo a matplotlib para hacer gráficos y tablas normalmente reservados para Excel.

1

En general, no se preocupe demasiado por el tamaño. Si sus archivos crecen en un factor de 2-3, usted podría comenzar a quedarse sin memoria en un sistema de 32 bits. Me imagino que si cada campo de la tabla es de 100 bytes, es decircada fila tiene 4000 bytes, usarás aproximadamente 400 MB de RAM para almacenar los datos en la memoria y si agregas tanto como para procesarlos, solo estarás usando 800 o más MB. Estos cálculos están muy atrás del sobre y son extremadamente generosos (solo usará esta cantidad de memoria si tiene muchas cadenas largas o enteros enormes en sus datos, ya que el máximo que usará para los tipos de datos estándar es de 8 bytes para un flotar o un largo).

Si do comienzan a quedarse sin memoria, 64 bits podría ser el camino a seguir. Pero aparte de eso, Python manejará grandes cantidades de datos con aplomo, especialmente cuando se combina con numpy/scipy. El uso de matrices Numpy casi siempre será más rápido que el uso de listas nativas también. Matplotlib se encargará de la mayoría de las necesidades de trazado y ciertamente puede manejar los trazados simples que ha descrito.

Finalmente, si encuentra algo que Python no puede hacer, pero ya tiene una base de código escrita en él, eche un vistazo a RPy.

1

Para conjuntos de datos masivos puede que le interese ROOT. Se puede usar para analizar y almacenar petabytes de datos de manera muy efectiva. También viene con algunas herramientas estadísticas básicas y moreadvanced.

Si bien está escrito para ser utilizado con C++, también hay enlaces de python bastante completos. No hacen que sea extremadamente fácil obtener acceso directo a los datos en bruto (por ejemplo, para usarlos en R o numpy), pero definitivamente es posible (lo hago todo el tiempo).

Cuestiones relacionadas