#!/usr/bin/env python
# coding: utf-8
# # Elecciones de Puebla 2019
# #### Un analisis y visualizacion geografica de las elecciones de Junio 2019 en Puebla, Mexico.
#
#
# Meta
# La meta de este notebook es crear un mapa interactivo utilizando los datos de las elecciones de puebla en junio 2019.
#
# - Metas mensurables
# - Identificar variables de interes en el conjunto de datos que @YaNiPaper limpió.
# - Crear un mapa como el que @palewire publicó en twitter: https://twitter.com/palewire/status/1137815979780476928
#
#
#
#
# Contexto
# @YaNiPaper limpió los datos y creo mapas (que se encuentran en el directorio: reportes/figuras/
.
# Lo que queremos hacer es recrear el mapa de @palewire con datos de puebla.
#
# In[1]:
import pandas as pd
from zipfile import ZipFile
from pathlib import Path
from herramientas import arbol
import arrow
import altair as alt
import geopandas as gpd
import gpdvega
hoy = arrow.now('local').format(fmt = 'DD-MMM-YY', locale = 'es')
hoy
# In[2]:
get_ipython().run_line_magic('matplotlib', 'inline')
# In[3]:
DATOS_BRUTOS = Path("../datos/brutos/")
DATOS_INTERINOS = Path("../datos/interinos/")
DATOS_PROCESADOS = Path("../datos/procesados/")
DATOS_EXTERNOS = Path("../datos/externos/")
# In[4]:
arbol(DATOS_BRUTOS)
# In[5]:
arbol(DATOS_EXTERNOS)
# In[6]:
datos_por_municipio = pd.read_csv(DATOS_EXTERNOS / 'elecciones_puebla_por_municipio_computo_2019.csv')
datos_por_municipio.head()
# In[7]:
puebla = gpd.read_file(DATOS_EXTERNOS / 'mapas_puebla' / 'MUNICIPIO.shp')
# In[8]:
puebla.head()
# In[9]:
puebla.plot();
# In[10]:
puebla.shape
# In[11]:
puebla_con_datos = puebla.merge(datos_por_municipio, left_on = ['municipio', 'nombre'], right_on = ['ID_MUNICIPIO', 'MUNICIPIO'])
# In[12]:
puebla_con_datos.head(2).T
# In[13]:
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"
})
# In[14]:
puebla_con_datos['Ganador'] = puebla_con_datos['Ganador'].str.replace("_", ' ').str.title()
# In[15]:
# centroides
puebla_con_datos['centroide_x'] = puebla_con_datos['geometry'].centroid.x
puebla_con_datos['centroide_y'] = puebla_con_datos['geometry'].centroid.y
# In[16]:
puebla_con_datos.plot(column = 'Ganador');
# ## palewire's
# In[17]:
base = alt.Chart(puebla_con_datos).mark_geoshape(
stroke='black',
strokeWidth=0.1
).encode().properties(
width=600,
height=800
)
# In[18]:
geoshape = alt.Chart(puebla_con_datos).mark_geoshape(
fill='lightgray',
stroke='black'
)
# In[19]:
outcome = geoshape.encode(
color=alt.Color(
"Ganador:N",
title="Ganador"
),
tooltip = ['Enrique Cárdenas Sánchez:Q', 'Alberto Jiménez Merino:Q', 'Miguel Barbosa Huerta:Q', 'Votos nulos:Q', 'Total de votos:Q', 'Ganador:N', '% del ganador:Q']
)
# In[20]:
ganador_por_municipio = (base + outcome).properties(title="Ganador por municipio", ).configure_view(
strokeWidth=0,
).configure_title(fontSize = 36, align = 'left', anchor = 'start')
ganador_por_municipio
# ## palewire 2
# In[21]:
secciones = gpd.read_file(DATOS_EXTERNOS / 'mapas_puebla'/'SECCION.shp')
secciones.head()
# In[22]:
secciones_datos = pd.read_csv(DATOS_EXTERNOS / 'elecciones_puebla_por_seccion_2019.csv')
secciones_datos.head()
# In[23]:
secciones_con_datos = secciones.merge(secciones_datos, left_on = 'seccion', right_on = 'SECCION')
# In[24]:
secciones_con_datos.head(2).T
# In[25]:
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"
})
# In[26]:
secciones_con_datos['Ganador'] = secciones_con_datos['Ganador'].str.replace("_", ' ').str.title()
# In[27]:
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', 'abst_porc', 'Ganador','% del ganador', 'CVE_GANADOR', 'geometry',]]
# In[28]:
secciones_con_datos = secciones_con_datos.to_crs(epsg=4326)
# In[29]:
# centroides
secciones_con_datos['centroide_x'] = secciones_con_datos['geometry'].centroid.x
secciones_con_datos['centroide_y'] = secciones_con_datos['geometry'].centroid.y
# In[30]:
secciones_con_datos.plot(column = 'Ganador');
# In[31]:
base_secciones = alt.Chart(secciones_con_datos).mark_geoshape(
stroke='black',
strokeWidth=0.1
).encode().properties(
width=600,
height=800
)
# In[32]:
geoshape_secciones = alt.Chart(secciones_con_datos).mark_geoshape(
fill='lightgray',
stroke='black'
)
# In[33]:
turnout = 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",
),
color = alt.Color('Ganador:N'),
tooltip = ['Enrique Cárdenas Sánchez', 'Alberto Jiménez Merino', 'Miguel Barbosa Huerta', 'Votos nulos', 'Total de votos', 'Ganador', '% del ganador']
)
# In[34]:
participacion = (base_secciones + turnout).properties(title="Participación").configure_view(
strokeWidth=0
).configure_title(fontSize = 36, align = 'left', anchor = 'start')
participacion
# In[35]:
participacion.save("../reportes/figuras/chart.html")