# -*- coding: utf-8
import pandas as pd

"""
Explanation: A doação de partidos para seus cadidatos
Baixamos a prestação de contas dos candidatos em 2016 e seguimos com a seguinte pergunta: quanto os partidos políticos doaram para seus candidatos? É possível identificar uma diferença entre os valores doados para homens e para mulheres? Quais são os partidos que mais se destacam e porquê? Quais foram os candidados que mais se destacaram e o porquê? Essas são algumas das perguntas que a nossa análise procurou responder.
Sexo invisível
A base de prestação de contas dos candidatos não possui a coluna "Sexo". Ou seja, apenas com essa base não é possível fazer as análises. Contudo, a base possui o nome e o número sequencial dos candidatos, algo que usaremos para importar os dados de sexo da base de candidaturas.
Python: Pandas
Escolhemos o Pandas para fazer essa análise. Trata-se de um dos melhores módulos Python para análise de dados. O Pandas permite manipular os arquivos do Tribunal Superior Eleitoral com facilidade. Como são muitos arquivos e muito grandes, não é possível abri-los em ferramentas mais convencionais, como o Libre Office Calc.
Vamos começar, então, importando o Pandas para o nosso script. Se você não tem o Pandas instalado, basta digitar "pip install Pandas" no seu terminal.
End of explanation
"""


base = pd.read_csv(
    'data/receitas_candidatos_2016_brasil.txt', 
    delimiter=";", 
    decimal=",", 
    encoding="latin1", 
    low_memory=False)

"""
Explanation: Agora vamos usar a função "read_csv" do Pandas para abrir o arquivo "receitas_candidatos_2016_brasil.txt". Esse arquivo possui o consolidado da prestação de contas de todos os candidatos nas eleições de 2016. É um arquivo de quase 1Gb. Temos alguns parâmetros:

delimiter: ";" (os arquivos brasileiros possuem o delimitador ";" em vez da ",")
decimal: "," (preciamos informar que no formato numérico brasileiro a casa decimal é separada por vírgula)
encoding: "latin1" (o padrão brasileiro de encoding de caracteres usado pelo governo equivale ao "latin1" em Python)
low_memory=False (o Pandas tenta adivinhar qual é o tipo de dado em cada coluna para economizar memória - número, texto etc - como uma das colunas possui mais de um tipo de dado, precisamos dizer ao Pandas que ele vai precisar usar mais memória)
End of explanation
"""


base


"""
Explanation: Guardamos o arquivo na variável base e agora vamos exibir as 30 primeiras e 30 últimas linhas.
End of explanation
"""


base.columns

"""
Explanation: Essa tabela tem muitas colunas que não precisamos usar na nossa análise. Vamos recuperar os nomes das colunas e depois vamos fazer um recorte para gerar uma base apenas com as colunas que queremos. Para recuperar as colunas de uma base, digite:
End of explanation
"""


base_cortada = pd.DataFrame(base, columns=[
                    u"Sequencial Candidato", 
                    u"Nome Candidato", 
                    u"UF", 
                    u"Nome da UE", 
                    u"Sigla  Partido",
                    u"Cargo",
                    u"Nome do doador",
                    u"Número partido doador", 
                    u"Número candidato doador", 
                    u"Valor receita", 
                    u"Tipo receita", 
                    u"Fonte receita", 
                    u"Especie recurso"
                ])

"""
Explanation: Fatiando a base
Agora, vamos criar uma nova variável chamada "base_cortada" e vamos criar um novo DataFrame - o nome que o Pandas dá para as bases de dados que você manipula por meio do módulo - com as seguintes colunas:

Sequencial Candidato (essa é a chave que vai nos ajudar a buscar os dados de gênero depois)
Nome Candidato (nome para referência mais rápida)
UF (estado do candidato)
Nome da UE (cidade)
Sigla Partido
Cargo (Prefeito ou Vereador)
Nome do doador (nome do diretório ou comissão que doou)
Número partido doador (número da sigla registrado junto ao TSE)
Número candidato doador (número do candidato doador, se aplicável)
Valor receita (valor da doação)
Tipo de receita (categoria que nos ajuda a identificar se a doação foi de pessoa física ou de um partido, por exemplo)
Fonte receita (se aplicável)
Especie recurso (depósito em espécie? transferência eletrônica? etc)
End of explanation
"""


base_cortada

"""
Explanation: Vamos ver como ficou a nossa nova base cortada:
End of explanation
"""


base_cortada.to_csv("receitas_GN.csv", encoding="utf-8")

"""
Explanation: Agora vamos salvar a base para um arquivo CSV usando a função "to_csv" do Pandas:
End of explanation
"""


candidatos = pd.read_csv(
    'data/consulta_cand_2016_brasil.txt', 
    delimiter=";", 
    decimal=",", 
    encoding="latin1",
    header=None,
    low_memory=False)

candidatos.columns

