Consulta de bases de datos usando SQL#

El primer paso es cargar y explorar los datos. Usamos pandas para cargar los datos y todo lo que hacemos es almacenarlos en variables.

import pandas as pd
from pandasql import sqldf

Cuando se trabaja con SQL, es una práctica común llamar a las tablas (también conocidas como DataFrames) en singular. Esto permite leer mejor el código SQL. Por ejemplo, en una base de datos que contiene experimentos, más adelante podemos usar experiment.concentration para describir la concentración de un fármaco que se utilizó para exponer las células.

experiment = pd.read_csv("../../data/experiments.csv")
measurement = pd.read_csv("../../data/measurements.csv")

A continuación, combinamos estas tablas en una base de datos. Por lo tanto, definimos una función que puede consultar la base de datos.

query_database = lambda q: sqldf(q, globals())

Select From#

A continuación, definimos una consulta en SQL. SQL tiene un formato bastante legible para los humanos. Típicamente comenzamos definiendo qué queremos leer (SELECT) y de dónde (FROM).

query = """
SELECT * 
FROM measurement
"""

query_database(query)
Unnamed: 0 image_ID time_after_exposure_in_s number_of_cells
0 0 1 0 99
1 1 1 1 52
2 2 1 2 33
3 3 1 3 25
4 4 1 4 21
... ... ... ... ...
95 95 10 5 52
96 96 10 6 54
97 97 10 7 54
98 98 10 8 54
99 99 10 9 51

100 rows × 4 columns

Por cierto, SQL no distingue entre mayúsculas y minúsculas per se, pero típicamente encontrarás las palabras de comando SQL en letras mayúsculas.

query = """
select * 
from measurement
"""

query_database(query)
Unnamed: 0 image_ID time_after_exposure_in_s number_of_cells
0 0 1 0 99
1 1 1 1 52
2 2 1 2 33
3 3 1 3 25
4 4 1 4 21
... ... ... ... ...
95 95 10 5 52
96 96 10 6 54
97 97 10 7 54
98 98 10 8 54
99 99 10 9 51

100 rows × 4 columns

También puedes seleccionar columnas específicas por nombre. Aquí también, SQL no distingue entre mayúsculas y minúsculas. La columna seleccionada concentration aparece como Concentration porque ese es su nombre en la base de datos.

query = """
select Comment, concentration
from experiment
"""

query_database(query)
Comment Concentration
0 High dose 50
1 Medium dose 20
2 Control 0
3 Super high dose 1000

Ordenación de tablas#

Esta tabla también se puede ordenar usando la declaración ORDER BY, por ejemplo, para ver el mayor número de células. En este caso, ordenamos la columna de forma descendente usando la declaración DESC. El orden ascendente ASC sería el predeterminado.

query = """
SELECT * 
FROM measurement
ORDER BY number_of_cells DESC
"""

query_database(query)
Unnamed: 0 image_ID time_after_exposure_in_s number_of_cells
0 10 2 0 201
1 75 8 5 161
2 50 6 0 158
3 78 8 8 158
4 70 8 0 157
... ... ... ... ...
95 47 5 7 8
96 38 4 8 7
97 48 5 8 7
98 39 4 9 6
99 49 5 9 6

100 rows × 4 columns

Especificación del número de filas a consultar#

En caso de que una tabla sea muy grande, recuperar todas las filas puede llevar mucho tiempo. Para obtener información sobre los datos de todos modos, puede tener sentido LIMIT la tabla a las 10 primeras filas.

query = """
SELECT * 
FROM measurement
ORDER BY number_of_cells DESC
LIMIT 10;
"""

query_database(query)
Unnamed: 0 image_ID time_after_exposure_in_s number_of_cells
0 10 2 0 201
1 75 8 5 161
2 50 6 0 158
3 78 8 8 158
4 70 8 0 157
5 77 8 7 157
6 76 8 6 154
7 60 7 0 153
8 64 7 4 153
9 66 7 6 153

Ejercicio#

Determina el time_after_exposure_in_s más largo aplicado en cualquier experimento.