Recursos libres para aprender a programar en español
¡Qué queremos? ¡Trabajar con datos! ¿Y dónde los vamos a buscar? Eh… en un… ¿conjunto de datos?🤔
Cuando queramos analizar datos, con mucha frecuencia los encontraremos en archivos llamados (no muy originalmente 😛) lotes de datos (datasets, en inglés). ¿Pero cómo se ven estos lotes? ¿Dónde los podemos encontrar publicados? ¿Cómo los podemos procesar?
¡Muchas preguntas! En esta lección responderemos alguans de ellas. Y en el camino, conoceremos a pandas
🐼, una biblioteca que poco tiene con los simpáticos osos oriundos de las regiones montañosas de China 🇨🇳, pero que nos ayudará enormemente a trabajar con estos lotes de datos.
¡Empecemos!
Primero lo primero: entendamos dónde encontrar nuestros tan deseados lotes de datos. O mejor dicho, entendamos que no siempre podremos encontrarlos 😓. Esto se debe a las organizaciones que los recopilan (estados, empresas, ONGs, etc) a veces los publican y otras veces, no.
Por eso es que tenemos dos grandes familias de lotes de datos:
🏅 Desafío: las siguientes son páginas de estados que ofrecen datos abiertos. Exploralas e identificá qué tipo de información publican y en qué formatos.
Si exploraste las páginas anteriores, quizás hayas notado que casi todos los lotes de datos están publicados en forma de tablas. Y dentro de tooodos los formatos que existen, uno de los más frecuentes (y fáciles de usuar) se llama CSV.
Momento, ¿cesequé? ¡Ce-ese-vé! Se trata de un acrónimo en inglés de Comma Separated Value, es decir, un archivo de texto con valores separados por comas. Por ejemplo así se ve un archivo datos_ejemplo.csv
:
Feli,Perez,24
Dani,Lopez,32
Juani,Vazquez,19
Para pensar 🤔: ¿qué está intentando representar este CSV de ejemplo? ¿Qué información contiene cada renglón?
El archivo CSV que vimos antes contenía información de personas, o al menos eso parece. Quizás se traten de sus nombres, apellidos y sus edades, o quizás sean estudiantes de una carrera y nos esté informando la cantidad de materias aprobadas.
Para evitar este tipo de ambigüedad, normalmente los archivos CSV contendrán en su primer renglón los títulos de cada columna. Por ejemplo así podría verse ahora nuestro datos_ejemplo.csv
:
nombre,apellido,edad
Feli,Perez,24
Dani,Lopez,32
Juani,Vazquez,19
Para pensar 🤔: Y si ahora quisieras agregar la información de cuál es su gusto de helado favorito, ¿cómo harías?
Para poder trabajar con estas tablas en formato csv
vamos a necesitar nuevas funciones, procedimientos, tipos de datos y otras yerbas 🧉, especialmente diseñadas para este fin. Y como no queremos gastar tiempo en escribirlas a mano, vamos a recurrir a una biblioteca: código que otras personas ya programaron y empaquetaron para que podamos incluirlo y usarlo en nuestros programas. Hay bibliotecas para miles de tareas diferentes: procesar imágenes, hacer cuentas sofisticadas, producir música, analizar textos, y mucho más 🤯.
En particular, la biblioteca que nos va a interesar ahora se llama pandas
, una herramienta poderosa para el lenguaje Python, que posibilita manipular datos de un lote de forma programática. En otras palabaras, va a permitirnos hacer las mismas operaciones que haríamos en una hoja de cálculo, pero utilizando código.
¡Carguemos a nuestra biblioteca de ositos 🐼!
import pandas as pd
Con esta sentencia estamos cargando (o importando) en nuestro programa, y dejándola lista para ser utilizada, bajo el nombre pd
. Podríamos leerlo como “computadora: andá a buscar la biblioteca pandas
y nombrala como pd
“.
📝 Nota: El nombre pd
es totalmente arbitrario y podríamos haberle dado cualquier otro. Pero casi todo el mundo que la usa (sobre todo en internet) en suele abreviar pandas de esa forma 🤷.
Ahora que importamos la biblioteca pandas
, el siguiente paso es conseguir un lote de datos, como por ejemplo, el listado de bicicleterías 🚴 que hay que CABA, cuya dirección es ésta
Un vez que hayamos encontrado la dirección (y copiado en nuestro portapeles 📋, para no tener que escribir la dirección a mano), podremos finalmente cargarla en un DataFrame
llamado bicicleterias
,
utilizando la función pd.read_csv
:
bicicleterias = pd.read_csv("https://cdn.buenosaires.gob.ar/datosabiertos/datasets/transporte/bicicleterias/bicicleterias-de-la-ciudad.csv")
bicicleterias
Probá éste código y observá qué sucede
¡Está vivo! ⚡ ¡Apareció una tabla! Pero, momento… ¿un DataFrame
? ¿Qué es eso? ¡Resolvamos el misterio! 🦇🎃
Hasta ahora veníamos trabajando con valores como números (por ejemplo, el 1
, el 42
y el 30410
), cadenas de caracteres ("estro es un string"
) o booleanos (True
o False
)…
# type es una función que nos permite saber el tipo de dato de un valor
>>> type(1)
<class 'int'>
>>> type("hola mundo")
<class 'str'>
>>> type(True)
<class 'bool'>
… pero eso es muy limitado. Por eso vamos a usar ahora un nuevo tipo de dato llamado DataFrame
, que es el tipo de la variable bicicleterias
:
>>> type(bicicleterias)
<class 'pandas.core.frame.DataFrame'>
Los DataFrame
representan justamente tablas, compuestas por columnas y filas.
¿Y cómo hacemos para saber cuántas filas y columnas tiene un DataFrame
? Con nuestra vieja y querida función len
:
# cantidad de filas
>>> len(bicicleterias)
112
# cantidad de columnas
>>> len(bicicleterias.columns)
15
💡 Como vemos, si consultamos simplemente la longitud de la tabla, esta se corresponde con la cantidad de filas, lo cual tiene bastante sentido. Como veremos a partir de ahora muchas de las operaciones justamente tendrán que ver con la cantidad o posición de filas.
Como si de un gusanito 🪱 se tratara, las tablas tienen cabeza y cola: la cabeza refiere a las primeras n
filas, mientras que la cola a las últimas n
. Para obtener la cabeza podemos usar la función infija (más comunmente llamada método) head
:
>>> bicicleterias.head(5)
0 POINT (-58.4256879365174 -34.5923050897605) 1 Bicicletas Araoz ... ARAOZ 1458 Palermo Comuna 14
1 POINT (-58.4259820523858 -34.581377735346) 2 Roda2oro ... FRAY JUSTO SANTAMARIA DE ORO 2305 Palermo Comuna 14
2 POINT (-58.4153429603451 -34.6533516212895) 3 Walter ... LYNCH 3914 Nueva Pompeya Comuna 4
3 POINT (-58.4432441275002 -34.5943508729756) 4 Bici Shop ... VILLARROEL 1093 Villa Crespo Comuna 15
4 POINT (-58.3773343753292 -34.6083635891506) 5 Bicicleterias El colo ... RIVADAVIA AV. 770 Monserrat Comuna 1
[5 rows x 15 columns]
⚠️ Es importante notar que head
no orden la tabla bajo ningún criterio, sino que sólo nos da las primeras filas, según la posición en la que originalmente estuvieran.
De forma análoga podemos obtener la cola:
>>> bicicleterias.tail(3)
WKT id nombre ... direccion_ barrio comuna
109 POINT (-58.4352606531347 -34.5676102200762) 121 Bicis ... NEWBERY, JORGE 1741 Palermo Comuna 14
110 POINT (-58.4540104298256 -34.6132076385661) 122 Bicicletería Bike Doctor ... FRAGATA PRES. SARMIENTO 966 Caballito Comuna 6
111 POINT (-58.4221769107392 -34.5994544804325) 123 Rodados La Esquina Express ... ACUÑA DE FIGUEROA, FRANCISCO 1000 Almagro Comuna 5
[3 rows x 15 columns]
# sort_values también es una función infija
# tabla.sort_values(nombre_columna)
bicicleterias.sort_values("comuna")
bicicleterias.sort_values("comuna", ascending=False)
Desafío: obtené las últimas 3 bicileterías, según su nombre por orden alfabético.
Podemos hacer un gráfico de barras con el resultado de un value_counts
usando plot.bar
de la siguiente manera:
bicileterias.plot.bar(figsize=(tamanio_x_en_pulgadas, tamanio_y_en_pulgadas))
Desafío: ¿cómo podríamos hacer para obtener todas las filas desde la décima y hasta la veinteva? ¡Escribilo!
Y ahora combinemos todo… ¡de nuevo!
Definí una función
entre_limites
, que generalice lo que hicimos en el ejercicio anterior: debe tomar una tabla y dos números, y devolvernos unDataFrame
que contenga las filas entre los índices dados.