- Great Tables es un paquete para crear tablas que busca mantener el flujo de análisis de datos dentro de código Python, al mismo tiempo que recupera la sofisticada capacidad expresiva de las tablas impresas de mediados del siglo XX
- Una tabla no es solo una cuadrícula simple de filas y columnas, sino un formato de representación de información que facilita encontrar y comparar valores mediante el orden de las columnas, las etiquetas y las líneas divisorias
- Desde las tablillas de arcilla de la antigua Sumeria hasta el Manual of Tabular Presentation, las tablas evolucionaron junto con la densidad y el formato de la información, pero las primeras hojas de cálculo tenían poca expresividad en comparación con su facilidad para calcular
- Great Tables divide una tabla en 6 componentes y separa estructura, formato y estilo con APIs de las familias
tab_*,fmt_*yopt_*() - Este paquete se enfoca en mejorar la calidad de publicación y presentación de tablas resumen estáticas para artículos, libros e informes, más que en la exploración interactiva de grandes volúmenes de datos
El dilema de creación de tablas que Great Tables quiere resolver
- Las tablas son importantes en la etapa final de presentación de información, igual que los plots, y diseñar una tabla efectiva requiere más precisión y matices de lo que suele parecer
- Hoy en día, quienes trabajan con datos normalmente deben hacer una concesión entre dos opciones
- Copiar los datos a una herramienta como Excel y volver a crear la tabla
- Mostrar tal cual una tabla poco refinada
- Great Tables es un paquete que intenta resolver este dilema con una interfaz basada en código Python
- El objetivo es crear tablas expresivas mientras se procesa dentro de Python desde la recolección de datos hasta el análisis y la generación de tablas resumen
Definición básica de una tabla y elementos de legibilidad
- Una tabla puede resumirse en dos reglas básicas
- Los datos se expresan en columnas y filas
- Los datos se expresan principalmente como texto
- La tabla de ejemplo organiza a las personas en filas y características como nombre, dirección, ciudad, código postal, fecha de nacimiento, estatura y peso en columnas
- Esta disposición facilita encontrar valores individuales o compararlos recorriendo filas y columnas
- Las líneas horizontales entre filas no son un requisito indispensable, pero ayudan visualmente a distinguir cada fila
- El orden de las columnas también afecta directamente la legibilidad
- Si la columna
Nameestuviera al extremo derecho, el sujeto de cada registro no sería visible de inmediato y eso podría confundir más al lector - Las etiquetas de columna indican qué tipo de datos contiene cada columna y, en la mayoría de los casos, reducen la necesidad de adivinar
- Si la columna
Historia antigua de las tablas
- Las tablas surgieron a partir de la cuadrícula cuadrada, un contenedor capaz de alojar información
- En las paredes de las cuevas de Lascaux y Niaux, en Francia, quedan representaciones de cuadrículas de hace unos 25 mil años
- En el siglo II a. C., Hipparchus representó posiciones celestes y terrestres con latitud y longitud, y hacia el año 150 d. C., la Geographia de Ptolemy incluyó métodos de cartografía basados en cuadrículas
- La centuriation romana era un sistema de medición de tierras que formaba cuadrículas cuadradas mediante caminos, canales y tierras agrícolas
- Después de que la agricultura se expandiera ampliamente hace unos 10 mil años, creció la necesidad de registrar y gestionar transacciones económicas relacionadas con agricultura, ganado y división del trabajo
La estructura tabular en Sumeria y Mesopotamia
- Las ciudades mesopotámicas del IV milenio a. C. comerciaban con reinos lejanos y necesitaban conservar registros, y en Uruk se encontraron tablillas de arcilla con tablas tempranas pero sofisticadas
- Las tablillas de Uruk de alrededor de 3200–3000 a. C. registran cantidades de entrega de cebada y malta para la producción de cerveza
- Se leen de derecha a izquierda
- Cada celda contiene pictogramas que representan palabras o conceptos y números que representan cantidades
- Aproximadamente dos filas corresponden a una persona
- Las dos columnas de la derecha contienen cantidades de malta y cebada
- La tercera columna muestra subtotales por persona, y la columna del extremo izquierdo indica el total
- En la fila inferior aparece el nombre del funcionario responsable, funcionando como un pie de tabla
- Una tablilla de arcilla del templo de Enlil en Nippur, de unos mil años después, contiene fuentes de ingresos y gastos mensuales de 50 trabajadores del templo
- Se observa una cuadrícula más regular
- Hay encabezados de columna con nombres de meses y encabezados de fila con nombres y oficios de personas
- Incluye celdas vacías sin información, valores numéricos, subtotales semestrales, totales y notas explicativas
- Después, el soporte de las tablas pasó de la arcilla a tablillas de cera, papiro y papel, y junto con ello cambiaron las técnicas de escritura y el diseño tabular
El punto más alto del diseño tabular a mediados del siglo XX
- Se considera que mediados del siglo XX fue una época especialmente fuerte para el diseño de tablas
- Tecnologías de producción documental como la impresión offset, la máquina de escribir y varitype habían avanzado lo suficiente como para componer con precisión los elementos de una tabla
- Aunque existían limitaciones de espacio en la página, también había distintas soluciones para ajustar la tabla a una sola página o dividirla en varias
- La combinación de técnicas avanzadas de impresión y conocimiento de diseño tabular permitió crear tablas hermosas
- El Manual of Tabular Presentation de la Oficina del Censo de EE. UU. es una obra que trata en detalle el diseño ideal de tablas con alta densidad de información
- Nombra y describe rigurosamente las distintas partes de una tabla
- Recomienda con firmeza qué hacer y qué no hacer en distintas situaciones de elaboración de tablas
- Muestra que una tabla puede verse bien y al mismo tiempo contener mucha información
- Great Tables toma muchos principios de diseño tabular de este documento y parte de la idea de que esos principios siguen siendo válidos hoy
Retroceso y límites después de las hojas de cálculo
- A medida que la tecnología informática se volvió más accesible en las décadas de 1970 y 1980, las personas pudieron crear tablas tanto en formato electrónico como impreso
- Puede considerarse que la popularización de las tablas calculables comenzó en 1979 con VisiCalc
- VisiCalc permitía calcular valores rápidamente, pero tenía una expresividad limitada para crear tablas de presentación
- No se podían aplicar estilos de borde para presentación a las celdas de la cuadrícula
- No se podían dar formato a los valores
- Tampoco se podían imprimir las tablas
- En los siguientes 10 a 15 años, las tablas de hojas de cálculo mejoraron visualmente
- A comienzos de los años 90, Excel ya podía aplicar bordes a las tablas
- Mejoró el soporte tipográfico
- También se ampliaron las funciones de formato de valores
- Aun así, se considera que las tablas de Excel de los últimos 30 años difícilmente han alcanzado el nivel del Manual of Tabular Presentation
- A medida que el análisis de datos también empezó a hacerse fuera de Excel, surgieron tres escenarios ineficientes
- Hacer tanto el análisis como la generación de tablas dentro de Python, pero con baja calidad tabular
- Hacer tanto el análisis como la creación de tablas dentro de Excel, pero con poca flexibilidad analítica
- Analizar en Python y copiar a Excel para crear tablas, pero sin reproducibilidad
El modelo de tablas de Great Tables
- Great Tables es un paquete de Python que busca combinar la elegancia de las tablas de mediados del siglo XX con el poder de una interfaz de código
- Representa una tabla como la combinación de 6 componentes independientes
- Table Header: espacio para título y subtítulo que explica brevemente el contenido de la tabla
- Column Labels: define el contenido de cada columna, y un spanner es un título colocado sobre un grupo de varias columnas
- Stub Head: posición superior izquierda donde pueden colocarse distintos tipos de etiquetas
- Row Stub: área para información de filas y etiquetas de grupos de filas
- Table Body: área donde están los datos e incluye las celdas
- Table Footer: espacio para información adicional relacionada con el contenido de la tabla
- Great Tables se usa creando primero el cuerpo de la tabla en código y luego agregando de forma iterativa estilo, formato y otros componentes
- El código de ejemplo comienza con
GT(simple_table, rowname_col="Name")y luego añade título, stub head, column spanner, source note, formato de fecha e enteros, y opciones de estilo - En la tabla de ejemplo, el row stub azul separa las etiquetas de fila del cuerpo de la tabla
- Como cada persona es una observación única, se enfatiza el sujeto de cada fila
- El título explica el contenido de la tabla
- Los spanners
LocationyPersonal Characteristicsagrupan columnas de forma significativa - El uso consistente de líneas azules y fondos de celda crea una apariencia profesional
- Los métodos para agregar componentes de tabla comienzan con
tab_- Ejemplo:
tab_header()crea el Table Header
- Ejemplo:
Formato y nanoplots
- Estructurar una tabla no basta; cada campo tiene necesidades distintas para mostrar valores
- Incluso un solo número puede presentarse de varias maneras según las normas y expectativas de una comunidad
- Si se incluyen fechas, horas y moneda, el alcance del formato se vuelve todavía más amplio
- El valor crudo
134,000puede mostrarse de distintas formas según el requisitofmt_scientific(): notación científica1.34 × 10^5fmt_number(): número con locale alemán134.000,00fmt_integer(): entero compacto134K
- Cuando los valores deben transmitirse como imágenes o plots, el problema del formato se amplía aún más
- Si un analista médico necesita comunicar la tendencia de mejora o deterioro en resultados de pruebas de pacientes, leer una secuencia completa de números por fila puede retrasar la interpretación
fmt_nanoplot()ofrece pequeñas visualizaciones de tendencia dentro de la tabla mediante nanoplots- Al pasar el mouse sobre un punto de datos, se puede ver el valor de cada fecha
- Los nanoplots buscan un equilibrio entre la rapidez de interpretación visual de un plot y la compacidad de una tabla
- Los métodos de formato de Great Tables comienzan con
fmt_- Ejemplos:
fmt_date(),fmt_integer(),fmt_nanoplot()
- Ejemplos:
- El paquete busca ofrecer muchos métodos de formato y opciones útiles para adaptarse a las necesidades de distintos usuarios
Enfoque en tablas resumen estáticas para publicación y presentación
- Great Tables se enfoca en la visualización para publicación y presentación entre las muchas formas de interactuar con tablas
- En análisis de bases de datos, puede ser adecuada una visualización simple de tablas para explorar y filtrar cientos, miles o más registros
- Publicar resultados es otra tarea, y aquí lo central es la estructuración, el formato y el estilo
- Una visualización tabular hermosa debe cumplir con lo siguiente
- Hacer que la información sea más fácil de asimilar
- Proporcionar contexto adicional donde haga falta
- Seguir el estilo del documento o de la organización
- El caso de uso objetivo es la presentación de datos del tipo que suele verse en artículos de revistas, libros e informes
- Great Tables considera que las tablas resumen estáticas merecen un enfoque propio, y busca facilitar la entrega de mejores tablas a los lectores con métodos
opt_*() - El criterio de éxito del paquete es la calidad de las tablas que puede producir, y planea seguir mejorando la API
- Mantienen abierto un Discord Server para recibir feedback de la comunidad
1 comentarios
Opiniones de Hacker News
Ojalá más proyectos explicaran así su filosofía y sus objetivos
Creé otra biblioteca de tablas para Jupyter llamada Buckaroo, pero el enfoque es distinto
Buckaroo busca permitir trabajar de forma interactiva, probando rápidamente varios formatos y funciones de posprocesamiento para obtener insights importantes de una tabla
Al hacer análisis exploratorio de datos básico uno termina escribiendo los mismos comandos una y otra vez, así que pensé que esos comandos e insights debían estar dentro de la tabla
Great Tables parece estar más orientado a dar formato manual a tablas para presentaciones
https://github.com/paddymul/buckaroo
https://youtu.be/GPl6_9n31NE
print()en Jupyter ydisplay()en IPython tienen la limitación de ser salidas estáticas muertas, y se sienten como el antiguo debugging conprintf; entiendo que Buckaroo fue creado para resolver esoMe da curiosidad qué opinas de los atajos y la forma de interacción de Visidata
Usé Visidata antes, y siempre me pregunté por qué algo así no podía terminar integrado en Jupyter para explorar dataframes
Coincido en que Great Tables parece otro intento de formalizar una gramática de tablas, y considerando el poder de las tablas y la difusión del concepto de dataframe a través de los ecosistemas de R/pandas/Arrow/polars, este enfoque es bienvenido
Dicho eso, tengo entendido que este término se usó originalmente en S, el lenguaje estadístico de los años 90
[1] https://towardsdatascience.com/preventing-the-death-of-the-d...
Creo que usando un poco de espacio inferior y una fuente en negrita se podría dar jerarquía visual sin agregar ruido
El fondo de las etiquetas de fila es demasiado oscuro y, por el peso de la fuente, dificulta la lectura; un azul muy claro sería mejor
Tampoco me gusta que la etiqueta de grupo de filas “Name” esté en cursiva
Las etiquetas de columnas superiores flotando al centro hacen que la tabla sea más difícil de escanear; creo que alinearlas a la izquierda sería mucho mejor
Por último, tampoco me gusta nada la fuente, aunque eso podría ser culpa del navegador
Hice un mockup con algunos cambios, y creo que esta versión es una tabla mucho más fácil de leer
https://i.imgur.com/iMMf5vo.png
Trata justo lo que mencionas: la legibilidad y los elementos que interfieren con el mensaje o el punto central de los datos
Si alguna vez viste un sparkline, Tufte también fue quien acuñó ese término
Cada vez que hacemos una revisión de UI hojeamos este libro para ver si se nos está escapando algo, y es interesante abrirlo en cualquier página y leer
Además, incluye un ensayo largo sobre por qué PowerPoint es pésimo
[1] https://www.edwardtufte.com/tufte/books_be
[2] https://en.wikipedia.org/wiki/Sparkline
Si lo alineas a la izquierda sobre alguna columna, hace que el título parezca el nivel superior de la jerarquía de información de esa columna, algo que por lo general no es cierto ni intencional
En la corrección modernista de arriba, el título dice “names, addresses, characteristics”, pero por la alineación parece excluir los nombres, y eso me resultó incómodo de inmediato
En cambio, el manual del censo centra casi todas las etiquetas dentro de su recuadro correspondiente, y cuando no lo hace suele ser por la sangría
Además, define el ancho de las columnas según los datos y no según las etiquetas, y no duda en ajustar la sangría y la separación con guiones
El resultado es denso horizontalmente, pero aun así intuitivo de entender
Pensándolo mejor, el título en sí tampoco me convence
Los títulos y pies de tabla deben transmitir contexto, alcance y propósito; si no lo hacen, se les puede omitir por completo por el pecado editorial de no justificar su existencia
El título actual podría cambiarse por “Table 1” sin perder información ni generalidad
Para un texto que intenta discutir y reconstruir la representación tabular desde primeros principios, es algo decepcionante
Como los títulos de tabla forman una capa importante del catálogo de información, no sorprende que el manual del censo dedique un capítulo entero a la construcción de títulos
Aunque es algo específico del dominio y tiene un estilo anticuado, vale mucho la pena revisarlo
El resaltado azul ahora también se solapa con el título, así que lo quitaría por completo; y las divisiones “personal characteristics” y “location” tampoco ayudan de forma significativa a la organización, así que sería mejor eliminarlas
En la historia más reciente está la creación de tablas CALS: https://en.wikipedia.org/wiki/CALS_Table_Model
Datalogics https://en.wikipedia.org/wiki/Datalogics estuvo muy involucrada en la concepción de las tablas CALS
Los empleados de Datalogics participaron en el comité ISO que creó SGML, y capacitaron en SGML a muchas personas, incluido personal del Departamento de Defensa de EE. UU. y contratistas involucrados en la documentación.
Participé en un equipo que creó un editor de documentos basado en SGML, y una de sus funciones era aplicar formato a los elementos según su contexto SGML.
Esto fue antes de que existieran XSLT y su familia.
Exintegrantes de Datalogics ayudaron a Microsoft a entender XML. Cosas como: “No, no pueden cambiar arbitrariamente las mayúsculas y minúsculas de las etiquetas de elementos XML”.
Los usuarios de TeX también tienen ideas bastante sofisticadas sobre el formato de tablas.
Como dato curioso, en esa época aprendí que, si se imprimía toda la documentación de cierto avión de combate, pesaba más que el propio avión y llenaba un conjunto de archiveros del tamaño de una cancha de fútbol.
Y aunque hoy a mucha gente no le gusta XML, desde la perspectiva de quienes venimos del mundo SGML, XML fue una gran bendición.
Recuerdo que incluso la primera versión tenía soporte de formato, aunque limitado.
Según http://www.bricklin.com/history/refcard3.htm, con el comando
/Fse podía especificar la alineación y configurar el formato numérico, por ejemplo en dólares y centavos.Ese documento corresponde a la versión 1.35, pero me parece que la primera versión publicada al menos soportaba mostrar dólares y centavos.
Por ejemplo, si los costos son $1500, $130, $110 y $210, el texto de las últimas tres filas se ve como si tuviera 4/5 del tamaño del texto de la primera fila.
Pero incluso sumando los tres, apenas llegan a un tercio del monto superior.
La gente percibe visualmente la cantidad de dígitos, y eso se parece aproximadamente a log10.
Como este problema aparece tan seguido, empecé a incluir gráficos de barras dentro de las celdas en todas las hojas de cálculo financieras.
Si no, las reuniones se van por las ramas discutiendo partidas completamente insignificantes comparadas con el mayor gasto en términos absolutos.
De hecho, una vez gastamos varias reuniones discutiendo un costo mensual de $15 por la recolección de logs de servidores en la nube, en una VM que ejecutaba un motor de base de datos cuyo costo de licencia mensual era de $15K.
Lo mantengo junto con Rich Iannone.
Rich es el único desarrollador de software que conozco que, cuando le pides que explique la filosofía del paquete, te cuenta 5,000 años de historia de la presentación de tablas.
Me sorprende que hayamos dejado pasar durante tanto tiempo una representación de tablas de datos cada vez peor.
Las tablas modernas de mediados del siglo XX que señala el artículo realmente parecen ejemplos brillantes.
Me dieron ganas de volver a hacer análisis de datos en Python, y también se me ocurrieron algunas mejoras y extensiones de API que me gustaría construir.
Es excelente para crear tablas HTML, pero la salida a PDF y DOCX está un poco menos pulida.
Me preocupa un poco que, con el cambio reciente de enfoque hacia llevar la versión de Python al nivel de la versión de R, el desarrollo en R parezca haberse ralentizado.
Aun así, vale la pena revisarlo, uses el lenguaje que uses.
Además de SAS, nuestra herramienta principal era un lenguaje antiguo llamado Table Producing Language, o TPL.
Se remonta a la década de 1970, pero una vez que entiendes la sintaxis, TPL era increíblemente flexible, expresivo y eficiente.
Sería bueno que los diseñadores de Great Tables le echaran un vistazo a TPL.
Cubre todo lo que Great Tables busca lograr, y quizá tenga algunas capacidades adicionales.
https://www.ojp.gov/pdffiles1/Digitization/68013NCJRS.pdf
En cualquier caso, gracias por crear Great Tables.
Ayuda muchísimo a mejorar la calidad de la generación de tablas en Python.
Quienes publican en Show HN deberían verlo y aprender.
Como dato interesante, los modelos de IA entrenados con hojas de cálculo necesitan “buenas tablas”, como nombres de columnas y encabezados, para entender el contexto.
Fortap es un ejemplo de eso: https://arxiv.org/abs/2109.07323