2. Relación entre estructuras de datos, hojas de cálculo y Bases de Datos

1 Relación entre Calc, Listas de Diccionarios y Bases de Datos

1.1. Una misma información, distintas formas de representarla

Hasta este momento hemos trabajado con información utilizando diferentes herramientas.

En LibreOffice Calc almacenamos datos utilizando filas, columnas y celdas. Una hoja de cálculo permite manipular datos organizados en forma de tablas y realizar operaciones sobre ellos mediante fórmulas y funciones. 

En Python, hemos visto que podemos utilizar diccionarios para almacenar varios datos relacionados entre sí y listas para almacenar varios diccionarios.

Por ejemplo (listas de diccionarios) :

alumnos = [    {"id_alumno": 1, "nombre": "Juan", "nota": 7},    {"id_alumno": 2, "nombre": "Ana", "nota": 8},    {"id_alumno": 3, "nombre": "Pedro", "nota": 4}]
 

También podemos almacenar esta información en una hoja de Calc:

id_alumno nombre nota
1 Juan 7
2 Ana 8
3 Pedro 4

Y podríamos encontrar una estructura visualmente muy parecida en una tabla de una Base de Datos:

id_alumno nombre nota
1 Juan 7
2 Ana 8
3 Pedro 4

Por lo tanto, estamos representando la misma información utilizando diferentes herramientas.

IMPORTANTE: una lista de diccionarios, una tabla de Calc y una tabla de una Base de Datos no son lo mismo. Sin embargo, presentan semejanzas que podemos aprovechar para comprender cómo se organizan los datos.


1.2. Filas, columnas y datos

Recordemos que en Calc una hoja está formada por filas y columnas, y una celda es la intersección de una fila con una columna. Hoja de Cálculo _ Aula Virtual

Supongamos la siguiente tabla:

id_alumno nombre nota
1 Juan 7
2 Ana 8
3 Pedro 4

La fila correspondiente a Juan contiene:

1     Juan     7

En Python podríamos representar esos mismos datos mediante un diccionario:

alumno = {    "id_alumno": 1,    "nombre": "Juan",    "nota": 7}
 

Podemos observar la siguiente relación:

Calc Python
Encabezado de una columna Clave del diccionario
Contenido de una celda Valor asociado a una clave
Fila de datos Diccionario
Conjunto de filas Lista de diccionarios

Por ejemplo, en Calc:

nombre
------
Juan

y en Python:

{"nombre": "Juan"}
 

En ambos casos estamos identificando un dato mediante un nombre y almacenando un valor asociado.


1.3. Una fila de Calc y un diccionario

Consideremos:

id_alumno nombre nota
1 Juan 7

Podemos representar esta fila mediante:

alumno = {    "id_alumno": 1,    "nombre": "Juan",    "nota": 7}
 

Observemos que:

alumno["nombre"]
 

permite obtener:

Juan

De manera semejante, en Calc podríamos obtener el dato observando la celda correspondiente a la columna nombre y a la fila del alumno.

La principal diferencia es la forma de hacer referencia a la información.

En Calc podemos utilizar una referencia de celda:

B2

Mientras que en el diccionario utilizamos una clave:

alumno["nombre"]
 

1.4. Varias filas y una Lista de Diccionarios

Supongamos ahora que tenemos varios alumnos:

id_alumno nombre nota
1 Juan 7
2 Ana 8
3 Pedro 4

En Python podemos representarlos mediante:

alumnos = [    {"id_alumno": 1, "nombre": "Juan", "nota": 7},    {"id_alumno": 2, "nombre": "Ana", "nota": 8},    {"id_alumno": 3, "nombre": "Pedro", "nota": 4}]
 

Tenemos entonces:

Lista
 |
 +-- Diccionario
 |
 +-- Diccionario
 |
 +-- Diccionario

Cada diccionario representa los datos de un alumno.

Podemos recorrerlos:

for alumno in alumnos:    print(alumno)
 

La salida sería:

{'id_alumno': 1, 'nombre': 'Juan', 'nota': 7}
{'id_alumno': 2, 'nombre': 'Ana', 'nota': 8}
{'id_alumno': 3, 'nombre': 'Pedro', 'nota': 4}

También podemos mostrar solamente algunos datos:

for alumno in alumnos:    print(alumno["nombre"], alumno["nota"])

Resultado:

Juan 7
Ana 8
Pedro 4

1.5. Tabla de Calc, Lista de Diccionarios y tabla de Base de Datos

Podemos establecer ahora una comparación conceptual:

Concepto Calc Python Base de Datos
Conjunto de información Tabla o rango Lista de diccionarios Tabla
Una entidad Fila Diccionario Registro o fila
Característica de la entidad Columna Clave Campo o columna
Dato almacenado Celda Valor Valor del campo

Por ejemplo:

{"id_alumno": 2, "nombre": "Ana", "nota": 8}
 

representa conceptualmente algo semejante a:

