Un proyecto de @YaNiPaper y @tacosdedatos
import pandas as pd
from pathlib import Path
from herramientas import arbol
import arrow
import altair as alt
import geopandas as gpd
import gpdvega
%matplotlib inline
hoy = arrow.now('local').format(fmt = 'DD-MMM-YY', locale = 'es')
hoy
DATOS_BRUTOS = Path("../datos/brutos/")
DATOS_INTERINOS = Path("../datos/interinos/")
DATOS_PROCESADOS = Path("../datos/procesados/")
DATOS_EXTERNOS = Path("../datos/externos/")
FIGURAS = Path("../reportes/figuras/")
arbol(DATOS_EXTERNOS)
Vamos a crear una visualización a nivel municipal y otra a nivel sección.
Estos datos han sido adquiridos, limpiados y manipulados por @YaNiPaper previo a esta visualización. Esto fue hecho con R
, puedes visitar el repositorio de GitHub aquí
datos_municipio = pd.read_csv(DATOS_EXTERNOS / 'elecciones_puebla_por_municipio_computo_2019.csv')
datos_municipio.head()
datos_municipio.shape
puebla_municipios = gpd.read_file(DATOS_EXTERNOS / 'mapas_puebla' / 'MUNICIPIO.shp', encoding = 'utf-8')
# # un poco mas de limpieza por las malditas ñ's en los nombres
# puebla_municipios['nombre'] = puebla_municipios['nombre'].str.replace("CA?ADA", "CAÑADA")
puebla_municipios.head()
puebla_municipios.plot();
De este GeoDataFrame
solo nos interesa las columnas:
puebla_municipios.drop(columns = ['gid', 'id', 'entidad', 'control', 'geometry1_'], inplace = True)
puebla_con_datos = puebla_municipios.merge(datos_municipio, left_on = ['municipio', ], right_on = ['ID_MUNICIPIO',],)
puebla_con_datos.drop(columns = ['municipio',], inplace = True)
puebla_con_datos.head()
Limpiamos un poco mas los datos:
puebla_con_datos.columns = [col.replace("_", " ").lower() for col in puebla_con_datos.columns]
puebla_con_datos = puebla_con_datos.rename(columns = {
"enrique cardenas": "Enrique Cárdenas Sánchez",
"alberto jimenez": "Alberto Jiménez Merino",
"miguel barbosa": "Miguel Barbosa Huerta",
"no registrados": "No registrados",
"nulos": "Votos nulos",
"total votos": "Total de votos",
"ganador": "Ganador",
"porc ganador": "% del ganador",
"lista nominal": "Lista nominal",
"aj porc": "% AJ",
"ec porc": "% EC",
"mb porc": "% MB",
"no reg porc": "% No registrados",
"nulos porc": "% Nulos",
"parti porc": "% de participación",
"abst porc": "% de abstencionismo",
})
puebla_con_datos['Municipio'] = puebla_con_datos['municipio'].str.title()
puebla_con_datos.head()
puebla_con_datos['Ganador'] = puebla_con_datos['Ganador'].str.replace("_", ' ').str.title()
# centroides
puebla_con_datos['centroide_x'] = puebla_con_datos['geometry'].centroid.x
puebla_con_datos['centroide_y'] = puebla_con_datos['geometry'].centroid.y
Podemos revisar rápidamente con lo que estamos trabajando con .plot();
en GeoPandas
.
.plot();
solo para evitar el mensaje de matplotlib que dice algo como matplotlib.axes._subplots.AxesSubplot at 0xc281b70
puebla_con_datos.plot(column = 'Ganador');
%run theme.py
mapa_base = alt.Chart(puebla_con_datos).mark_geoshape(
stroke = '#C7C7C7',
strokeWidth = 0.1,
).encode().properties(
width = 600,
height = 800,
)
mapa_resultados = alt.Chart(puebla_con_datos).mark_geoshape(
fill = 'lightgray',
stroke = '#C7C7C7',
).encode(
color = alt.Color(
'Ganador:N',
legend = alt.Legend(title = "Ganador", orient = 'none', legendY=300, legendX = 600)
),
tooltip = ['Municipio:N','Enrique Cárdenas Sánchez:Q', 'Alberto Jiménez Merino:Q', 'Miguel Barbosa Huerta:Q', 'Votos nulos:Q', 'No registrados:Q', 'Lista nominal:Q', '% de abstencionismo']
)
ganador_por_municipio = (mapa_base + mapa_resultados).properties(
title = 'Elección de gobernador - Puebla 2019',
background = '#F5F1E4'
).configure_view(
strokeWidth = 0,
).configure_title(
fontSize=36,
)
ganador_por_municipio
# checkpoint
municipio_path = FIGURAS.joinpath(f"ganador_por_municipio-{hoy}.html")
municipio_path = str(municipio_path)
ganador_por_municipio.save(municipio_path)
secciones = gpd.read_file(DATOS_EXTERNOS / 'mapas_puebla' / 'SECCION.shp')
secciones = secciones[['seccion', 'geometry']]
secciones.head()
secciones_datos = pd.read_csv(DATOS_EXTERNOS / 'elecciones_puebla_por_seccion_2019.csv')
secciones_datos.head()
secciones_con_datos = secciones.merge(secciones_datos, left_on = 'seccion', right_on = 'SECCION')
secciones_con_datos = secciones_con_datos.rename(columns = {
"ENRIQUE_CARDENAS": "Enrique Cárdenas Sánchez",
"ALBERTO_JIMENEZ": "Alberto Jiménez Merino",
"MIGUEL_BARBOSA": "Miguel Barbosa Huerta",
"NO_REGISTRADOS": "No registrados",
"NULOS": "Votos nulos",
"TOTAL_VOTOS": "Total de votos",
"GANADOR": "Ganador",
"PORC_GANADOR": "% del ganador",
"abst_porc": "% de abstencionismo"
})
secciones_con_datos['Ganador'] = secciones_con_datos['Ganador'].str.replace("_", ' ').str.title()
secciones_con_datos = secciones_con_datos[['Alberto Jiménez Merino', 'Enrique Cárdenas Sánchez', 'Miguel Barbosa Huerta', 'No registrados', 'Votos nulos', 'Total de votos', 'LISTA_NOMINAL', 'aj_porc', 'ec_porc', 'mb_porc', 'no_reg_porc', 'nulos_porc', 'parti_porc', "% de abstencionismo", 'Ganador','% del ganador', 'CVE_GANADOR', 'geometry',]]
secciones_con_datos = secciones_con_datos.to_crs(epsg=4326)
# centroides
secciones_con_datos['centroide_x'] = secciones_con_datos['geometry'].centroid.x
secciones_con_datos['centroide_y'] = secciones_con_datos['geometry'].centroid.y
secciones_con_datos.plot(column = 'Ganador');
base_secciones = alt.Chart(secciones_con_datos).mark_geoshape(
stroke='black',
strokeWidth=0.1,
fill = '#FCF9F0'
).properties(
width = 600,
height = 800,
).encode(
tooltip = ['Enrique Cárdenas Sánchez', 'Alberto Jiménez Merino', 'Miguel Barbosa Huerta', 'Votos nulos', 'Total de votos', '% de abstencionismo']
)
participacion = alt.Chart(secciones_con_datos).mark_circle().encode(
longitude='centroide_x:Q',
latitude='centroide_y:Q',
size=alt.Size(
"Total de votos:Q",
title="Total de votos",
legend = alt.Legend(orient = 'none', legendY=400, legendX = 600)
),
tooltip = ['Enrique Cárdenas Sánchez', 'Alberto Jiménez Merino', 'Miguel Barbosa Huerta', 'Votos nulos', 'Total de votos', '% de abstencionismo'],
color = alt.Color('Ganador:N',legend = alt.Legend(title = "Ganador", orient = 'none', legendY=300, legendX = 600)),
)
mapa_participacion = (base_secciones + participacion).properties(
title="Elección de gobernador - Puebla 2019",
background = '#F5F1E4',
).configure_view(
strokeWidth=0,
).configure_title(
fontSize = 36,
)
mapa_participacion
participacion_path = str(FIGURAS / f"participacion-{hoy}.html")
mapa_participacion.save(participacion_path)