{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Analise de intervencoes do parlamento" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.Recolha e formatação de dados" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Com base nos dados abertos disponibilizados no site da assembleia da republica, tive a ideia de investigar as varias [intervencoes](http://www.parlamento.pt/Cidadania/Paginas/DAIntervencoes.aspx) correspondentes a ultima legislatura. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Começamos por importar alguns modulos importantes: " ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [], "source": [ "import json\n", "import nltk\n", "import pandas as pd\n", "from pprint import pprint\n", "from collections import Counter\n", "from __future__ import division\n", "import matplotlib.pyplot as plt\n", "from wordcloud import WordCloud\n", "from nltk.stem import SnowballStemmer\n", "plt.style.use('ggplot')\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Após downloadar os dados no formato json, transferimos para um dictionario chamado `interventions`." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "O dictionario tem 11072 intervencoes.\n" ] } ], "source": [ "with open('data/IntervencoesXIII.json') as data_file: \n", " data = json.load(data_file)\n", " \n", "interventions = data['ArrayOfPt_gov_ar_objectos_intervencoes_DadosPesquisaIntervencoesOut']['pt_gov_ar_objectos_intervencoes_DadosPesquisaIntervencoesOut']\n", "print 'O dictionario tem {} intervencoes.'.format(len(interventions))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vamos fazer um print da primeira intervenção:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{u'actividadeId': u'102944',\n", " u'actividadesRelacionadas': {u'id': u'102944', u'tipo': u'Disc. Iniciativas'},\n", " u'dataReuniaoPlenaria': u'2016-07-20',\n", " u'deputados': {u'GP': u'PS',\n", " u'idCadastro': u'1600',\n", " u'nome': u'JAMILA MADEIRA'},\n", " u'faseSessao': u'POD',\n", " u'idDebate': u'30572',\n", " u'iniciativas': {u'pt_gov_ar_objectos_intervencoes_IniciativasOut': {u'fase': u'Vota\\xe7\\xe3o Delibera\\xe7\\xe3o',\n", " u'id': u'40581',\n", " u'tipo': u'Projeto de Resolu\\xe7\\xe3o'}},\n", " u'legislatura': u'XIII',\n", " u'publicacao': {u'pt_gov_ar_objectos_PublicacoesOut': {u'URLDiario': u'http://debates.parlamento.pt/catalogo/r3/dar/01/13/01/089/2016-07-21/115?pgs=115&org=PLC',\n", " u'idAct': None,\n", " u'idDeb': None,\n", " u'idInt': u'202951',\n", " u'idPag': None,\n", " u'pag': {u'string': u'115-115'},\n", " u'pubLeg': u'XIII',\n", " u'pubNr': u'89',\n", " u'pubSL': u'1',\n", " u'pubTipo': u'DAR I s\\xe9rie',\n", " u'pubTp': u'D',\n", " u'pubdt': u'2016-07-21',\n", " u'supl': u'.'}},\n", " u'qualidade': u'Deputada',\n", " u'sessao': u'1',\n", " u'sumario': u'Recomenda ao Governo a elabora\\xe7\\xe3o de levantamento sobre a utiliza\\xe7\\xe3o de ve\\xedculos de trac\\xe7\\xe3o animal e consequente regulamenta\\xe7\\xe3o',\n", " u'tipoIntervencao': u'Declara\\xe7\\xe3o de voto'}\n" ] } ], "source": [ "pprint(interventions[0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "O formato das intervenções variam muito. Algumas têm 3 campos, outras 12. No entanto, os seguintes campos vão ser os essenciais: " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "must_have_fields = ['deputados', 'dataReuniaoPlenaria', 'sumario']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Damos um nome as varias colunas para a nossa tabela de dados: " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "pandas_data = [['id_debate', 'date', 'phase', 'speaker', 'political_party', 'summary_text', 'intervention_type']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Adicionamos as intervenções a nossa \"pandas dataframe\"." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# initialize counters\n", "total = 0\n", "retrieved = 0\n", "\n", "# loop over list\n", "for intervention in interventions:\n", " total += 1\n", " if all(x in intervention.keys() for x in must_have_fields):\n", " # define fields\n", " debate_id = intervention['idDebate']\n", " date = intervention['dataReuniaoPlenaria']\n", " phase = intervention['faseSessao']\n", " speaker = intervention['deputados']['nome']\n", " political_party = intervention['deputados']['GP']\n", " summary_text = intervention['sumario']\n", " intervention_type_text = intervention['tipoIntervencao']\n", " \n", " # add to pandas list\n", " pandas_data += [[debate_id, date, phase, speaker, political_party, summary_text, intervention_type_text]] \n", " retrieved += 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Com base neste criterio de \"tem de ter estes campos\", acabamos por nao perder muito.." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Intervencoes parsadas: 11072\n", "Intervencoes que foram aceites: 10593\n", "Perdemos 0.96%.\n" ] } ], "source": [ "print 'Intervencoes parsadas: ', total\n", "print 'Intervencoes que foram aceites: ', retrieved\n", "print 'Perdemos {}%.'.format(round(retrieved/total,2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finalment podemos criar um pandas dataframe com todas as intervenções." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "assembleia = pd.DataFrame(pandas_data[1:], columns=pandas_data[0])\n", "assembleia = assembleia.drop_duplicates() # limpamos qualquer intervenção duplicada. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2.Analise preliminar" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vamos ver o que obtemos neste dataframe: " ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", " | id_debate | \n", "date | \n", "phase | \n", "speaker | \n", "political_party | \n", "summary_text | \n", "intervention_type | \n", "
---|---|---|---|---|---|---|---|
0 | \n", "30572 | \n", "2016-07-20 | \n", "POD | \n", "JAMILA MADEIRA | \n", "PS | \n", "Recomenda ao Governo a elaboração de levantame... | \n", "Declaração de voto | \n", "
1 | \n", "30571 | \n", "2016-07-20 | \n", "POD | \n", "JOÃO OLIVEIRA | \n", "PCP | \n", "Regula o acesso à gestação de substituição nos... | \n", "Declaração de voto | \n", "
2 | \n", "30592 | \n", "2016-07-20 | \n", "POD | \n", "LUÍS MONTENEGRO | \n", "PSD | \n", "Cria um regime de reembolso de impostos sobre ... | \n", "Declaração de voto | \n", "
3 | \n", "30591 | \n", "2016-07-20 | \n", "POD | \n", "ANA MESQUITA | \n", "PCP | \n", "Terceira alteração à Lei n.º 54/2005, de 15 de... | \n", "Declaração de voto | \n", "
4 | \n", "30590 | \n", "2016-07-20 | \n", "POD | \n", "ANA MESQUITA | \n", "PCP | \n", "Altera a Lei n.º 54/2005, de 15 de novembro, q... | \n", "Declaração de voto | \n", "