id_alumno | nombre | nota
-----------+--------+-----
2          | Ana    | 8

Pero debemos volver a remarcar:

Esta comparación sirve para comprender la organización de los datos. Una hoja de cálculo, una estructura de Python y una Base de Datos poseen características y mecanismos diferentes.


1.6. El índice de la Lista no es el identificador del alumno

Este punto es particularmente importante.

Supongamos:

alumnos = [    {"id_alumno": 10, "nombre": "Juan", "nota": 7},    {"id_alumno": 25, "nombre": "Ana", "nota": 8},    {"id_alumno": 38, "nombre": "Pedro", "nota": 4}]
 

La posición del primer diccionario en la lista es:

alumnos[0]
 

pero el valor de:

alumnos[0]["id_alumno"]
 

es:

10

Por lo tanto:

0

es el índice o posición dentro de la lista, mientras que:

10

es un identificador almacenado como dato.

No debemos confundirlos.

Esta diferencia será particularmente importante cuando trabajemos con Bases de Datos.


1.7. Filtrar información

En Calc ya vimos que podemos aplicar filtros para visualizar solamente las filas que cumplen determinadas condiciones. Hoja de Cálculo _ Aula Virtual

Por ejemplo, en el material de Calc se utiliza un filtro para mostrar solamente calificaciones mayores o iguales a 5. Hoja de Cálculo _ Aula Virtual

Supongamos:

nombre nota
Juan 7
Ana 8
Pedro 4
María 3
Luis 6

Si queremos visualizar solamente los alumnos con:

nota >= 5

en Calc podemos utilizar un filtro.

En Python podemos resolver conceptualmente el mismo problema mediante:

for alumno in alumnos:    if alumno["nota"] >= 5:        print(alumno["nombre"], alumno["nota"])
 

Obtendríamos:

Juan 7
Ana 8
Luis 6

Cuando estudiemos Bases de Datos veremos que también poseen mecanismos para seleccionar registros que cumplen determinadas condiciones.

Por ejemplo:

SELECT *
FROM alumnos
WHERE nota >= 5;

Lo importante en este momento es observar que el problema es el mismo:

Tenemos muchos registros
          |
          v
Aplicamos una condición
          |
          v
Seleccionamos solamente algunos

Podemos resumir:

Herramienta Mecanismo
Calc Filtro
Python if
Base de Datos WHERE

1.8. Ordenar datos

Calc permite ordenar las filas según el contenido de determinadas columnas. En el material se muestra cómo seleccionar una tabla y ordenarla según una columna.

Por ejemplo:

nombre nota
Pedro 4
Juan 7
Ana 8

Podemos solicitar que Calc ordene las filas según la nota.

Resultado:

nombre nota
Pedro 4
Juan 7
Ana 8

Las Bases de Datos también permiten ordenar registros, con mecanismos que son solo informativos en esta materia, llamados SQL.

Son expresiones como:

SELECT *
FROM alumnos
ORDER BY nota;

Nuevamente, no pretendemos estudiar SQL en este momento, sino observar que diferentes herramientas permiten realizar operaciones semejantes sobre conjuntos de datos.


1.9. Dos conjuntos de datos relacionados

Hasta ahora utilizamos una única estructura:

Alumnos

Supongamos ahora que queremos almacenar la carrera que estudia cada alumno.

Podríamos escribir:

id_alumno nombre carrera
1 Juan Ing. Civil
2 Ana Ing. Electrónica
3 Pedro Ing. Civil

Sin embargo, también podemos separar la información en dos conjuntos.

Carreras

id_carrera nombre_carrera
1 Ing. Civil
2 Ing. Electrónica
3 Ing. Industrial

Alumnos

id_alumno nombre id_carrera
1 Juan 1
2 Ana 2
3 Pedro 1

Ahora el valor:

id_carrera = 1

permite relacionar:

Juan

con:

Ing. Civil

y también:

Pedro

con:

Ing. Civil

Gráficamente:

ALUMNOS                         CARRERAS

id_alumno                      id_carrera
nombre                         nombre_carrera
id_carrera ------------------> id_carrera

1.10. Las mismas dos estructuras en Python

En Python podemos crear:

carreras = [    {"id_carrera": 1, "nombre_carrera": "Ing. Civil"},    {"id_carrera": 2, "nombre_carrera": "Ing. Electrónica"},    {"id_carrera": 3, "nombre_carrera": "Ing. Industrial"}]
 

y:

alumnos = [    {"id_alumno": 1, "nombre": "Juan", "id_carrera": 1},    {"id_alumno": 2, "nombre": "Ana", "id_carrera": 2},    {"id_alumno": 3, "nombre": "Pedro", "id_carrera": 1}]
 

Nuevamente podemos observar la semejanza:

Hoja Carreras de Calc
          |
          v
Lista carreras en Python
          |
          v
Tabla Carreras de una Base de Datos

y:

Hoja Alumnos de Calc
          |
          v
Lista alumnos en Python
          |
          v
