Web scraping con Python: Imitando el resultado de R

Web scraping IDH

Web scraping con Python: Imitando el resultado de R

En un post anterior titulado [Web scraping + Visualización con R: ejemplo con datos de wikipedia] (http://r-econ.blogspot.com/2020/06/web-scraping-visualizacion-con-r.html) mostré la facilidad con la que se pueden extraer datos de la web con R, principalmente, con el paquete rvest, en este post mostraré cómo hacer lo mismo usando la funciónread_html() de pandas. Las tablas que vamos a extraer son las mismas que en el post anterior.

In [70]:
import pandas as pd
departamentos=pd.read_html("https://es.wikipedia.org/wiki/Anexo:Departamentos_de_Nicaragua")
len(departamentos)
Out[70]:
1

Dado que el resultado de pd.read_html es una lista de data.frames, entonces se requiere inspeccionar el tamaño de la lista para ubicar el data.frame de interés. En nuestro caso, como solo se trata de una tabla, la longitud de la lista es 1, por tanto, para obtener nuestra tabla basta con seleccionarla de la lista:

In [71]:
departamentos[0]
Out[71]:
Departamento ISO 3166-2 Cabecera Población (2012) Áreakm² Densidad
0 Boaco NI-BO Boaco 174 682 4177 418
1 Carazo NI-CA Jinotepe 186 898 1081 1728
2 Chinandega NI-CI Chinandega 432 062 4822 877
3 Chontales NI-CO Juigalpa 153 932 6481 24
4 Costa Caribe Norte NI-CN Puerto Cabezas 314 130 33106 10
5 Costa Caribe Sur NI-CS Bluefields 306 510 27260 11
6 Estelí NI-ES Estelí 201 548 2230 90
7 Granada NI-GR Granada 168 186 1040 162
8 Jinotega NI-JI Jinotega 331 335 9222 36
9 León NI-LE León 355 779 5138 69
10 Madriz NI-MD Somoto 132 459 1708 78
11 Managua NI-MN Managua 2 132 421 3465 365
12 Masaya NI-MS Masaya 289 988 611 475
13 Matagalpa NI-MT Matagalpa 469 172 6804 69
14 Nueva Segovia NI-NS Ocotal 208 523 3491 60
15 Río San Juan NI-SJ San Carlos 95 596 7541 13
16 Rivas NI-RI Rivas 156 283 2162 72

Ahora sólo falta importar la tabla que contiene los IDH que está en esta dirección https://es.wikipedia.org/wiki/Anexo:Departamentos_de_Nicaragua_por_IDH

In [164]:
idh1=pd.read_html("https://es.wikipedia.org/wiki/Anexo:Departamentos_de_Nicaragua_por_IDH", thousands=".", decimal=",")
len(idh1)
Out[164]:
2

En este caso, el resultado es una lista de longitud 2, usted puede comprobar que nuestra tabla de interés está en la posición 2. Puede hacer departamentos_idh_1[0] y departamentos_idh_1[1] para comprobar dónde está la tabla. Tal como en el caso del post anterior, nuestra tabla tiene ciertos inconvenientes, los cuales podemos arreglar fácilmente.

In [165]:
idh1[1].head(6)
Out[165]:
Puesto Departamento Capital IDH Población Simpatiza Para Capital Unnamed: 6
0 Desarrollo Humano Muy Alto Desarrollo Humano Muy Alto Desarrollo Humano Muy Alto Desarrollo Humano Muy Alto Desarrollo Humano Muy Alto Desarrollo Humano Muy Alto NaN
1 Managua Managua 0.827 1262658 9.80% NaN
2 Desarrollo Humano Alto Desarrollo Humano Alto Desarrollo Humano Alto Desarrollo Humano Alto Desarrollo Humano Alto Desarrollo Humano Alto Desarrollo Humano Alto
3 Masaya Masaya 0.796 289467 7.01% NaN
4 León León 0.781 373662 8.60% NaN
5 Granada Granada 0.760 179437 10.62% NaN
In [169]:
import re
import numpy as np

idh2 = idh1[1].copy()
idh2 = idh2.rename(columns = {'Unnamed: 6':'IDH_categoría'}) 
idh2["IDH_categoría"] = idh2["IDH"]
idh2 = idh2.replace({"IDH_categoría":r"\d"}, {"IDH_categoría":""}, regex=True)
idh2 = idh2.replace({"IDH_categoría":r"Desarrollo|Humano"}, {"IDH_categoría":""}, regex=True)
idh2["IDH_categoría"][idh2["IDH_categoría"]=="."] = np.NaN
idh2["IDH_categoría"]=idh2.IDH_categoría.fillna(method='ffill')
idh2 = idh2[~idh2.Puesto.str.startswith("Desarrollo")] # eliminando filas no deseadas
idh2['Población'] = idh2['Población'].astype(float)
idh2['IDH'] = idh2['IDH'].astype(float)
idh2["Población_porcentaje"] = (idh2.Población/idh2.Población.sum())*100    
idh2.reset_index()
Out[169]:
index Puesto Departamento Capital IDH Población Simpatiza Para Capital IDH_categoría Población_porcentaje
0 1 Managua Managua 0.827 1262658.0 9.80% Muy Alto 24.896409
1 3 Masaya Masaya 0.796 289467.0 7.01% Alto 5.707554
2 4 León León 0.781 373662.0 8.60% Alto 7.367666
3 5 Granada Granada 0.760 179437.0 10.62% Alto 3.538042
4 7 Carazo Jinotepe 0.734 167810.0 5.11% Medio 3.308787
5 8 Estelí Estelí 0.712 197020.0 7.70% Medio 3.884734
6 9 Rivas Rivas 0.686 158142.0 6.08% Medio 3.118159
7 10 Chinandega Chinandega 0.679 405289.0 5.16% Medio 7.991270
8 11 Chontales Juigalpa 0.655 167895.0 4.18% Medio 3.310463
9 12 10º Madriz Somoto 0.640 124973.0 3.38% Medio 2.464150
10 13 11º Matagalpa Matagalpa 0.629 450143.0 10.90% Medio 8.875677
11 14 12º Nueva Segovia Ocotal 0.603 198521.0 3.68% Medio 3.914330
12 15 13º Boaco Boaco 0.599 157973.0 3.40% Medio 3.114826
13 16 14º Río San Juan San Carlos 0.558 87401.0 3.39% Medio 1.723326
14 17 15º Costa Caribe Sur Bluefields 0.536 340873.0 3.65% Medio 6.721150
15 18 16º Jinotega Jinotega 0.513 278504.0 3.87% Medio 5.491392
16 20 17º Costa Caribe Norte Puerto Cabezas 0.497 231879.0 3.47% Bajo 4.572065

Finalmente hemos conseguido obtener las mismas tablas que en el post anterior.

No hay comentarios:

Publicar un comentario