"""
Explanation: Buscando o sexo
Agora que temos a base que precisamos para fazer as análises, precisamos buscar o sexo de todos os candidatos. 
Vamos usar a coluna "Sequencial Candidato" na base que acabamos de criar e vamos compará-la com uma coluna de mesmo nome na base "consulta_cand_2016_brasil.txt".
Essa base foi criada unindo todos os arquivos TXT do TSE com um simples comando no terminal:
cat *.txt &gt; consulta_cand_2016_brasil.csv
Você pode renomear depois para .txt (como abaixo) ou deixar .csv mesmo. Agora basta criarmos um novo DataFrame com a base que acabamos de definir:
End of explanation
"""


candidatos.rename(columns={10: "Nome Candidato", 11:"Sequencial Candidato", 30:"Sexo"}, inplace=True)

candidatos_sexo = pd.DataFrame(candidatos, columns=["Sequencial Candidato", "Nome Candidato", "Sexo"])

candidatos_sexo

"""
Explanation: Como percebemos acima, o arquivo de candidaturas não possui cabeçalho. Foi por isso que um dos parâmetros na hora de importar o arquivo foi "header=None". 
Com isso, o Pandas nomeou em sequência as colunas do 0 até o 45, totalizando 46 colunas.
Para a consulta de sexo dos candidados vamos renomear as colunas 10, 11 e 30. Assim, criaremos uma nova base apenas com os nomes, o número sequencial e o sexo dos candidatos. Vamos usar essa base para acrescentar a informação de sexo na nossa tabela de doações:
End of explanation
"""


candidatos_sexo.to_csv("consulta_cand_2016_sexo.csv", encoding="utf-8")

"""
Explanation: Vamos salvar uma cópia desse arquivo no formato CSV. Assim você pode importar para o seu processador de planilhas favorito.
End of explanation
"""


left = base_cortada
right = candidatos_sexo

merge = pd.merge(left,right, on="Sequencial Candidato")

"""
Explanation: Unindo tabelas pelo número sequencial
Vamos unir as duas tabelas usando a coluna que elas possuem em comum: Sequencial Candidato. À esquerda, vamos usar a nossa base cortada, à direita a base de candidatos com o sexo. O ponto de união das duas bases será a coluna Sequencial Candidato.
O Pandas já faz o trabalho pra gente: onde o número sequencial na tabela com os sexos for X, por exemplo, ele vai acrescentar o valor do sexo automaticamente. Funciona como um VLOOKUP/PROCV ou index/match:
End of explanation
"""


merge_filtrado = merge[merge['Tipo receita'] == u"Recursos de partido político"]
prefeitos = merge_filtrado[merge_filtrado['Cargo'] == u"Prefeito"]
vereadores = merge_filtrado[merge_filtrado['Cargo'] == u"Vereador"]

"""
Explanation: Dividindo entre prefeitos e vereadores
Os valores de doação para prefeitos e vereadores são muito diferentes.
Vamos criar uma base apenas com os cargos de prefeito e outra apenas com vereadores:
End of explanation
"""


tabela_final_prefeitos = prefeitos.pivot_table(index=[u'Número partido doador',
                         u'UF', 
                         u'Nome da UE'],
                  columns=[u'Sexo'],
                  values=['Valor receita', "Sequencial Candidato"], 
                  aggfunc=[sum, pd.Series.nunique])

tabela_final_vereadores = vereadores.pivot_table(index=[u'Número partido doador',
                         u'UF', 
                         u'Nome da UE'],
                  columns=[u'Sexo'],
                  values=['Valor receita', "Sequencial Candidato"], 
                  aggfunc=[sum, pd.Series.nunique])

tabela_final_prefeitos

tabela_final_prefeitos.to_csv("tabela_final_prefeitos.csv", encoding="utf-8")
tabela_final_vereadores.to_csv("tabela_final_vereadores.csv", encoding="utf-8")

"""
Explanation: Agora geramos duas tabelas dinâmicas com os valores agregados.
Quem recebeu mais: homens ou mulheres?
Nesse caso, queremos saber quanto os partidos doaram para mulheres e homens em cada localidade e quantas mulheres e homens estavam concorrendo em cada cidade.
End of explanation
"""


maximos_prefeitos = prefeitos.pivot_table(index=[u'Número partido doador'],
                            values=['Valor receita'],
                            columns=["Sexo"],
                            aggfunc=max)

maximos_vereadores = vereadores.pivot_table(index=[u'Número partido doador'],
                            values=['Valor receita'],
                            columns=["Sexo"],
                            aggfunc=max)

maximos_prefeitos.to_csv("maximos_prefeitos.csv", encoding = "utf-8")
maximos_vereadores.to_csv("maximos_vereadores.csv", encoding = "utf-8")

maximos_vereadores

"""
Explanation: Qual foi o valor máximo doado de uma vez só?
Também queremos saber quais foram os valores máximos doados por cada partido em cada um dos cargos.
Geramos outra tabela dinâmica, assim:
End of explanation
"""


