In [1]:
import difflib
import requests
import pandas as pd
from bs4 import BeautifulSoup
In [19]:
# Join de todos los otros años
csvs = ['../viajes_2012.csv', '../viajes_2015.csv', '../viajes_2016.csv', '../viajes_2017.csv']
for cnt, csv in enumerate(csvs):
if cnt == 0:
df = pd.read_csv(csv)
fecha = csv.split('_')[1].split('.csv')[0]
df['Año'] = [fecha for _ in range(df.shape[0])]
else:
df_temp = pd.read_csv(csv)
fecha = csv.split('_')[1].split('.csv')[0]
df_temp['Año'] = [fecha for _ in range(df_temp.shape[0])]
df = pd.concat([df, df_temp], ignore_index=True)
df.head()
Out[19]:
In [29]:
def search_block(ele):
df_filter = df[df['Autoridad'] == ele]
amount_blocks = len(set(df_filter['Bloque']))
if amount_blocks == 1:
return df_filter['Bloque'].iloc[0]
elif amount_blocks == 0:
return "No encontrado"
else:
return False
block = df_2013['Autoridad'].apply(search_block)
print("Senadores sin bloque en el 2013: {0}. Senadores encontrados: {1}".format(df_2013.shape[0],
block[block == "No encontrado"].shape[0]))
Los bloques faltantes los vamos a obtener del sitio oficial del Senado. En particular, el sitio tiene este lugar que nos permite buscar por el nombre del senador.
Problemas:
Lo que vamos a hacer, es una pequeña "API" para utilizar esta herramienta de busquede de los senadores
In [12]:
# Header para el request para parecer un usuario "comun"
headers = {
'Accept-Language': 'en-US,en;q=0.5',
'Accept-Encoding': 'gzip, deflate',
'User-Agent': ('Mozilla/5.0 (X11; Linux x86_64; rv:45.0)'
' Gecko/20100101 Firefox/45.0'),
}
base_url = "http://www.senado.gov.ar/senadores/Historico/PeriodoResultado"
# Session for the delicious cookies
session = requests.session()
session.headers = headers
# Get the ID of each senador
response = session.get(base_url)
soup = BeautifulSoup(response.text, 'html.parser')
senadors_id = {}
select = soup.find('select', {'id': 'senado_senadoresbundle_busquedahistoricostype_senador'})
for option in select:
if option.attrs['value']:
name = ' '.join(option.text.replace(',', ' ').split()).lower()
senadors_id[name] = option.attrs['value']
In [28]:
name = ' '.join('MARINO, Juan Carlos'.lower().replace(',', ' ').split())
if name in senadors_id.keys():
# Senador encontrado
senador_id = senadors_id[name]
print(senador_id)
else:
print(difflib.get_close_matches(name, senadors_id.keys()))
In [57]:
def get_block(row):
name = ' '.join(row['Autoridad'].lower().replace(',', ' ').split())
if name in senadors_id.keys():
# Senador encontrado
senador_id = senadors_id[name]
r = session.post(base_url, {'senado_senadoresbundle_busquedahistoricostype[senador]': senador_id})
d = pd.read_html(r.text)[0]
# Paso las fehcas a datetime
legal_split = d['Período Legal'].str.split('al', expand=True)
d['Período Legal Comienzo'] = legal_split[0]
d['Período Legal Fin'] = legal_split[1]
d['Período Legal Comienzo'] = pd.to_datetime(d['Período Legal Comienzo'], infer_datetime_format=True)
d['Período Legal Fin'] = pd.to_datetime(d['Período Legal Fin'], infer_datetime_format=True)
# Busco la fecha de interes
date = pd.to_datetime(row['Fecha_salida'], infer_datetime_format=True)
block = d[(d['Período Legal Comienzo'] < date) & (date < d['Período Legal Fin'])]['Partido Político']
return block
else:
return (difflib.get_close_matches(name, senadors_id.keys()))
df_2013[:5].apply(get_block, axis=1)
In [ ]:
In [54]:
d
Out[54]:
In [ ]: