vllc / .ipynb_checkpoints /app-checkpoint.py
gauss314
updates
2dce673
import streamlit as st
import pandas as pd
import plotly.express as px
renuevan = {'BUENOS AIRES': 35,
'CATAMARCA': 2,
'CHACO': 3,
'CHUBUT': 3,
'CIUDAD DE BUENOS AIRES': 12,
'CORDOBA': 9,
'CORRIENTES': 4,
'ENTRE RIOS': 4,
'FORMOSA': 3,
'JUJUY': 3,
'LA PAMPA': 2,
'LA RIOJA': 3,
'MENDOZA': 5,
'MISIONES': 4,
'NEUQUEN': 2,
'RIO NEGRO': 3,
'SALTA': 4,
'SAN JUAN': 3,
'SAN LUIS': 2,
'SANTA CRUZ': 2,
'SANTA FE': 10,
'SANTIAGO DEL ESTERO': 4,
'TIERRA DEL FUEGO': 3,
'TUCUMAN': 5
}
senado_2023 = ['BUENOS AIRES','FORMOSA','JUJUY','LA RIOJA','MISIONES','SAN JUAN','SAN LUIS','SANTA CRUZ']
paso = {'BUENOS AIRES': {'LLA': 1921758, 'JxC': 2537178 , 'UP':2741730, 'FIT':292039 },
'CATAMARCA': {'LLA': 29047, 'JxC': 42087 , 'UP':88614 },
'CHACO': {'LLA': 157223, 'JxC': 155806 , 'UP':204092 },
'CHUBUT': {'LLA': 114205, 'JxC': 71065 , 'UP':70919 },
'CIUDAD DE BUENOS AIRES': {'LLA': 299363, 'JxC': 796779 , 'UP':383654 },
'CORDOBA': {'LLA': 669268, 'JxC': 510671 , 'UP':161899, 'Provincial':548706 },
'CORRIENTES': {'LLA': 156173, 'JxC': 197499 , 'UP':166841 },
'ENTRE RIOS': {'LLA': 123104, 'JxC': 205869 , 'UP':226301 },
'FORMOSA': {'LLA': 72988, 'JxC': 65889 , 'UP':139031 },
'JUJUY': {'LLA': 136664, 'JxC': 94390 , 'UP':92179 },
'LA PAMPA': {'LLA': 0, 'JxC': 57816 , 'UP':53407 },
'LA RIOJA': {'LLA': 62951, 'JxC': 37858 , 'UP':57626 },
'MENDOZA': {'LLA': 438204, 'JxC': 273008 , 'UP':164284 },
'MISIONES': {'LLA': 0, 'JxC': 115551 , 'UP':143243 },
'NEUQUEN': {'LLA': 128837, 'JxC': 81859 , 'UP':62008 },
'RIO NEGRO': {'LLA': 0, 'JxC': 75224 , 'UP':87433, 'Provincial':131699 },
'SALTA': {'LLA': 290647, 'JxC': 105864 , 'UP':143746 },
'SAN JUAN': {'LLA': 125947, 'JxC': 118423 , 'UP':127218 },
'SAN LUIS': {'LLA': 119656, 'JxC': 66142 , 'UP':46949 },
'SANTA CRUZ': {'LLA': 0, 'JxC': 21594 , 'UP':31494, 'Provincial':8188 },
'SANTA FE': {'LLA': 623875, 'JxC': 555573 , 'UP':360754, 'Provincial': 61129 },
'SANTIAGO DEL ESTERO': {'LLA': 116052, 'JxC': 23209 , 'UP':254825, 'Provincial':22613 },
'TIERRA DEL FUEGO': {'LLA': 29803, 'JxC': 17937 , 'UP':21386, 'Provincial':8521 },
'TUCUMAN': {'LLA': 252489, 'JxC': 212800 , 'UP':295149 }
}
def dhont(results, bancas):
listas, votos = list(results.keys()), list(results.values())
df = pd.DataFrame([[val/i for i in range(1, bancas+1)] for val in votos], index=listas)
df = df.reset_index().rename(columns={"index": "lista"})
r = df.melt(id_vars=["lista"]).sort_values('value', ascending=False).head(bancas)
return r.groupby('lista').size().to_dict()
def dhont_senado(results):
df = pd.DataFrame([results], index=['votos']).T
partidos = list(df.sort_values('votos', ascending=False).head(2).index)
return {partidos[0]:2, partidos[1]:1}
def calcular_resultados(paso, renuevan, ausentes, migracion, ausentes_porcentaje):
migracion_porcentajes = {
lista: {destino: voto/sum(votos.values()) for destino, voto in votos.items()}
for lista, votos in migracion.items()
}
r = []
flow = {}
total = {}
r_senado = []
for pcia in list(paso.keys()):
results, bancas = paso[pcia], renuevan[pcia]
coef_ausentes = [x/sum(ausentes.values()) for x in ausentes.values()]
flow['JxC'] = results['JxC'] * (migracion_porcentajes['JxC']['JxC'] - 1)
flow['JxC'] += results['LLA'] * migracion_porcentajes['LLA']['JxC']
flow['JxC'] += results['UP'] * migracion_porcentajes['UP']['JxC']
flow['LLA'] = results['LLA'] * (migracion_porcentajes['LLA']['LLA'] - 1)
flow['LLA'] += results['JxC'] * migracion_porcentajes['JxC']['LLA']
flow['LLA'] += results['UP'] * migracion_porcentajes['UP']['LLA']
flow['UP'] = results['UP'] * (migracion_porcentajes['UP']['UP'] - 1)
flow['UP'] += results['JxC'] * migracion_porcentajes['JxC']['UP']
flow['UP'] += results['LLA'] * migracion_porcentajes['LLA']['UP']
for i, partido in enumerate(ausentes.keys()):
results[partido] = results[partido] + sum(results.values()) * ausentes_porcentaje * coef_ausentes[i]
results[partido] = results[partido] + flow[partido]
total[pcia] = results
if pcia in senado_2023:
r_senado.append(dhont_senado(results))
r.append(dhont(results, bancas))
return r, total, r_senado
st.sidebar.title("Simulacion Ausentes")
ausentes_porcentaje = 0.12 # porcentaje de los que ya votaron en paso. Ej 0.1 es 70%=>77%
boundary_lla_jxc, boundary_jxc_up = st.sidebar.slider("Votos de ausentes en Paso en genrales (LLA/JxC/UP)", 0, 100, (33, 67))
ausentes_lla = boundary_lla_jxc
ausentes_jxc = boundary_jxc_up - boundary_lla_jxc
ausentes_up = 100 - boundary_jxc_up
st.sidebar.text(f"% Ausentes por LLA: {ausentes_lla}%")
st.sidebar.text(f"% Ausentes por JxC: {ausentes_jxc}%")
st.sidebar.text(f"% Ausentes por UP: {ausentes_up}%")
st.sidebar.markdown("\n\n", unsafe_allow_html=True)
ausentes = {
'LLA': ausentes_lla,
'JxC': ausentes_jxc,
'UP': ausentes_up
}
st.sidebar.title("Simulacion cambio de votos")
migracion = {
'JxC': {
'LLA': st.sidebar.slider("% Votos JxC PASO => a LLA General", 0, 50, 0),
'UP': st.sidebar.slider("% Votos JxC PASO => a UP General", 0, 50, 0),
},
'LLA': {
'JxC': st.sidebar.slider("% Votos LLA PASO => a JxC General", 0, 50, 0),
'UP': st.sidebar.slider("% Votos LLA PASO => a UP General", 0, 50, 0),
},
'UP': {
'LLA': st.sidebar.slider("% Votos UP PASO => a LLA General", 0, 50, 0),
'JxC': st.sidebar.slider("% Votos UP PASO => a JxC General", 0, 50, 0),
}
}
for partido in ['JxC', 'LLA', 'UP']:
migracion[partido][partido] = 100 - sum([migracion[partido][otro_partido] for otro_partido in ['JxC', 'LLA', 'UP'] if otro_partido != partido])
r, total, r_senado = calcular_resultados(paso, renuevan, ausentes, migracion, ausentes_porcentaje=0.1)
st.subheader("Diputados por fuerza política")
df_bancas = pd.DataFrame(data=r, index=paso.keys()).fillna(0).astype(int)
df_sum = df_bancas.sum().to_frame(name='Nuevos')
df_sum['Salientes'] = {'FIT':0, 'JxC':49, 'LLA':0, 'UP':76, 'Prov':5}
df_sum['Netos'] = df_sum['Nuevos'] - df_sum['Salientes']
df_sum['Conserva'] = {'FIT':4, 'JxC':61, 'LLA':3, 'UP':50, 'Prov':7}
df_sum['Nueva comp'] = df_sum['Conserva'] + df_sum['Nuevos']
df_sum = df_sum.loc[['JxC','LLA','UP']]
df_otros = pd.DataFrame({
'Nuevos': [130 - df_sum['Nuevos'].sum()],
'Salientes': [126 - df_sum['Salientes'].sum()],
'Netos': [0],
'Conserva': [ 126 - df_sum['Conserva'].sum()],
'Nueva comp': [256 - df_sum['Nueva comp'].sum()]
}, index=['Otros'])
df_sum = pd.concat([df_sum, df_otros])
df_sum['Netos'] = (df_sum['Nuevos'] - df_sum['Salientes']).astype(int)
st.write(df_sum)
data = []
for province, seats in renuevan.items():
party_max = max(paso[province], key=paso[province].get)
data.append({
'Provincia': province,
'Bancas': seats,
'Partido Dominante': party_max,
'Votos': paso[province][party_max]
})
df = pd.DataFrame(data)
colors = {
'LLA': '#9370DB',
'JxC': '#FFD700',
'UP': '#1E90FF'
}
df['Bancas LLA'] = df['Provincia'].apply(lambda x: df_bancas.loc[x, 'LLA'] if 'LLA' in df_bancas.columns else 0)
df['Bancas JxC'] = df['Provincia'].apply(lambda x: df_bancas.loc[x, 'JxC'] if 'JxC' in df_bancas.columns else 0)
df['Bancas UP'] = df['Provincia'].apply(lambda x: df_bancas.loc[x, 'UP'] if 'UP' in df_bancas.columns else 0)
fig = px.treemap(
df,
path=['Provincia'],
values='Bancas',
color='Partido Dominante',
color_discrete_map=colors,
title="Nuevas bancas Diputados por provincia",
custom_data=['Bancas LLA', 'Bancas JxC', 'Bancas UP']
)
fig.update_traces(
hovertemplate="<b>%{label}</b><br>Bancas Totales: %{value}<br>Bancas LLA: %{customdata[0]}<br>Bancas JxC: %{customdata[1]}<br>Bancas UP: %{customdata[2]}"
)
st.plotly_chart(fig)
st.subheader("Diputados nuevos por provincia")
st.dataframe(df_bancas, height=900, use_container_width=True)
st.subheader("Senadores por Fuerza politica")
df_bancas_senado = pd.DataFrame(data=r_senado, index=senado_2023).fillna(0).astype(int)
df_sum_senado = df_bancas_senado.sum().to_frame(name='Nuevos')
df_sum_senado['Salientes'] = {'JxC':11, 'LLA':0, 'UP':10, 'Provincial':2}
df_sum_senado['Netos'] = df_sum_senado['Nuevos'] - df_sum_senado['Salientes']
df_sum_senado['Conserva'] = {'JxC':22, 'LLA':0, 'UP':23, 'Provincial':6}
df_sum_senado['Nueva comp'] = df_sum_senado['Conserva'] + df_sum_senado['Nuevos']
st.write(df_sum_senado)
st.subheader("Senadores Nuevos por Provincia")
df_bancas_senado = pd.DataFrame(data=r_senado, index=senado_2023).fillna(0).astype(int)
st.write(df_bancas_senado)
st.subheader("Votos por fuerza política por provincia (Diputados)")
df_votos = pd.DataFrame(data=total).T[['LLA','JxC','UP']].astype(int)
st.dataframe(df_votos, height=900, use_container_width=True)
import plotly.graph_objects as go
st.subheader("% Votos por fuerza política total Nacional (Diputados)")
st.text("Calculo de % sobre 3 fuerzas mayoritarias")
p_votos = df_votos.sum()
p_votos.columns = ['Porcentaje']
fig = go.Figure(data=[go.Pie(labels=p_votos.index,
values=p_votos,
hole=.3,
textinfo='percent+label',
marker=dict(colors=[colors[key] for key in p_votos.index]))])
fig.update_layout(title_text='')
st.plotly_chart(fig)