radar-parlamentar/radar

View on GitHub
radar_parlamentar/importadores/camara_genero.py

Summary

Maintainability
A
3 hrs
Test Coverage
# Copyright (C) 2013, Diego Rabatone
#
# This file is part of Radar Parlamentar.
#
# Radar Parlamentar is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Radar Parlamentar is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Radar Parlamentar.  If not, see <http://www.gnu.org/licenses/>.

"""módulo que cuida da importação dos dados da Câmara dos Deputados"""


import json
import csv
import logging

logger = logging.getLogger("radar")


HEADERS = [
    "codProposicao", "txtProposicao", "txtTipoProposicao", "txtSigla",
    "numNumero", "numAno", "datApresentacao", "codTipoProposicao",
    "codOrgaoOrigem", "txtEmenta", "txtExplicacaoEmenta", "txtIndexacao",
    "codRegime", "txtRegime", "codApreciacao", "txtApreciacao",
    "txtOrgaoOrigem", "txtNomeOrgaoOrigem", "indGenero", "txtNomeAutor",
    "txtSiglaUF", "txtSiglaPartido", "codPartido", "qtdAutores",
    "datDespacho", "txtDespacho", "codEstadoProposicao",
    "txtEstadoProposicao", "codOrgaoEstado", "txtSiglaOrgaoEstado",
    "qtdOrgaosComEstado", "codProposicaoPrincipal", "txtProposicaoPrincipal",
    "ideCadastro", "nomeProposicaoOrigem"]

PARTIDOS = {}
DIC_TERMOS = {}
PALAVRAS_MAIS_MAIS = []
DESCARTADAS = ['de', 'do', 'da', 'dos', 'das', 'e', 'para', 'com', 'a', 'A']
FILTRADAS = [
    'lei', 'normas', 'obrigatoriedade', 'cria\u00e7\u00e3o', 'nacional',
    'prazo', 'fixa\u00e7\u00e3o', 'proibi\u00e7\u00e3o',
    'especial', 'pessoa', 'utiliza\u00e7\u00e3o', 'atividade', 'valor',
    'institui\u00e7\u00e3o', 'civil', 'estabelecimento', 'registro']
LISTA_BASE_PARTIDOS = [
    'PCB', 'PSD', 'UDN', 'SEM PARTIDO', 'PP', 'PR', 'PTB', 'PRE', 'PRF', 'PST',
    'UPF', 'AL', 'FUG', 'PSN', 'PSP', 'PRP', 'PTN', 'PDC', 'PNI', 'PL', 'PPR',
    'ARENA', 'PTR', 'PSB', 'PRR', 'PSC', 'PRD', 'LASP', 'PRM', 'PRT', 'PPS',
    'PSR', 'PS', 'PDS', 'MTR', 'MDB', 'PMDB', 'PSDB', 'PFL', 'PT', 'PTdoB',
    'PDT', 'PJ', 'PCdoB', 'PC', 'PV', 'PRN', 'PPB', 'PSDC', 'PRONA', 'DEM',
    'PSOL', 'PMN', 'PSL', 'PRS', 'PRB', 'PE', 'PRC', 'PRL', 'UDB', 'PLC',
    'LEC', 'PD', 'ED', 'PRPa', 'PED', 'PNS', 'PPA', 'PNA', 'PSTU', 'PTC',
    'PAN', 'PHS', 'PRTB']

matrix = {}


def converte_csv_para_json(nome_arquivo_entrada):
    sep = b";"
    file = open(nome_arquivo_entrada + '.csv', 'r')
    reader = csv.DictReader(file, delimiter=sep, fieldnames=HEADERS)
    out = json.loads(json.dumps([row for row in reader], indent=4))
    return out


def _null_to_none(proposicao):
    for atributo in list(proposicao.keys()):
        if proposicao[atributo] == "NULL":
            proposicao[atributo] = None
    return proposicao


def multiple_null_remove(lista_proposicoes):
    nova_lista = []
    for proposicao in lista_proposicoes:
        nova_lista.append(_null_to_none(proposicao))
    return nova_lista


def proposicoes_indexadas(lista_proposicoes):
    indexados = []
    for proposicao in lista_proposicoes:
        if proposicao['txtIndexacao'] and proposicao['txtSiglaPartido']:
            if proposicao['txtSiglaPartido'].strip() in LISTA_BASE_PARTIDOS:
                indexados.append(proposicao)
    return indexados


def parseia_indexacoes(indexacao):
    indexacao1 = [termo.strip()
                  for termo in indexacao.replace('\n', '').replace('.', '').
                  replace('_', '').split(',')]
    indexacao2 = []
    for termo in indexacao1:
        termo = termo.split(' ')
        for termo2 in termo:
            if not termo2 == "":
                indexacao2.append(termo2.lower())
    return indexacao2


