Un año de alquileres, dos preguntas
Una empresa de alquiler de bicis guarda una fila por cada día del año. La gerente quiere saber dos cosas. ¿De verdad hay más trabajo el fin de semana? ¿Cuántos días fueron muy movidos?
Leer 365 filas a mano no responde a ninguna de las dos. Unas pocas líneas de pandas las responden en segundos.
Al final de esta lección
Nota
Puedo cargar una tabla de datos y hacerle preguntas.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| DataFrame | una tabla de pandas con columnas con nombre | |
| Columna | un campo con nombre, el mismo en todas las filas | hires["temp_c"] |
| Filtrar | quedarse solo con las filas que pasan una prueba | hires["hires"] > 400 |
| Agrupar | separar las filas según el valor de una columna | groupby("weather") |
| Resumir | convertir muchos valores en uno, como una media | |
| Mediana | el valor del centro cuando los valores están en orden | |
| Moda | el valor que más se repite |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Dos formas de entrar al laboratorio
Pulsa Iniciar el laboratorio en la barra de la lección y espera a que esté en marcha. El terminal no tiene Python propio. Cada botón Ejecutar escribe docker exec jupyter, que lanza una orden dentro del contenedor del laboratorio.
Para el cuaderno, abre JupyterLab desde la barra y crea un cuaderno nuevo. Un bloque titulado Escribe esto en tu cuaderno va en una celda nueva. No se ejecuta en esta página, porque el Python de la página no tiene pandas.
Un DataFrame es una tabla con nombres
pd.read_csv lee un archivo CSV y lo convierte en un DataFrame. Cada columna toma su nombre de la primera línea del archivo. Los nombres están en inglés, como en muchos archivos reales.
Los corchetes con un nombre eligen una columna: hires["rain_mm"] es la lluvia de cada día. Una columna tiene sus propios métodos, como max, mean y value_counts.
Carga el archivo y mira su tamaño
docker exec jupyter python3 steps/load.pySe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe esto en tu cuaderno: una columna
import pandas as pd
hires = pd.read_csv("hires.csv")
# Una columna: los milímetros de lluvia de cada día.
hires["rain_mm"].max()
Un filtro deja las filas que pasan
hires["hires"] > 400 hace una pregunta a cada fila. La respuesta es una columna de True y False.
Si pones esa respuesta dentro de hires[...], pandas se queda solo con las filas True. Para unir dos pruebas, escribe & para «y» y | para «o». Cada prueba va entre sus propios paréntesis.
Cuenta los días muy movidos
docker exec jupyter python3 steps/filter.pySe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe esto en tu cuaderno: dos pruebas
# Días de lluvia con menos de 200 alquileres.
wet_quiet = hires[(hires["weather"] == "rainy") & (hires["hires"] < 200)]
len(wet_quiet)
Un error muy común
Advertencia
Mucha gente cree que el and de Python une dos pruebas en pandas. No es así: and espera un solo True o False, y una prueba sobre una columna da 365. pandas se para con «The truth value of a Series is ambiguous». Usa & y pon cada prueba entre paréntesis.
groupby separa las filas y luego resume
hires.groupby("weather")["hires"].median() hace tres cosas. Separa las filas por tipo de tiempo. Toma la columna hires de cada grupo. Calcula la mediana de cada uno.
La media se mueve mucho con unos pocos días extremos. La mediana apenas se mueve, así que conviene mirar las dos. La moda sirve para una columna de palabras, como el tiempo.
Ejemplo resuelto: un día muy grande
| Días | Media | Mediana | Moda |
|---|---|---|---|
| 236, 198, 251, 198, 270, 312, 455 | 1920 / 7 = 274,3 | 251, el 4.º de 7 en orden | 198, dos veces |
| Igual, con 300 en lugar de 455 | 1765 / 7 = 252,1 | 251, no cambia | 198, dos veces |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Media y mediana a mano
# Siete días de alquileres en una estación.
days = [236, 198, 251, 198, 270, 312, 455]
total = 0
for one in days:
total = total + one
print("media:", round(total / len(days), 1))
in_order = sorted(days)
middle = len(in_order) // 2
print("mediana:", in_order[middle])
# Cambia 455 por 300 y vuelve a ejecutar.
# ¿Qué número cambia más?
Compara el fin de semana con el resto
docker exec jupyter python3 steps/weekend.pySe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe esto en tu cuaderno: por tiempo
# La mediana de alquileres para cada tipo de tiempo.
hires.groupby("weather")["hires"].median()
Para ir más lejos: el mes más tranquilo
En tu cuaderno, busca el mes con menos alquileres. Agrupa por month, calcula la media de hires y ordena el resultado con sort_values.
Después hazle a la tabla una pregunta tuya, con un filtro y un grupo a la vez. Por ejemplo: solo en días de lluvia, ¿sigue habiendo más trabajo el fin de semana? Di qué esperas antes de ejecutarlo.