¿Cómo puedo encontrar la columna mediana en una base de datos?


8

Tengo datos sobre el período de construcción de viviendas en áreas de difusión. He transferido estos datos a mis áreas de estudio y me gustaría determinar el período medio de construcción para cada área de estudio. El único problema es que la información de las columnas es el número de viviendas y no quiero la mediana de estas, sino el título de la columna para llenar la fila en un nuevo campo (o algo más que lo indique, preferiblemente el período en el texto formato, pero no es el fin del mundo si es solo un número que indica el período).

Adjunto una imagen de la tabla de atributos con los campos relevantes resaltados. Hay un campo MEDIANO pero los datos que estoy usando fueron creados por otra persona y están mal documentados, por lo que no estoy seguro de si el cálculo ya se realizó o no.

(Las siete columnas representan siete períodos de tiempo no superpuestos ordenados cronológicamente. El campo [Mediana] parece indexar el período en el que la construcción total estaba a medio completar; es decir, registra el tiempo medio ) .

Captura de pantalla de la mesa


1
¿Está solicitando el nombre (o índice) del campo en el que se produce el valor medio ? (Eso claramente no es el valor actual [Mediano]). ¿O quizás está preguntando por el nombre (o índice) del período de tiempo durante el cual se encontró la primera mitad de toda la construcción? Por ejemplo, en la fila 1, la construcción total al final de los períodos fue de 45, 180, 485, 1495, 1995, 2130, 2130. La mediana de 2130/2 = 1065 ocurrió durante el cuarto período (y, efectivamente, [Mediana ] = 4). Eso normalmente no se llamaría una "mediana", pero parece coherente con los datos actuales.
whuber

@whuber, estoy paranoico de que sea incorrecto, porque el hombre que compiló esto está en Vancouver y no puedo preguntarle directamente y no documentó nada en los metadatos.
Emily

Todavía no tengo idea de lo que significa "columna mediana". ¿Puede alguien reformular el título y la pregunta?
blah238

1
@blah La terminología es correcta, como se explicó al comienzo de mi respuesta y se aclaró en un comentario a la respuesta de Nathanus. Para responder a su solicitud, agregué un párrafo a la pregunta.
whuber

Respuestas:


8

Suponiendo que las columnas aparecen en orden de tiempo, la primera fila (por ejemplo) indica que la construcción total a través de cada período fue

0, 0+45 = 45, 45+135 = 180, 180+405 = 585, 585+1010 = 1595, ..., 2230+0 = 2230.

La construcción estaba a la mitad en 2230/2 = 1115. Esto ocurrió durante el período 4, porque al final del período 3 el total fue de 585, al final del período 4 el total fue de 1595 y 585 <= 1115 <1595.

Este parece ser el resultado informado por la columna [Mediana], que proporciona el índice del período (comenzando en 1 a la izquierda).

Puede codificar esto en su idioma favorito . Sin embargo, la tabla es tan pequeña (100 filas) que una hoja de cálculo será conveniente, aunque solo sea para verificar lo que hace más formalmente en Python o lo que sea. Así es como podría verse:

Hoja de cálculo

Las primeras tres filas de datos tienen los mismos valores que los suyos. Las siguientes dos filas de datos (rodeadas de líneas en blanco) se eligen más abajo en su tabla. Las últimas cinco filas de datos ejercitan un poco el algoritmo.

(Tenga en cuenta que, como se muestra en las últimas dos líneas de la hoja de cálculo, cómo Excel elige el período posterior cada vez que el medio cae exactamente entre dos períodos. Esta no es necesariamente la respuesta "correcta", pero es válida).

Aquí están las fórmulas en las columnas H: R:

Fórmulas

No tienes que escribirlos todos. El único tipo de escritura necesario es:

  • =H2+A2en I2. Arrastre esto a través de O2. Esto calcula las sumas acumulativas. Requiere que las columnas A: G estén en orden cronológico.

  • =O2/2en P2. Esto encuentra la mitad del total.

  • =Match(P2,H2:O2,1)en Q2. Esto indexa la columna donde la construcción estaba a medio completar.

  • =Offset($A$1:$G$1,0 0, Q2-1, 1, 1)en R2. Esto obtiene el encabezado de columna correspondiente al índice.

Luego pegue 0toda la columna H y arrastre I2: R2 a tantas filas como sea necesario.

Esto sirve efectivamente como pseudocódigo para el algoritmo. La parte más complicada será la búsqueda para implementar la MATCHfunción de Excel . Pero eso no requiere ninguna habilidad: no es ineficaz buscar cada conjunto de sumas acumulativas secuencialmente (en lugar de con el algoritmo de búsqueda binario preferido) porque estos conjuntos son muy cortos.


Muchas gracias whuber! Esto es lo que estaba buscando. :)
Emily

1

Si desea devolver la columna mediana, probablemente usaría un cursor de python para recorrer las filas. Use los campos para completar una lista y luego devuelva el elemento central (se indexará en [3] para 7 elementos) después de llamar a la función sorted () en la lista que ha creado. Te volveré a escribir un poco de código cuando regrese del almuerzo.


¡Espere la codificación hasta que esté seguro de que esto es lo que se necesita!
whuber

Creo que si es el año o la cantidad es solo la diferencia entre un diccionario y una lista.
Nathanus

He estado revisando manualmente el comentario de la @ whuber sobre mi pregunta y tal vez la columna sea correcta, aunque sería bueno saber cómo hacer esto para futuras regiones de estudio (que no tienen estas columnas)
Emily

Creo que es un cálculo completamente diferente, @Nathanus. Uno ve los datos como un conjunto desordenado de conteos {x1, x2, ..., x7} mientras que el otro los ve como diferencias en una secuencia (0, x1, x1 + x2, x1 + x2 + x3, ..., x7) que representa una distribución acumulativa en el tiempo. La mediana de los recuentos será un valor excedido por tres de ellos y mayor o igual que los otros tres. La mediana de la distribución acumulativa es un tiempo, no un recuento, y se encuentra utilizando los métodos descritos en mi respuesta.
whuber

1
Tienes razón: la distinción no está clara en la pregunta. Solo salió en los comentarios. He insertado un breve párrafo explicativo en la pregunta.
whuber
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.