def parsear_indexacoes_de_proposicoes(lista_proposicoes):
    nova_lista_proposicoes = []
    for proposicao in lista_proposicoes:
        proposicao['txtIndexacao'] = parseia_indexacoes(
            proposicao['txtIndexacao'])
        nova_lista_proposicoes.append(proposicao)
        if proposicao['txtSiglaPartido']:
            soma_palavras_no_partido(
                proposicao['txtSiglaPartido'], proposicao['txtIndexacao'])
    return nova_lista_proposicoes


def partidos_das_proposicoes(lista_proposicoes):
    for proposicao in lista_proposicoes:
        if proposicao['txtSiglaPartido']:
            partido = proposicao['txtSiglaPartido'].strip()
            if partido not in PARTIDOS:
                PARTIDOS[partido] = {}


def contabiliza_termos_geral(lista_indexadas):
    for proposicao in lista_indexadas:
        for termo in proposicao['txtIndexacao']:
            if termo not in DESCARTADAS:
                if termo in DIC_TERMOS:
                    DIC_TERMOS[termo] += 1
                else:
                    DIC_TERMOS[termo] = 1


def pega_maiores_palavras(dic_palavras):
    palavras = sorted(dic_palavras, key=lambda k: -dic_palavras[k])
    export_json(palavras, "lista_50_mais")
    global PALAVRAS_MAIS_MAIS
    PALAVRAS_MAIS_MAIS = palavras[0:50]
    for termo in FILTRADAS:
        PALAVRAS_MAIS_MAIS.remove(termo)


def ordena_palavras_partido():
    for partido in PARTIDOS:
        palavras_partido = PARTIDOS[partido]
        palavras = sorted(palavras_partido, key=lambda k: -palavras_partido[k])
        PARTIDOS[partido] = {}
        for termo in palavras:
            PARTIDOS[partido][termo] = palavras_partido[termo]


def soma_palavras_no_partido(partido, lista_palavras):
    for palavra in lista_palavras:
        if palavra not in PARTIDOS[partido.strip()]:
            PARTIDOS[partido.strip()][palavra] = 1
        else:
            PARTIDOS[partido.strip()][palavra] += 1


def export_json(data, filename):
    with open(filename, 'w') as outFile:
        outFile.write(json.dumps(data, indent=4))


def jsonMatrix_gera_partidos():
    i = 0
    lista_partidos = []
    for partido in PARTIDOS:
        lista_partidos.append({'name': partido, 'group': 1, 'id': i})
        i += 1
    global matrix
    matrix['partidos'] = lista_partidos


def jsonMatrix_gera_termos_mais_mais():
    i = 0
    lista_termos = []
    global matrix
    matrix['termos'] = []
    for termo in PALAVRAS_MAIS_MAIS:
        print((termo, i))
        lista_termos.append({'name': termo, 'group': 1, 'id': i})
        i += 1
    matrix['termos'] = lista_termos
    logger.info(matrix['termos'])


def jsonMatrix_gera_links_partidos_termos():
    global matrix
    matrix['links'] = []
    for p in range(len(matrix['partidos'])):
        partidoNome = matrix['partidos'][p]['name']
        for t in range(len(matrix['termos'])):
            termoNome = matrix['termos'][t]['name']
            if termoNome in PARTIDOS[partidoNome]:
                matrix['links'].append(
                    {'source': t, 'target': p, 'value': PARTIDOS[
                     partidoNome][termoNome]})


def principal(fonte=None):
    if not fonte:
        fonte = 'pl'
    lista_proposicoes = converte_csv_para_json(fonte)
    lista_proposicoes = multiple_null_remove(lista_proposicoes)
    lista_proposicoes = proposicoes_indexadas(lista_proposicoes)
    partidos_das_proposicoes(lista_proposicoes)
    lista_proposicoes = parsear_indexacoes_de_proposicoes(lista_proposicoes)
    contabiliza_termos_geral(lista_proposicoes)
    pega_maiores_palavras(DIC_TERMOS)
    # ordena_palavras_partido()
    jsonMatrix_gera_partidos()
    jsonMatrix_gera_termos_mais_mais()
    print((matrix['termos']))
    jsonMatrix_gera_links_partidos_termos()
    with open('matrix.json', 'w') as arqMatrix:
        arqMatrix.write(json.dumps(matrix, indent=4))

    retorno = {'partidos': PARTIDOS, 'dic_termos':
               DIC_TERMOS, 'lista_proposicoes': lista_proposicoes}

    "#export_json(PARTIDOS, 'partidospropositores.json')"
    "#export_json(lista_proposicoes, 'lista_proposicoes.json')"
    export_json(DIC_TERMOS, 'dic_termos.json')

    return retorno