# 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)

"""
Explanation: Deputado Histogramado
expressao.xyz/deputado/
Como processar as sessões do parlamento Português
Índice

Reunír o dataset
Contando as palavras mais comuns
Fazendo histogramas
Representações geograficas
Simplificar o dataset e exportar para o expressa.xyz/deputado/

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)
Parte 4 - Regionalização
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. (!!)
End of explanation
"""


%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)



"""
Explanation: De um modo similar ao que fizemos antes, vamos contar todas as ocorrencias em todas as sessões do nome de cada cidade
End of explanation
"""


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()

"""
Explanation: 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 = ...'.
End of explanation
"""


