2009-06-19 6 views
6

Estoy implementando una biblioteca de tabulación cruzada en Python como ejercicio de programación para mi nuevo trabajo, y tengo una implementación de los requisitos que funciona pero es poco elegante y redundante. Me gustaría un modelo mejor para él, algo que permita un movimiento agradable y limpio de datos entre el modelo base, almacenado como datos tabulares en archivos planos, y todos los resultados del análisis estadístico que puedan pedirse.¿Qué es un buen modelo de datos para la tabulación cruzada?

En este momento, tengo una progresión de un conjunto de tuplas para cada fila en la tabla, a un histograma que cuenta las frecuencias de las apariciones de las tuplas de interés, a un serializador que - algo torpemente - compila el salida en un conjunto de celdas de tabla para su visualización. Sin embargo, termino teniendo que regresar a la mesa o al histograma más a menudo de lo que quiero porque nunca hay suficiente información en el lugar.

¿Alguna idea?

Editar: Aquí hay un ejemplo de algunos datos, y lo que quiero ser capaz de construir desde . Tenga en cuenta que "." denota un poco de datos "faltantes", que es solo condicionalmente contados.

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

Si estuviera mirando la correlación entre las columnas 0 y 2 anteriores, esta es la tabla que tendría:

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

Además, me gustaría ser capaz de calcular el coeficiente de de frecuencia/total, frecuencia/subtotal, & c.

+0

No es muy claro para mí lo que estás tratando de hacer. ¿Puede describir los requisitos o dar un ejemplo con algunos datos y mostrar las transformaciones que desea hacer? –

+0

En este ejemplo, será mejor que lo escriba en orden de columna principal. – jonnii

+0

jonnii, no soy un gran estadista; ¿Puedes aclarar a qué te refieres con eso? –

Respuesta

1

Puede usar una base de datos sqlite en memoria como una estructura de datos, y definir las operaciones deseadas como consultas 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

¿Por qué no almacenarlo usando tablas HTML? Puede que no sea el mejor, pero podría, muy fácilmente, verlo en un navegador.

Editar:

acabo de releer la pregunta y que está pidiendo modelo de datos, no un modelo de almacenamiento. Para responder a esa pregunta ...

Todo depende de cómo va a informar sobre los datos. Por ejemplo, si va a hacer un montón de pivotes o agregación, puede tener más sentido almacenarlos en orden principal de columnas, de esta manera puede sumar una columna para obtener recuentos, por ejemplo.

Te ayudará mucho si explicas qué tipo de información estás tratando de extraer.

+0

No estoy seguro de qué tipo de datos, en realidad; los ejercicios se están distribuyendo un paso a la vez (paso 1: leer archivos separados por tabulaciones y contar pares en las columnas 1/2 (tabla dinámica?/me deambula a wikipedia ...) Supongamos que quiero hacer todo aquí: http://en.wikipedia.org/wiki/Cross_tabulation#Statistics_related_to_cross_tabulations –

+1

¿Qué quiere decir con contar pares en una columna? – jonnii

0

Dado que este es un ejercicio de programación inicial para Python, probablemente quieran que vea qué mecanismos incorporados de Python serían apropiados para la versión inicial del problema. La estructura del diccionario parece un buen candidato. El primer valor de columna de su archivo tab-sep puede ser la clave en un diccionario. La entrada encontrada por esa clave puede ser un diccionario, cuya clave es el valor de la segunda columna. Las entradas del subdiccionario serían un recuento, inicializado a 1 cuando se agrega un nuevo subdiccionario cuando se encuentra un par por primera vez.

1

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

La esencia parece ser ...

  1. Define xsort = [] y ysort = [] como matrices de tus ejes. Rellenarlos iterando a través de sus datos, o de alguna otra manera.
  2. Defina rs = {} como un dict de los dictados de sus datos tabulados, iterando a través de sus datos e incrementando rs [yvalue] [xvalue]. Crea claves faltantes si/cuando sea necesario.

Entonces, por ejemplo, el total de la fila y habría sum([rs[y][x] for x in xsort])

Cuestiones relacionadas