Tabla Alumnos de una Base de Datos

1.11. Relacionando información en Calc mediante BUSCARV

En Calc ya vimos la función BUSCARV.

Esta función busca un determinado valor en la primera columna de una matriz y permite obtener otro dato ubicado en la misma fila. Hoja de Cálculo _ Aula Virtual

Esto nos permite construir un ejemplo interesante.

Supongamos que tenemos la hoja:

Carreras

A              B

id_carrera     nombre_carrera
1              Ing. Civil
2              Ing. Electrónica
3              Ing. Industrial

Y otra hoja:

Alumnos

A           B          C

id_alumno   nombre     id_carrera
1           Juan       1
2           Ana        2
3           Pedro      1

Podríamos utilizar BUSCARV para buscar el id_carrera de cada alumno dentro de la tabla Carreras y obtener el nombre correspondiente.

Conceptualmente:

Juan
 |
id_carrera = 1
 |
 v
buscar 1 en Carreras
 |
 v
Ing. Civil

De esta manera estamos utilizando un dato común:

id_carrera

para relacionar dos conjuntos de información.

Más adelante veremos que las Bases de Datos están especialmente diseñadas para trabajar con este tipo de relaciones.

No debemos interpretar que BUSCARV sea equivalente a una operación de una Base de Datos. Lo importante aquí es observar que estamos utilizando un identificador para encontrar información relacionada almacenada en otro conjunto de datos.


1.12. ¿Por qué utilizar un identificador?

Podría surgir la siguiente pregunta:

¿Por qué almacenar el número 1 en lugar de escribir directamente Ing. Civil?

Por ejemplo:

Juan     Ing. Civil
Pedro    Ing. Civil
Laura    Ing. Civil
José     Ing. Civil

En este caso estamos repitiendo varias veces:

Ing. Civil

En cambio:

Juan     1
Pedro    1
Laura    1
José     1

y mantenemos la descripción completa en otro lugar:

1    Ing. Civil

Esto permite que el identificador establezca la relación entre ambos conjuntos de información.

Es una idea fundamental que encontraremos nuevamente cuando estudiemos Bases de Datos.


1.13. Archivo CSV como forma de intercambio de datos

Calc permite guardar una hoja en diferentes formatos, entre ellos CSV, que almacena los datos separados por delimitadores. Hoja de Cálculo _ Aula Virtual

Por ejemplo, nuestra tabla:

id_alumno nombre nota
1 Juan 7
2 Ana 8
3 Pedro 4

podría almacenarse en un archivo CSV de forma semejante a:

id_alumno,nombre,nota
1,Juan,7
2,Ana,8
3,Pedro,4

Al guardar como CSV perdemos características propias de la hoja de cálculo, tales como formatos visuales, pero conservamos los datos en una estructura sencilla de filas y columnas.

Esto permite utilizar CSV como un medio de intercambio entre diferentes programas.

Por ejemplo:

        Calc
          |
          v
         CSV
        /   \
       v     v
   Python   Base de Datos

Por esta razón es habitual encontrar archivos CSV cuando diferentes aplicaciones necesitan intercambiar información.


1.14. Una misma información recorriendo diferentes herramientas

Podemos resumir todo el proceso.

Partimos de:

id_alumno | nombre | nota
1         | Juan   | 7
2         | Ana    | 8
3         | Pedro  | 4

En Calc

Visualizamos los datos mediante filas y columnas.

En Python

Los podemos representar mediante:

alumnos = [    {"id_alumno": 1, "nombre": "Juan", "nota": 7},    {"id_alumno": 2, "nombre": "Ana", "nota": 8},    {"id_alumno": 3, "nombre": "Pedro", "nota": 4}]
 

En una Base de Datos

Podemos almacenarlos en una tabla:

ALUMNOS

id_alumno | nombre | nota
----------+--------+-----
1         | Juan   | 7
2         | Ana    | 8
3         | Pedro  | 4

Lo importante no es memorizar las equivalencias, sino comprender que:

Los datos pueden ser representados, procesados y almacenados utilizando diferentes herramientas.

  • Calc nos permite trabajar con ellos visualmente.
  • Python nos permite procesarlos mediante un programa.
  • Una Base de Datos nos permitirá almacenarlos, consultarlos y relacionarlos de manera organizada.

1.15. Cuadro comparativo final

Concepto Calc Python Base de Datos
Conjunto de datos Tabla/rango Lista de diccionarios Tabla
Elemento individual Fila Diccionario Registro
Característica Columna Clave Campo/columna
Contenido Celda Valor Valor
Seleccionar por condición Filtro if WHERE
Ordenar Ordenar Operación sobre la lista ORDER BY
Relacionar información BUSCARV puede ayudar Buscar en otra estructura Relaciones entre tablas
Intercambiar datos CSV Puede leer/escribir CSV Puede importar/exportar datos

Nuevamente:

La tabla anterior muestra semejanzas conceptuales y no equivalencias exactas entre las herramientas.