{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[]},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"},"gpuClass":"standard"},"cells":[{"cell_type":"markdown","source":["# **Aula 3 - 21/08 - Funções, Métodos, Módulos, Bibliotecas e Numpy**\n","\n"],"metadata":{"id":"_ns7mAL7Sqmm"}},{"cell_type":"markdown","source":["
Quando começamos a desenvolver programas mais complexos, logo percebemos que repetir trechos de código leva a redundâncias e dificulta a manutenção. É aí que as funções entram em cena. Elas nos permitem agrupar um conjunto de instruções relacionadas em um único bloco, tornando nosso código mais organizado, legível e reutilizável. Imagine poder chamar uma função bem nomeada em vez de reescrever o mesmo código repetidamente.\n","\n","
Além disso, exploraremos como usar módulos em Python. Os módulos são como pastas de ferramentas que contêm conjuntos específicos de funções e classes. Eles nos permitem organizar nosso código em arquivos separados, facilitando a colaboração e a manutenção. Além disso, podemos aproveitar a rica biblioteca de módulos da comunidade Python para adicionar funcionalidades especializadas aos nossos programas.\n","\n","
Por fim, entraremos no mundo da computação numérica eficiente com o NumPy. Esta biblioteca poderosa oferece estruturas de dados otimizadas para operações matemáticas em arrays multidimensionais. Se você já trabalhou com matrizes ou dados científicos, você vai adorar as capacidades que o NumPy traz para suas aplicações.\n"],"metadata":{"id":"WbPvhjqETV7N"}},{"cell_type":"markdown","source":["### 1. Funções\n","\n"],"metadata":{"id":"D0rD_ajPUnll"}},{"cell_type":"markdown","source":["
Em Python, uma função é um bloco de código autônomo que realiza uma tarefa específica. Elas nos permitem agrupar um conjunto de instruções relacionadas sob um único nome, que pode ser chamado sempre que necessário. Em outras palavras, as funções promovem a reutilização de código, melhoram a legibilidade e reduzem erros."],"metadata":{"id":"sw2sE3Gw6Umh"}},{"cell_type":"markdown","source":["
Ao longo das aulas, já utilizamos algumas funções *built-in* do python, como o len(), print(), etc. Para mais informações sobre as funções que já vem com o Python, acesse o link"],"metadata":{"id":"4N0fcsyt3amT"}},{"cell_type":"markdown","source":["**Vantagens das Funções:**\n","\n","* Reutilização de Código: Você pode definir uma função uma vez e usá-la em várias partes do seu programa, evitando duplicação de código.\n","* Organização: Funções permitem que você divida seu programa em partes menores e mais gerenciáveis. Cada função pode se concentrar em uma tarefa específica.\n","* Manutenção: Se você precisa fazer uma alteração em uma parte do código, alterar apenas uma função afeta todas as ocorrências em que ela é chamada.\n","* Legibilidade: Ao dar nomes descritivos às funções, seu código se torna mais legível e autoexplicativo."],"metadata":{"id":"ldffHFkAruxV"}},{"cell_type":"markdown","source":["Exemplo simples da sintaxe de uma função:"],"metadata":{"id":"-GH1Gq8z9PiT"}},{"cell_type":"code","source":["def saudacao(nome):\n"," print(\"Olá,\", nome, \"!\")"],"metadata":{"id":"hD2aeWAxsJ0m"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["
Neste exemplo, definimos a função utilizando \"def\", a chamando de \"saudacao\", e ela recebe um parâmetro/argumento \"nome\" e imprime uma mensagem utilizando ele. No entanto, ao rodar esta célula, nada acontece além de salvar a função dentro do Python. Você precisa também chamar a função, e atribuir algum valor ao argumento \"nome\""],"metadata":{"id":"alSi3RSz5h42"}},{"cell_type":"code","source":["saudacao(\"José\")\n"],"metadata":{"id":"hYUmRAmU5ay5","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1692279125443,"user_tz":180,"elapsed":284,"user":{"displayName":"Pedro Henrique de Santana Schmalz","userId":"15443225301388878262"}},"outputId":"145fe92c-160f-4fb9-c22f-4945ac2a49bb"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["Olá, José !\n"]}]},{"cell_type":"markdown","source":["Outro exemplo de função pode ser o de pegar dois números como argumentos ('x' e 'y') e fazer a soma deles:"],"metadata":{"id":"o_U7KmyI8Yhq"}},{"cell_type":"code","source":["def soma(x,y):\n"," return x+y\n","\n","\n","soma(2,1)"],"metadata":{"id":"uHZIckGA-QRv","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1692279284627,"user_tz":180,"elapsed":2,"user":{"displayName":"Pedro Henrique de Santana Schmalz","userId":"15443225301388878262"}},"outputId":"053beebc-5035-42ad-d070-dd332a689150"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["3"]},"metadata":{},"execution_count":5}]},{"cell_type":"markdown","source":["Se você fizer uma função sem utilizar o return, ela vai retornar um valor *None*\n","\n"],"metadata":{"id":"lnQmA6sctNVT"}},{"cell_type":"code","source":["def imprima(x):\n"," print(x)\n","\n","imprima(\"Olá\")\n","\n","resultado = imprima(\"Olá\")\n","\n","print(resultado)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"BBY2JAp1tTgf","executionInfo":{"status":"ok","timestamp":1692279401459,"user_tz":180,"elapsed":245,"user":{"displayName":"Pedro Henrique de Santana Schmalz","userId":"15443225301388878262"}},"outputId":"49473116-cbf6-4fc2-f5d9-7e884029d226"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["Olá\n","Olá\n","None\n"]}]},{"cell_type":"markdown","source":["
Você também pode definir valores padrões para determinados argumentos se achar necessário. Imagine que estamos criando uma função que calcula o preço total de uma compra, considerando um desconto opcional. Vamos definir um valor padrão para o desconto, caso ele não seja especificado:"],"metadata":{"id":"1IOuK9irtuDR"}},{"cell_type":"code","source":["def calcular_preco_total(valor_produto, desconto=0):\n"," preco_com_desconto = valor_produto - (valor_produto * desconto / 100)\n"," return preco_com_desconto\n","\n","# Chamando a função com desconto padrão de 0%\n","preco_final1 = calcular_preco_total(100)\n","print(\"Preço com desconto padrão:\", preco_final1)\n","\n","# Chamando a função com desconto de 10%\n","preco_final2 = calcular_preco_total(100, 10)\n","print(\"Preço com desconto de 10%:\", preco_final2)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Gakm2eJ8t4jq","executionInfo":{"status":"ok","timestamp":1692279925108,"user_tz":180,"elapsed":246,"user":{"displayName":"Pedro Henrique de Santana Schmalz","userId":"15443225301388878262"}},"outputId":"943b1781-01e7-4a67-d348-574ba9af2b7b"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["Preço com desconto padrão: 100.0\n","Preço com desconto de 10%: 90.0\n"]}]},{"cell_type":"markdown","source":["#### Docstrings"],"metadata":{"id":"u1gnj0aGyWtS"}},{"cell_type":"markdown","source":["
Pensando tanto na legibilidade quanto no seu \"eu futuro\", uma boa prática pode ser a de utilizar docstrings em suas funções. As docstrings são strings de documentação que fornecem informações sobre módulos, funções, classes ou métodos em Python. Elas são usadas para descrever o propósito, o funcionamento e os parâmetros de uma entidade do código, tornando o código mais compreensível e autoexplicativo.\n","\n","
As docstrings são delimitadas por três aspas (simples ou duplas) no início e no final da definição de uma entidade. Aqui está um exemplo de uma docstring para uma função:"],"metadata":{"id":"0AGr7r_OyYTB"}},{"cell_type":"code","source":["def calcular_media(valores):\n"," \"\"\"\n"," Calcula a média dos valores em uma lista.\n","\n"," Args:\n"," valores (list): Uma lista de valores numéricos.\n","\n"," Returns:\n"," float: A média dos valores.\n","\n"," Exemplo:\n"," >>> calcular_media([1, 2, 3, 4, 5])\n"," 3.0\n"," \"\"\"\n"," total = sum(valores)\n"," media = total / len(valores)\n"," return media"],"metadata":{"id":"mPvlxEm5y-DN"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["Veja que a função ainda funciona da forma desejada."],"metadata":{"id":"MLEJBt22zK9I"}},{"cell_type":"code","source":["calcular_media([1,2,3,4,5])"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"sdma-dhDzBa1","executionInfo":{"status":"ok","timestamp":1692280847136,"user_tz":180,"elapsed":3,"user":{"displayName":"Pedro Henrique de Santana Schmalz","userId":"15443225301388878262"}},"outputId":"4c23423c-33ac-41f8-dc81-7545508de0f2"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["3.0"]},"metadata":{},"execution_count":12}]},{"cell_type":"markdown","source":["Para consultar a documentação da função, pode se utilizar o atributo '\\_\\_doc\\_\\_'."],"metadata":{"id":"Gd5a5aoxzPKU"}},{"cell_type":"code","source":["print(calcular_media.__doc__)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"l2PgSQAgzXKA","executionInfo":{"status":"ok","timestamp":1692280912551,"user_tz":180,"elapsed":245,"user":{"displayName":"Pedro Henrique de Santana Schmalz","userId":"15443225301388878262"}},"outputId":"34251011-f52a-4160-8a5a-633b29e775a2"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["\n"," Calcula a média dos valores em uma lista.\n","\n"," Args:\n"," valores (list): Uma lista de valores numéricos.\n","\n"," Returns:\n"," float: A média dos valores.\n","\n"," Exemplo:\n"," >>> calcular_media([1, 2, 3, 4, 5])\n"," 3.0\n"," \n"]}]},{"cell_type":"markdown","source":["#### Métodos"],"metadata":{"id":"tzseg0Huz6by"}},{"cell_type":"markdown","source":["
Métodos são funções que estão associadas a objetos em Python. Eles permitem que você defina ações que um objeto pode realizar ou comportamentos que ele pode ter. Em termos simples, métodos são funções que são definidas dentro de uma classe e são acessadas através das instâncias dessa classe.\n","\n","
O conceito de classes é muito avançado para o intuito dessa aula. Mas o que importa destacar é a diferença entre funções no python, como len(), print(), input(), e métodos de objetos, como list.append(), list.extend(), list.insert(), etc. Todos os objetos em python possuem métodos próprios associados à eles, e é necessário sempre consultar a documentação para entender quais estão ao seu dispor. Por exemplo, olhe os métodos disponíveis para listas em Python. Também é possível consultar a documentação de determinado método utilizando o \"__doc__\"\n"],"metadata":{"id":"n8Z09J_x3RcF"}},{"cell_type":"code","source":["print(list.append.__doc__)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"WpKRbNIb6Myu","executionInfo":{"status":"ok","timestamp":1692282734222,"user_tz":180,"elapsed":285,"user":{"displayName":"Pedro Henrique de Santana Schmalz","userId":"15443225301388878262"}},"outputId":"b98ae500-e5d3-4e60-8917-962590599cb0"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["Append object to the end of the list.\n"]}]},{"cell_type":"markdown","source":["Se quiser, também pode listar todos os métodos e atributos de um objeto em Python utilizando o dir:"],"metadata":{"id":"Vpp1VtJ9Ogw1"}},{"cell_type":"code","source":["# Métodos e atributos do dicionário\n","\n","dicionario = {\"nome\":'josé'}\n","\n","dir(dicionario)"],"metadata":{"id":"cktm3ez0Om24","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1692288174688,"user_tz":180,"elapsed":3,"user":{"displayName":"Pedro Henrique de Santana Schmalz","userId":"15443225301388878262"}},"outputId":"0615be68-b619-400c-a16e-7b39af24b9df"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["['__class__',\n"," '__class_getitem__',\n"," '__contains__',\n"," '__delattr__',\n"," '__delitem__',\n"," '__dir__',\n"," '__doc__',\n"," '__eq__',\n"," '__format__',\n"," '__ge__',\n"," '__getattribute__',\n"," '__getitem__',\n"," '__gt__',\n"," '__hash__',\n"," '__init__',\n"," '__init_subclass__',\n"," '__ior__',\n"," '__iter__',\n"," '__le__',\n"," '__len__',\n"," '__lt__',\n"," '__ne__',\n"," '__new__',\n"," '__or__',\n"," '__reduce__',\n"," '__reduce_ex__',\n"," '__repr__',\n"," '__reversed__',\n"," '__ror__',\n"," '__setattr__',\n"," '__setitem__',\n"," '__sizeof__',\n"," '__str__',\n"," '__subclasshook__',\n"," 'clear',\n"," 'copy',\n"," 'fromkeys',\n"," 'get',\n"," 'items',\n"," 'keys',\n"," 'pop',\n"," 'popitem',\n"," 'setdefault',\n"," 'update',\n"," 'values']"]},"metadata":{},"execution_count":46}]},{"cell_type":"markdown","source":["#### Escopo de Variáveis\n","\n","O escopo de variáveis em Python se refere à região do código onde uma variável pode ser acessada e manipulada. O escopo determina onde uma variável é válida e em quais partes do programa ela pode ser utilizada.\n","\n","Existem dois principais tipos de escopo em Python:"],"metadata":{"id":"t3xq-yFNBcbC"}},{"cell_type":"markdown","source":["##### Escopo Local"],"metadata":{"id":"5UtZeve0BtTs"}},{"cell_type":"markdown","source":["Variáveis definidas dentro de uma função têm escopo local, o que significa que elas só podem ser acessadas dentro dessa função. Elas são visíveis apenas para o bloco de código em que foram definidas. Uma vez que a execução da função é concluída, as variáveis locais não podem mais ser acessadas."],"metadata":{"id":"dBJzvT0uBw8v"}},{"cell_type":"code","source":["def minha_funcao():\n"," variavel_local = 10\n"," print(variavel_local) # Acesso dentro da função\n","\n","minha_funcao()\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"__omNnw0Bwed","executionInfo":{"status":"ok","timestamp":1692284726322,"user_tz":180,"elapsed":429,"user":{"displayName":"Pedro Henrique de Santana Schmalz","userId":"15443225301388878262"}},"outputId":"90bd951b-8877-43b6-817d-105616db1f87"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["10\n"]}]},{"cell_type":"code","source":["# Agora, se eu tentar imprimir o valor da variável local, veja o que acontece:\n","\n","print(variavel_local)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":210},"id":"zIORotwIB5-g","executionInfo":{"status":"error","timestamp":1692284727146,"user_tz":180,"elapsed":3,"user":{"displayName":"Pedro Henrique de Santana Schmalz","userId":"15443225301388878262"}},"outputId":"c5f61488-1a43-4148-cfe5-38fab81ce3a2"},"execution_count":null,"outputs":[{"output_type":"error","ename":"NameError","evalue":"ignored","traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)","\u001b[0;32m Agora que você já colocou em prática sua criatividade e está familiarizado com as etapas de seleção do corpus utilizado na pesquisa que orienta a nossa disciplina, vamos aprimorar o código desenvolvido no desafio do Tutorial 02 e avançar na discussão acerca das dificuldades inerentes a construção de um corpus de uma pesquisa em PLN."],"metadata":{"id":"poYWOkuF7s9I"}},{"cell_type":"markdown","source":["#### Recapitulando"],"metadata":{"id":"Eg9BxC2d7uJC"}},{"cell_type":"markdown","source":[" No desafio anterior, solicitamos que você construísse uma estrutura de classificação destinada a determinar quais tweets seriam incluídos ou excluídos do corpus da pesquisa. Isso deveria ser feito com base nas informações fornecidas pelo Vaccine Codebook of Political Elites 2023. O objetivo principal era que você identificasse com precisão as várias etapas do processo de seleção dos tweets destinados a compor o corpus, começando pela análise da lista de candidatos à prefeito nas capitais brasileiras e seguindo até a escolha dos tweets que, conforme os critérios definidos no documento, seriam submetidos à codificação humana.\n","\n"," Tratava-se de um exercício fundamentalmente criativo, o que lhe conferia uma dose de liberdade para agir. Desde que o seu código conseguisse diferenciar de forma nítida quais candidatos ou tweets seriam descartados ou aceitos a cada etapa do processo, não havia margem para erro. Era viável presumir a existência de uma base de dados consolidada contendo essas informações. Você também tinha a liberdade para criar uma base de dados fictícia para trabalhar e até mesmo supor a existência de variáveis que, pelo menos na atual conjuntura, não são levadas em consideração pelos órgãos que divulgam essas informações, como o TSE e até mesmo o próprio Twitter.\n","\n","\n"," Poréeeem, como tudo o que é bom tem seu fim, chegou a hora de trazer um pouco de realidade para a equação."],"metadata":{"id":"YXPky1dy762z"}},{"cell_type":"markdown","source":["#### Uma Dose de Realidade"],"metadata":{"id":"9gip9Y7n8Afo"}},{"cell_type":"markdown","source":[" Não pretendo te desanimar, contudo, acredito que seja essencial trazer à discussão um ponto relevante. Essa base de dados excepcional, contendo todas as informações necessárias, simplesmente NÃO existe e é improvável que venha a existir. Sempre haverá a necessidade de realizar ajustes, organizar ou fazer modificações mínimas. Mesmo quando parece estar em condições ideais (o que RARAMENTE ocorre), ainda assim, será necessário investir tempo para adaptar os dados às exigências tanto suas quanto da pesquisa em si.\n","\n"," No contexto de nossa pesquisa, precisamos recorrer a três fontes de informação distintas: o TSE, o Google e o Twitter. Permita-me explicar.\n","\n"," Recorremos ao TSE, por razões óbvias, para cruzar as informações demográficas dos candidatos à prefeito com os votos que obtiveram em seus respectivos distritos eleitorais. Uma vez concluído esse processo, selecionamos apenas aqueles cujas candidaturas foram aprovadas pelo TSE e que competiram em uma das capitais. Somente então prosseguimos para identificar aqueles que possuíam uma conta no Twitter. Sim, essa informação não está disponível nas bases de dados do TSE. Pelo menos não de forma consistente. Observem que somente recentemente essa informação passou a ser coletada e divulgada pelos diretórios partidários. Além disso, não é obrigatório que os candidatos tenham e façam uso das redes sociais nas campanhas eleitorais, o que torna esse dado pouco confiável e de difícil utilização, pelo menos no momento atual.\n","\n"," Em razão disso, tornou-se necessário investigar individualmente os 300 candidatos cujas candidaturas foram aprovadas, utilizando o Google para verificar se possuíam contas no Twitter ou não. Após a conclusão desse processo e com os perfis de usuário dos candidatos em nossa posse, avançamos para a coleta de todos os tweets publicados em 2020 pelos candidatos à prefeito que possuíam contas ativas na plataforma Twitter.\n","\n"," Uma vez concluída essa etapa, procedemos então à filtragem dos 231.770 tweets coletados, selecionando exclusivamente aqueles que faziam menção a um ou mais dos termos e palavras-chave previamente estabelecidos por nossa equipe.\n","\n"," Ufa, acabou! Finalmente temos um corpus pronto para ser utilizado."],"metadata":{"id":"AuQdlq1S8E5U"}},{"cell_type":"markdown","source":["#### A Tarefa"],"metadata":{"id":"RGctPXNq8XeK"}},{"cell_type":"markdown","source":[" Com base no conteúdo abordado nas seções anteriores, especialmente na consideração dos desafios envolvidos na construção de um corpus robusto e coerente, e aproveitando os conhecimentos em Python que você acumulou até agora, chegou o momento de elevar a qualidade e aplicabilidade do seu classificador.\n","\n"," Dessa vez, iremos avaliar a eficácia do seu código em dados reais. Para isso, selecione 10 candidatos da amostra fornecida no Vaccine Codebook of Political Elites 2023. Assegure-se de escolher candidatos provenientes de diferentes capitais, e garanta que nem todos possuam uma conta no Twitter. Após essa seleção, crie mais 10 candidatos entre prefeitos e vereadores, de cidades que não foram abordadas na pesquisa. Podem ser candidatos reais ou fictícios, você escolhe.\n","\n"," Por último, examine a relação de termos e palavras-chave estabelecida pela equipe e associe \"tweets\" aos candidatos que possuem perfil no Twitter, levando em consideração a presença ou ausência desses termos. Dado que ainda não abordamos o uso de data frames, vamos proceder como se estivéssemos analisando apenas os tweets do dia 27/09/2020, data a partir da qual foi permitida a propaganda eleitoral nas eleições daquele ano.\n","\n"," Com base nessas diretrizes, você deverá criar nove listas, seguindo a estrutura abaixo, e então consolidá-las em um dicionário utilizando a função que você desenvolveu no exercício 05.\n","\n","nome_candidato = ['Joana', 'José'] Com o dicionário pronto, elabore uma função para o classificador concebido no Tutorial 02 e empregue o dicionário a fim de verificar sua eficácia. Essa função deve incorporar ao dicionário criado uma lista de dummies denominada 'termo_vacina', indicando se o tweet incluía ou não um dos termos designados pela equipe. Ao final, a função deve imprimir apenas as informações dos candidatos escolhidos para integrar o corpus. Não se esqueça de ordenar a lista de candidatos.\n","\n","[**Link do Codebook**](https://github.com/PedroSchmalz/covid19-tweets-brazilian-mayoral-candidates/blob/main/Codebook.pdf)"],"metadata":{"id":"WDo6E7B88ZUk"}},{"cell_type":"code","source":["### INFORMAÇÕES DOS CANDIDATOS\n","\n","## Nome dos candidatos\n","\n","nome_candidato = ['Joana', 'José']\n","\n","## Sigla do partido\n","\n","sigla_partido =['PT', 'PSDB']\n","\n","## UF\n","\n","sigla_uf = ['AC', 'SP']\n","\n","## Distrito eleitoral\n","\n","nome_municipio = ['Rio Branco', 'São Paulo']\n","\n","## Cargo\n","\n","cargo = ['Prefeito', 'Vereador']\n","\n","## Situação da candidatura\n","\n","situacao_candidatura = ['Deferido', 'Indeferido']\n","\n","## Dummy que indica se o candidato possui conta no Twitter\n","\n","conta_twitter = [1, 1]\n","\n","## Dummy que indica se o candidato publicou no Twitter em 2020\n","\n","publicou_2020 = [1, 1]\n","\n","## Tweets publicados no dia 27/09/2020\n","\n","tweet_27092020 = list(map(lambda x: x.lower(), ['blablaVacinablabla', 'blablablablaOI']))\n","\n","## Lista vazia onde a informação se o tweet integrará o corpus será salva\n","\n","termo_vacina = [\"NA\", \"NA\"]\n","\n","## Total de candidatos\n","\n","tot_candidatos = len(nome_candidato)\n","\n","candidatos = nome_candidato\n","\n","### DICIONÁRIO\n","\n","## Cria uma lista vazia onde o dicionário será armazenado\n","\n","dicionario = {}\n","\n","## Adicionando as informações criadas em um dicionário\n","\n","for nome_candidato, sigla_partido, sigla_uf, nome_municipio, cargo, situacao_candidatura, conta_twitter, publicou_2020, tweet_27092020, termo_vacina in zip(nome_candidato, sigla_partido, sigla_uf, nome_municipio, cargo, situacao_candidatura, conta_twitter, publicou_2020, tweet_27092020, termo_vacina):\n"," dicionario[nome_candidato] = {\"sigla_partido\": sigla_partido, \"sigla_uf\": sigla_uf, \"nome_municipio\": nome_municipio, \"cargo\": cargo, \"situacao_candidatura\": situacao_candidatura, \"conta_twitter\": conta_twitter, \"publicou_2020\": publicou_2020, \"tweet_27092020\": tweet_27092020, \"termo_vacina\": termo_vacina}\n","\n","## Imprimindo o dicionário atual\n","\n","for nome_candidato, info in dicionario.items():\n"," print(f\"Nome do candidato: {nome_candidato}, Sigla do partido: {info['sigla_partido']}, UF: {info['sigla_uf']}, Município: {info['nome_municipio']}, Cargo: {info['cargo']}, Situação da candidatura: {info['situacao_candidatura']}, Twitter: {info['conta_twitter']}, Publicou em 2020: {info['publicou_2020']}, Tweet: {info['tweet_27092020']}, Corpus: {info['termo_vacina']}\")\n","\n"],"metadata":{"id":"4ZMOX3vm8dYr","executionInfo":{"status":"ok","timestamp":1693342136275,"user_tz":180,"elapsed":356,"user":{"displayName":"Rebeca Carvalho","userId":"01975075342439777451"}}},"execution_count":82,"outputs":[]},{"cell_type":"code","source":["## Lista das capitais brasileiras\n","\n","capitais_brasileiras = [\n"," \"Rio Branco\", \"Maceió\", \"Macapá\", \"Manaus\", \"Salvador\",\n"," \"Fortaleza\", \"Brasília\", \"Vitória\", \"Goiânia\", \"São Luís\",\n"," \"Cuiabá\", \"Campo Grande\", \"Belo Horizonte\", \"Belém\",\n"," \"João Pessoa\", \"Curitiba\", \"Recife\", \"Teresina\", \"Rio de Janeiro\",\n"," \"Natal\", \"Porto Alegre\", \"Porto Velho\", \"Boa Vista\", \"Florianópolis\",\n"," \"São Paulo\", \"Aracaju\", \"Palmas\"]\n","\n","## Lista dos termos de interesse\n","\n","termos = list(map(lambda x: x.lower(), [\"vacina\", \"Vacinacao\", \"Butantan\"]))\n","\n","## Estrutura de classificação que avalia quais\n","## candidatos e tweets participarão do corpus\n","\n","for candidato in range(0, tot_candidatos):\n","\n"," print(\"\\n\\nLendo\", candidatos[candidato], \"(\", dicionario[candidatos[candidato]][\"sigla_partido\"],\n"," \"-\", dicionario[candidatos[candidato]][\"nome_municipio\"], \")\", \"\\n\")\n","\n"," ## Verifica se o candidato concorreu à prefeito em uma das capitais brasileiras\n","\n"," if dicionario[candidatos[candidato]][\"cargo\"] == \"Prefeito\" and dicionario[candidatos[candidato]][\"nome_municipio\"] in capitais_brasileiras:\n","\n"," print(\"\\nO candidato\", candidatos[candidato], \"concorreu à prefeitura do município de\", dicionario[candidatos[candidato]][\"nome_municipio\"],\n"," \"-\", dicionario[candidatos[candidato]][\"sigla_uf\"], end =\".\")\n","\n"," ## Avalia se a candidatura foi deferida pelo TSE\n","\n"," if dicionario[candidatos[candidato]][\"situacao_candidatura\"] == \"Deferido\":\n","\n"," print('\\n\\nO candidato', candidatos[candidato], '(', dicionario[candidatos[candidato]][\"sigla_partido\"], '-',\n"," dicionario[candidatos[candidato]][\"nome_municipio\"], ') foi deferido pelo TSE.')\n","\n"," ## Avalia se o candidato possui conta no Twitter\n","\n"," if dicionario[candidatos[candidato]][\"conta_twitter\"] == 1:\n","\n"," print(\"\\nO candidato\", candidatos[candidato], '(', dicionario[candidatos[candidato]][\"sigla_partido\"], '-',\n"," dicionario[candidatos[candidato]][\"nome_municipio\"], \") possui conta no Twitter.\")\n","\n"," ## Avalia se o candidato publicou no Twitter entre 01/01/2020 e 31/12/2020\n","\n"," if dicionario[candidatos[candidato]][\"publicou_2020\"] == 1:\n","\n"," print(\"\\nO candidato\", candidatos[candidato], '(', dicionario[candidatos[candidato]][\"sigla_partido\"], '-',\n"," dicionario[candidatos[candidato]][\"nome_municipio\"], \") publicou no Twitter em 2020.\")\n","\n"," ## Cria uma string com NA que é atualizada assim que um termo relacionado à vacina é encontrado no tweet\n","\n"," relacionado_vacina = \"NA\"\n","\n"," ## Cria um contador\n","\n"," contador = 0\n","\n"," ## Verifica se o tweet possui um dos termos especificados\n","\n"," while contador < len(termos) or relacionado_vacina == \"NA\":\n","\n"," if termos[contador] in dicionario[candidatos[candidato]][\"tweet_27092020\"]:\n","\n"," relacionado_vacina = 1\n","\n"," contador = contador + 1\n","\n"," if relacionado_vacina == 1:\n","\n"," ## Alterando os valores da variável 'termo_vacina'\n","\n"," dicionario[candidatos[candidato]][\"termo_vacina\"] = 1\n","\n"," print(\"\\nO tweet do candidato\", candidatos[candidato], '(', dicionario[candidatos[candidato]][\"sigla_partido\"], '-',\n"," dicionario[candidatos[candidato]][\"nome_municipio\"], \") será incluído no corpus de análise.\")\n","\n"," else:\n","\n"," ## Alterando os valores da variável 'termo_vacina'\n","\n"," dicionario[candidatos[candidato]][\"termo_vacina\"] = 0\n","\n"," print(\"\\nO tweet do candidato\", candidatos[candidato], '(', dicionario[candidatos[candidato]][\"sigla_partido\"], '-',\n"," dicionario[candidatos[candidato]][\"nome_municipio\"], \") não será incluído no corpus de análise.\")\n","\n"," else:\n","\n"," print(\"\\nO candidato\", candidatos[candidato], '(', dicionario[candidatos[candidato]][\"sigla_partido\"], '-',\n"," dicionario[candidatos[candidato]][\"nome_municipio\"], \") não publicou no Twitter em 2020.\")\n","\n"," else:\n","\n"," print(\"\\nO candidato\", candidatos[candidato], '(', dicionario[candidatos[candidato]][\"sigla_partido\"], '-',\n"," dicionario[candidatos[candidato]][\"nome_municipio\"], \") não possui conta no Twitter.\")\n","\n"," else:\n","\n"," print('\\nO candidato', candidatos[candidato], '(', dicionario[candidatos[candidato]][\"sigla_partido\"],\n"," '-', dicionario[candidatos[candidato]][\"nome_municipio\"], ') não foi deferido pelo TSE')\n","\n"," else:\n","\n"," print(\"\\nO candidato\", candidatos[candidato], \"não foi candidato à prefeito ou não concorreu em uma das capitais brasileiras.\\n\\n\")\n"],"metadata":{"id":"DgWWUdm-oq8t"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["## Imprimindo as informações dos candidatos que integrarão o corpus\n","\n","for candidato in range(0, tot_candidatos):\n","\n"," if dicionario[candidatos[candidato]][\"termo_vacina\"] == 1:\n","\n"," print(\"Nome do candidato:\", candidatos[candidato], \"\\nSigla do partido:\", dicionario[candidatos[candidato]][\"sigla_partido\"],\n"," \"\\nUF:\", dicionario[candidatos[candidato]][\"sigla_uf\"], \"\\nMunicípio:\", dicionario[candidatos[candidato]][\"nome_municipio\"],\n"," \"\\nCargo:\", dicionario[candidatos[candidato]][\"cargo\"], \"\\nSituação da candidatura:\", dicionario[candidatos[candidato]]['situacao_candidatura'],\n"," \"\\nTwitter:\", dicionario[candidatos[candidato]]['conta_twitter'], \"\\nPublicou em 2020:\", dicionario[candidatos[candidato]]['publicou_2020'],\n"," \"\\nTweet:\", dicionario[candidatos[candidato]][\"tweet_27092020\"], \"\\nCorpus:\", dicionario[candidatos[candidato]]['termo_vacina'])\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"ffl32LDKE7FV","executionInfo":{"status":"ok","timestamp":1693343966022,"user_tz":180,"elapsed":342,"user":{"displayName":"Rebeca Carvalho","userId":"01975075342439777451"}},"outputId":"e2a7383a-e70b-4a38-a5c2-c18ae2be3590"},"execution_count":107,"outputs":[{"output_type":"stream","name":"stdout","text":["Nome do candidato: Joana \n","Sigla do partido: PT \n","UF: AC \n","Município: Rio Branco \n","Cargo: Prefeito \n","Situação da candidatura: Deferido \n","Twitter: 1 \n","Publicou em 2020: 1 \n","Tweet: blablavacinablabla \n","Corpus: 1\n"]}]}]}
\n","sigla_partido =['PT', 'PSDB']\n","sigla_uf = ['AC', 'SP']
\n","nome_municipio = ['Rio Branco', 'São Paulo']
\n","cargo = ['Prefeito', 'Vereador']
\n","situacao_candidatura = ['Deferido', 'Indeferido']
\n","conta_twitter = [1, 1]
\n","publicou_2020 = [1, 1]
\n","tweet_27092020 = ['blablavacinablabla', 'blablablabla']
\n","\n","