O que se passou nas mais de 4000 sessões de discussão do parlamento Português que ocorreram desde 1976? Neste notebook vamos tentar visualizar o que se passou da maneira mais simples - contando palavras, e fazendo gráficos.
Para obter os textos de todas as sessões usaremos o demo.cratica.org, onde podemos aceder facilmente a todas as sessões do parlamento de 1976 a 2015. Depois com um pouco de python, pandas e matplotlib vamos analisar o que se passou.
Para executar estes notebook será necessário descarregar e abrir com o Jupiter Notebooks (a distribuição Anaconda faz com que instalar todas as ferramentas necessárias seja fácil - https://www.continuum.io/downloads)
Vamos tentar representar que distritos de Portugal são mais referenciados no Parlamento.
Para isso vamos usar dois pacotes de python muito úteis e faceis de usar: geopy para obter as localizações das cidades, e Basemap para a representação.
Começemos por localizar todas os distritos/cidades. De notar que a função geocode aceita moradas e retorna as coordenadas de GPS. (!!)
In [1]:
# capitais de distrito, encontra latitude e longitude
import geopy
from geopy.geocoders import Nominatim
geolocator = Nominatim()
long = []
lat = []
cities = ['Açores','Madeira','Aveiro','Beja','Braga','Bragança','Castelo Branco','Coimbra','Évora','Faro','Guarda','Leiria','Lisboa','Portalegre','Porto','Santarém','Setúbal','Viana do Castelo','Vila Real','Viseu']
#cities = ['Aveiro','Braga','Porto','Lisboa']
for city in cities:
location = geolocator.geocode(city+',Portugal')
print(city + ':' + location.address + ' ('+str(location.longitude)+','+str(location.latitude)+')')
long.append(location.longitude)
lat.append(location.latitude)
De um modo similar ao que fizemos antes, vamos contar todas as ocorrencias em todas as sessões do nome de cada cidade
In [7]:
%matplotlib inline
import pylab
import matplotlib
import pandas
import numpy
dateparse = lambda x: pandas.datetime.strptime(x, '%Y-%m-%d')
sessoes = pandas.read_csv('sessoes_democratica_org.csv',index_col=0,parse_dates=['data'], date_parser=dateparse)
from functools import reduce
# retira falsas ocorrencias de 'guarda' e 'porto'
def conta_palavras(texto,palavra):
return texto.replace('aeroporto','').replace('lopes porto','').replace('guardar','').replace('guardas','').replace('guardado','').replace('aguarda','').replace('vanguarda','').replace('salvaguarda','').replace('guarda nacional','').replace('guarda civil','').count(palavra.lower())
def conta_ocorrencias(palavra):
return numpy.sum(sessoes['sessao'].map(lambda texto: conta_palavras(texto,palavra)))
print('A contar...')
contagens = []
for cidade in cities:
contagem = conta_ocorrencias(cidade)
print(cidade +' '+str(contagem))
contagens.append(contagem)
Agora representamos o mapa, e depois desenhamos circulos para cada cidade, de cor e tamanho variável consoante o número de menções.
Para representar os distritos Portugueses necessitamos de um dataset com os 'shapefiles' destes: obtem-o em http://www.gadm.org/country Alternativamente o script tambem executa sem a linha 'shp_info = ...'.
In [8]:
from mpl_toolkits.basemap import Basemap
pylab.figure(figsize=(20,10))
#map = Basemap(projection='merc',lat_0=40,lon_0=0,resolution='l',llcrnrlon=-10.5, llcrnrlat=36,urcrnrlon=-5.5, urcrnrlat=43) # PT continental
map = Basemap(projection='merc',lat_0=40,lon_0=0,resolution='l',llcrnrlon=-32, llcrnrlat=31,urcrnrlon=-5.5, urcrnrlat=43)
#shp_info = map.readshapefile('PRT_adm0','',drawbounds=True)#país
shp_info = map.readshapefile('PRT_adm1','',drawbounds=True)#distritos
#shp_info = map.readshapefile('PRT_adm2','',drawbounds=True)#concelhos
#shp_info = map.readshapefile('PRT_adm3','',drawbounds=True)#freguesias
map.drawcoastlines(linewidth=0.25)
map.fillcontinents(color='#00ff00',lake_color='aqua')
map.drawmapboundary(fill_color='aqua')
contagens = numpy.array(contagens)
size = 10+1000*contagens/max(contagens)
color = contagens/max(contagens)
x,y = map(long, lat)
map.scatter(x, y,s=size, c=-color, zorder=10, cmap=pylab.autumn())
pylab.show()
Vamos claramente que a Madeira, Lisboa e Porto são as regiões mais discutidas. De seguida Açores, Braga e Coimbra. Já tinhamos estes dados na tabela acima, mas agora é visual. De notar que as contagens de 'Porto' podem estar inflacionadas, pois a palavra é usada em vários contextos diferentes dificeis de isolar/rejeitar.
Fica como exercício contar e representar os concelhos de cada distrito!
In [ ]:
In [ ]: