<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Walter R P Cortes</title>
    <description>The latest articles on DEV Community by Walter R P Cortes (@wpcortes75).</description>
    <link>https://dev.to/wpcortes75</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F315775%2Fcb09b5ff-c535-4b8f-9a86-00f29827667a.jpeg</url>
      <title>DEV Community: Walter R P Cortes</title>
      <link>https://dev.to/wpcortes75</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wpcortes75"/>
    <language>en</language>
    <item>
      <title>Parte 1: Introdução ao dbt</title>
      <dc:creator>Walter R P Cortes</dc:creator>
      <pubDate>Mon, 11 Nov 2024 00:00:00 +0000</pubDate>
      <link>https://dev.to/wpcortes75/parte-1-introducao-ao-dbt-13na</link>
      <guid>https://dev.to/wpcortes75/parte-1-introducao-ao-dbt-13na</guid>
      <description>&lt;h1&gt;Introdução&lt;/h1&gt;

&lt;p&gt;Considerando um cenário corporativo, a maior parte dos dados que um analista de dados tem para trabalhar já estão nos data warehouses, lake houses e afins, para que o mesmo esteja respeitando as políticas de data management e compliance. Mas o cenário se modifica quando vamos para empresas menores, que tem uma politica mais liberal de data management: é comum que os dados nos lakes precisem ser enriquecidos pelo próprio analista com arquivos de texto, planilhas, APIs ou até mesmo de páginas web enquanto tentam criar as visualizações.&lt;/p&gt;

&lt;p&gt;A partir do momento em que os dados estão disponíveis, o próximo passo é trabalha-los para que os mesmos atendam às necessidades do projeto. Nesta fase, a biblioteca &lt;code&gt;Pandas&lt;/code&gt; é uma das mais utilizadas para manipulação de dados em Python. &lt;code&gt;Pandas&lt;/code&gt; é uma biblioteca de código aberto que fornece estruturas de dados de alto desempenho e fáceis de usar, além de ferramentas de análise de dados. Se considerarmos um analista que não tem background em programação, &lt;code&gt;Pandas&lt;/code&gt; é uma excelente opção para manipulação de dados.&lt;/p&gt;

&lt;p&gt;Para aqueles analistas com background em programação, apesar do poder que &lt;code&gt;Pandas&lt;/code&gt; disponibiliza, sabemos que a maior parte das transformações de dados poderiam ser feitas de maneira mais tradicional e eficiente com o uso de &lt;code&gt;SQL&lt;/code&gt;, que é a linguagem nativa dos bancos de dados relacionais e especializada para trabalhar com dados tabulares.&lt;/p&gt;

&lt;p&gt;Mas, devido a algumas limitações, usar &lt;code&gt;SQL&lt;/code&gt; nesta tarefa acaba não sendo tão popular. Entre os problemas mais comuns estão:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Os ambientes de desenvolvimento em SQL não tem integração nativa com ferramentas de source control, como Git&lt;/li&gt;
&lt;li&gt;Não é possível executar testes automatizados de maneira simples&lt;/li&gt;
&lt;li&gt;Não é possível reutilizar código de maneira eficiente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para resolver esses problemas e outros relacionados a modelagem e transformação de dados, é que a ferramenta &lt;code&gt;dbt&lt;/code&gt; foi criada.&lt;/p&gt;

&lt;p&gt;Nesta série de artigos, vamos explorar o &lt;code&gt;dbt&lt;/code&gt; e como ele pode ser utilizado para transformar dados de maneira eficiente e escalável. Para isso, vamos criar um projeto de exemplo: um repositório de dados para ser utilizado em visualizações de dados em geral. Este projeto pode ser um bom ponto de partida para quem está começando a trabalhar com &lt;code&gt;dbt&lt;/code&gt; e quer adicionar alfo prático ao seu portfolio.&lt;/p&gt;

&lt;h1&gt;dbt (data build tool)&lt;/h1&gt;

&lt;p&gt;O &lt;a href="https://www.getdbt.com/product/what-is-dbt" rel="noopener noreferrer"&gt;dbt&lt;/a&gt; é uma ferramenta de transformação de dados que permite que você escreva transformações de dados em &lt;code&gt;SQL&lt;/code&gt;, e que você possa executar essas transformações de maneira programática, testar e documentar essas transformações.&lt;/p&gt;

&lt;p&gt;O dbt vêm em duas versões: &lt;code&gt;dbt Core&lt;/code&gt; e &lt;code&gt;dbt Cloud&lt;/code&gt;. A versão &lt;code&gt;dbt Core&lt;/code&gt; é a versão open source, que você pode instalar e rodar em sua máquina. A versão &lt;code&gt;dbt Cloud&lt;/code&gt; é a versão paga, que roda na nuvem e que oferece funcionalidades adicionais, como agendamento de execuções, monitoramento de execuções, alertas, etc.&lt;/p&gt;

&lt;p&gt;Este artigo irá focar na versão &lt;code&gt;dbt Core&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;Instalação&lt;/h2&gt;

&lt;p&gt;O dbt-core é uma ferramenta de linha de comando, e mais objetivamente, um pacote Python. Para instalar o dbt, você precisa ter o Python instalado em sua máquina. Para instalar o dbt, você pode usar o &lt;code&gt;pip&lt;/code&gt;, o gerenciador de pacotes do Python. Para instalar o dbt, execute o seguinte comando:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb1-1"&gt;&lt;span&gt;pip&lt;/span&gt; install dbt&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Após a instalação, você pode verificar se o dbt foi instalado corretamente executando o seguinte comando:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb2-1"&gt;&lt;span&gt;dbt&lt;/span&gt; &lt;span&gt;--version&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A saída do comando acima deve ser algo como:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb3-1"&gt;&lt;span&gt;dbt&lt;/span&gt; version: 0.21.0&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A próxima etapa é baixar o driver de conexão com o banco de dados que você irá utilizar. O dbt suporta diversos bancos de dados, como &lt;code&gt;PostgreSQL&lt;/code&gt;, &lt;code&gt;Redshift&lt;/code&gt;, &lt;code&gt;BigQuery&lt;/code&gt;, &lt;code&gt;Snowflake&lt;/code&gt;, &lt;code&gt;SQL Server&lt;/code&gt;, &lt;code&gt;MySQL&lt;/code&gt;, &lt;code&gt;SQLite&lt;/code&gt;, entre outros. O driver de conexão com o banco de dados que vamos utilizar aqui é do &lt;code&gt;PostgreSQL&lt;/code&gt;, e você pode executar o seguinte comando para instala-lo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb4-1"&gt;&lt;span&gt;pip&lt;/span&gt; install dbt-postgres&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Configuração&lt;/h2&gt;

&lt;p&gt;Agora que você já instalou o dbt e o driver de conexão com o banco de dados, o próximo passo é configurar o dbt para que ele possa se conectar ao seu banco de dados. Para isso, você precisa criar um arquivo chamado &lt;code&gt;profiles.yml&lt;/code&gt;. Este arquivo pode estar localizado em dois locais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;na pasta &lt;code&gt;~/.dbt/&lt;/code&gt; no linux ou mac&lt;/li&gt;
&lt;li&gt;na pasta do projeto. –&amp;gt; usaremos essa opção, para mantermos todos os arquivos em um único local.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O arquivo &lt;code&gt;profiles.yml&lt;/code&gt; é um arquivo de configuração que contém as informações de conexão com o banco de dados. Abaixo está um exemplo de um arquivo &lt;code&gt;profiles.yml&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb5-1"&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-2"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;outputs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-3"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-4"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; postgres&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-5"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; localhost&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-6"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; myuser&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-7"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pass&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; mypass&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-8"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;port&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;5432&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-9"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dbname&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; mydb&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-10"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;schema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; my_schema&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-11"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;threads&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-12"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;keepalives_idle&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-13"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;target&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; dev&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Neste exemplo, temos um perfil chamado &lt;code&gt;dev&lt;/code&gt; que se conecta a um banco de dados &lt;code&gt;PostgreSQL&lt;/code&gt; local. Você pode adicionar quantos perfis quiser, e cada perfil pode se conectar a um banco de dados diferente.&lt;/p&gt;

&lt;p&gt;Outro fator importante é a questão de segurança. Você não deve armazenar informações sensíveis, como senhas, diretamente no arquivo &lt;code&gt;profiles.yml&lt;/code&gt;. Para isso, você pode utilizar variáveis de ambiente. Por exemplo, você pode substituir o valor da chave &lt;code&gt;pass&lt;/code&gt; por uma variável de ambiente chamada &lt;code&gt;DBT_PASS&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb6-1"&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb6-2"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;outputs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb6-3"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb6-4"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; postgres&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb6-5"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; localhost&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb6-6"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; myuser&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb6-7"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pass&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;"{{ env_var('DBT_PASS') }}"&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb6-8"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;port&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;5432&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb6-9"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dbname&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; mydb&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb6-10"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;schema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; my_schema&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb6-11"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;threads&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb6-12"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;keepalives_idle&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb6-13"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;target&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; dev&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dessa forma, você pode definir a variável de ambiente &lt;code&gt;DBT_PASS&lt;/code&gt; no seu terminal antes de executar o dbt:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb7-1"&gt;&lt;span&gt;export&lt;/span&gt; &lt;span&gt;DBT_PASS&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;mypass&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;No Windows, você pode definir variáveis de ambiente da seguinte maneira:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb8-1"&gt;&lt;span&gt;set&lt;/span&gt; DBT_PASS=mypass&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Outra maneira de definir variáveis de ambiente é criar um arquivo &lt;code&gt;.env&lt;/code&gt; na raiz do seu projeto e adicionar as variáveis de ambiente nele. O dbt irá ler automaticamente as variáveis de ambiente definidas no arquivo &lt;code&gt;.env&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Exemplo de arquivo &lt;code&gt;.env&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb9-1"&gt;&lt;span&gt;DBT_PASS&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;mypass&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Inicializando um projeto dbt&lt;/h2&gt;

&lt;p&gt;Para inicializar um projeto dbt, você pode executar o seguinte comando:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb10-1"&gt;&lt;span&gt;dbt&lt;/span&gt; init my_project&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Este comando irá criar uma estrutura de pastas e arquivos para o seu projeto dbt. A estrutura de pastas e arquivos criada é a seguinte:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;my_project/
|-- analyses
|-- macros
|-- models
|-- seeds
|-- snapshots
|-- tests
|-- .env
|-- .gitignore
|-- dbt_project.yml
|-- profiles.yml&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Aqui está uma breve descrição de cada pasta e arquivo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;analyses&lt;/code&gt;: Pasta onde você pode escrever consultas SQL que serão executadas pelo dbt. As consultas nesta pasta são consultas ad-hoc, ou seja, consultas que você executa manualmente.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;macros&lt;/code&gt;: Pasta onde você pode escrever macros, que são consultas SQL reutilizáveis.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;models&lt;/code&gt;: Pasta onde você escreve as transformações de dados. Cada arquivo nesta pasta é um modelo dbt.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;seeds&lt;/code&gt;: Pasta onde você pode colocar arquivos estáticos com dados de origem - por exemplo - lista de municipios, status, …&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;snapshots&lt;/code&gt;: Pasta onde você pode escrever consultas SQL que criam snapshots de tabelas.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tests&lt;/code&gt;: Pasta onde você pode escrever testes para os modelos dbt.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.env&lt;/code&gt;: Arquivo onde você pode definir variáveis de ambiente.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.gitignore&lt;/code&gt;: Arquivo que contém os arquivos e pastas que você deseja ignorar no Git.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dbt_project.yml&lt;/code&gt;: Arquivo de configuração do projeto dbt.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;profiles.yml&lt;/code&gt;: Arquivo de configuração de conexão com o banco de dados.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;dbt_project.yml&lt;/h2&gt;

&lt;p&gt;O arquivo &lt;code&gt;dbt_project.yml&lt;/code&gt; é o arquivo de configuração do projeto dbt. Este arquivo contém informações sobre o projeto, como o nome do projeto, a versão do projeto, o diretório onde os modelos dbt estão localizados, etc. Aqui está um exemplo de um arquivo &lt;code&gt;dbt_project.yml&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb12-1"&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;'pipeline'&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-2"&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;'1.0.0'&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-3"&gt;&lt;/span&gt;
&lt;span id="cb12-4"&gt;&lt;span&gt;# This setting configures which "profile" dbt uses for this project.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-5"&gt;&lt;span&gt;profile&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;'pipeline'&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-6"&gt;&lt;/span&gt;
&lt;span id="cb12-7"&gt;&lt;span&gt;model-paths&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;"models"&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-8"&gt;&lt;span&gt;analysis-paths&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;"analyses"&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-9"&gt;&lt;span&gt;test-paths&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;"tests"&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-10"&gt;&lt;span&gt;seed-paths&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;"seeds"&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-11"&gt;&lt;span&gt;macro-paths&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;"macros"&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-12"&gt;&lt;span&gt;snapshot-paths&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;"snapshots"&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-13"&gt;&lt;/span&gt;
&lt;span id="cb12-14"&gt;&lt;span&gt;clean-targets&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; # directories to be removed by `dbt clean`&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-15"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;"target"&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-16"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;"dbt_packages"&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-17"&gt;&lt;/span&gt;
&lt;span id="cb12-18"&gt;&lt;span&gt;models&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-19"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pipeline&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-20"&gt;&lt;span&gt; # Config indicated by + and applies to all files under models/example/&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-21"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bronze&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-22"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;schema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; bronze&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-23"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+materialized&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; table&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-24"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;silver&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-25"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;schema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; silver&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-26"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+materialized&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; table&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-27"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gold&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-28"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;schema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; gold&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-29"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+materialized&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; table&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-30"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+post-hook&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;"{{ grant_and_notify(this) }}"&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-31"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;src&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-32"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;schema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; src&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-33"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+materialized&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; table&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-34"&gt;&lt;span&gt;seeds&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-35"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;src&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-36"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+schema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; src&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-37"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+materialized&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; seed&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Neste exemplo, temos um projeto chamado &lt;code&gt;pipeline&lt;/code&gt; com três modelos: &lt;code&gt;bronze&lt;/code&gt;, &lt;code&gt;silver&lt;/code&gt; e &lt;code&gt;gold&lt;/code&gt;. Cada modelo tem um esquema associado e um tipo de materialização. O tipo de materialização pode ser &lt;code&gt;table&lt;/code&gt;, &lt;code&gt;view&lt;/code&gt; ou &lt;code&gt;incremental&lt;/code&gt;. O tipo de materialização &lt;code&gt;table&lt;/code&gt; é o tipo de materialização padrão, e é usado para criar tabelas a partir de consultas SQL. O tipo de materialização &lt;code&gt;view&lt;/code&gt; é usado para criar visualizações a partir de consultas SQL. O tipo de materialização &lt;code&gt;incremental&lt;/code&gt; é usado para criar tabelas incrementais a partir de consultas SQL.&lt;/p&gt;

&lt;p&gt;Este arquivo tem mais itens que são bem interessantes de aprender, e ao longo desta série de artigos, vamos voltar e abordar cada um deles.&lt;/p&gt;

&lt;h2&gt;Escrita de modelos dbt&lt;/h2&gt;

&lt;p&gt;Vamos ao ponto principal do dbt: a escrita de modelos dbt. Um modelo dbt é um arquivo &lt;code&gt;.sql&lt;/code&gt; que contém uma consulta SQL que transforma os dados. Aqui está um exemplo de um modelo dbt:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb13-1"&gt;&lt;span&gt;-- bronze/my_model.sql&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb13-2"&gt;&lt;span&gt;with&lt;/span&gt; my_cte &lt;span&gt;as&lt;/span&gt; (&lt;/span&gt;
&lt;span id="cb13-3"&gt; &lt;span&gt;select&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb13-4"&gt; column1,&lt;/span&gt;
&lt;span id="cb13-5"&gt; column2&lt;/span&gt;
&lt;span id="cb13-6"&gt; &lt;span&gt;from&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb13-7"&gt; my_table&lt;/span&gt;
&lt;span id="cb13-8"&gt;)&lt;/span&gt;
&lt;span id="cb13-9"&gt;&lt;span&gt;select&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb13-10"&gt; column1,&lt;/span&gt;
&lt;span id="cb13-11"&gt; column2&lt;/span&gt;
&lt;span id="cb13-12"&gt;&lt;span&gt;from&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb13-13"&gt; my_cte&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Este modelo dbt é um modelo &lt;code&gt;table&lt;/code&gt;, que cria uma tabela chamada &lt;code&gt;my_model&lt;/code&gt; no esquema &lt;code&gt;bronze&lt;/code&gt;. O modelo dbt contém uma consulta SQL que seleciona as colunas &lt;code&gt;column1&lt;/code&gt; e &lt;code&gt;column2&lt;/code&gt; da tabela &lt;code&gt;my_table&lt;/code&gt; e as insere na tabela &lt;code&gt;my_model&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;Executando o dbt&lt;/h2&gt;

&lt;p&gt;Agore que você já tem um projeto dbt configurado e um modelo dbt escrito, você pode executar o dbt para criar as tabelas no banco de dados. Para executar o dbt, você pode usar o seguinte comando:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb14-1"&gt;&lt;span&gt;dbt&lt;/span&gt; run&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Este comando irá executar todos os modelos dbt no diretório &lt;code&gt;models&lt;/code&gt; e criar as tabelas no banco de dados. Se você quiser executar um modelo dbt específico, você pode usar o seguinte comando:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb15-1"&gt;&lt;span&gt;dbt&lt;/span&gt; run &lt;span&gt;--models&lt;/span&gt; my_model&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Este comando irá executar apenas o modelo &lt;code&gt;my_model&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;Conclusão&lt;/h2&gt;

&lt;p&gt;Neste artigo, você aprendeu o que é o dbt, como instalar o dbt, como configurar o dbt, como inicializar um projeto dbt, como escrever modelos dbt e como executar o dbt. Nos próximos artigos, vamos falar em maiores detalhes sobre as funcionalidades e começar efetivamente a criar o nosso repositório de dados.&lt;/p&gt;



</description>
      <category>dbt</category>
      <category>portfolio</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Teste em Dados - Básico</title>
      <dc:creator>Walter R P Cortes</dc:creator>
      <pubDate>Mon, 28 Oct 2024 00:00:00 +0000</pubDate>
      <link>https://dev.to/wpcortes75/teste-em-dados-basico-b0j</link>
      <guid>https://dev.to/wpcortes75/teste-em-dados-basico-b0j</guid>
      <description>&lt;p&gt;Olá Devs!&lt;/p&gt;

&lt;p&gt;Quando trabalhamos com dados, é necessário que, além de desenvolver todas as transformações necessárias para que os dados estejam prontos para serem utilizados na execução de análises, tenhamos uma maneira de validar a correção e validade dos dados segundo as regras que foram determinadas.&lt;/p&gt;

&lt;p&gt;Uma maneira automatizada e eficiente de fazer isso é através da criação de testes unitários que validem os dados de acordo com as regras estabelecidas.&lt;/p&gt;

&lt;p&gt;Vamos começar???&lt;/p&gt;

&lt;h2&gt;Obtendo os Dados&lt;/h2&gt;

&lt;p&gt;Para este artigo, vamos carregar dados que apresentam alguns erros e vamos construir os testes unitários para valida-los.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb1-1"&gt;&lt;span&gt;import&lt;/span&gt; pandas &lt;span&gt;as&lt;/span&gt; pd&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb2-1"&gt;df &lt;span&gt;=&lt;/span&gt; pd.read_csv(&lt;span&gt;'https://media.githubusercontent.com/media/labeduc/datasets/main/testes/problematic_data.csv'&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Aqui podemos ver uma amostra dos dados:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb3-1"&gt;df.sample(&lt;span&gt;5&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Unnamed: 0&lt;/th&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Age&lt;/th&gt;
&lt;th&gt;Salary&lt;/th&gt;
&lt;th&gt;Join_Date&lt;/th&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;Name17&lt;/td&gt;
&lt;td&gt;56&lt;/td&gt;
&lt;td&gt;4700&lt;/td&gt;
&lt;td&gt;2023-05-31&lt;/td&gt;
&lt;td&gt;Category C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;Name13&lt;/td&gt;
&lt;td&gt;74&lt;/td&gt;
&lt;td&gt;4300&lt;/td&gt;
&lt;td&gt;2023-01-31&lt;/td&gt;
&lt;td&gt;Category B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;Name43&lt;/td&gt;
&lt;td&gt;74&lt;/td&gt;
&lt;td&gt;7300&lt;/td&gt;
&lt;td&gt;2025-07-31&lt;/td&gt;
&lt;td&gt;Category A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;Name14&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;4400&lt;/td&gt;
&lt;td&gt;2023-02-28&lt;/td&gt;
&lt;td&gt;Category B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;Name18&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;4800&lt;/td&gt;
&lt;td&gt;2023-06-30&lt;/td&gt;
&lt;td&gt;Category A&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Para iniciar o nosso processo de validação, precisamos realizar a primeira inspeção nos dados. Para isso, a biblioteca Pandas nos dá algumas funções bem interessantes.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb4-1"&gt;&lt;span&gt;# A função info() exibe informações sobre o DataFrame, &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb4-2"&gt;&lt;span&gt;# incluindo o tipo de dados de cada coluna, &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb4-3"&gt;&lt;span&gt;# valores não nulos e uso de memória.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb4-4"&gt;df.info()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;class 'pandas.core.frame.DataFrame'&amp;gt;
RangeIndex: 50 entries, 0 to 49
Data columns (total 7 columns):
 # Column Non-Null Count Dtype 
--- ------ -------------- ----- 
 0 Unnamed: 0 50 non-null int64 
 1 ID 50 non-null int64 
 2 Name 40 non-null object
 3 Age 50 non-null object
 4 Salary 50 non-null int64 
 5 Join_Date 50 non-null object
 6 Category 50 non-null object
dtypes: int64(3), object(4)
memory usage: 2.9+ KB&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Podemos perceber 2 situações que demandam maior verificação:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A coluna Name tem 10 valores nulos, o que pode ser um problema para as regra de negócio;&lt;/li&gt;
&lt;li&gt;A coluna Age (idade) tem todas as linhas preenchidas, mas seu tipo, em vez de ser um valor do tipo inteiro, é do tipo objeto, o que infica possível problema nos dados.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O que a função info não nos mostra é a presença de valores duplicados, ou até mesmo uma linha inteira duplicada. Vamos então aprender como conseguir essas informações.&lt;/p&gt;

&lt;h1&gt;Tipos de Validação&lt;/h1&gt;

&lt;h2&gt;Dataset está vazio&lt;/h2&gt;

&lt;p&gt;A proprieadade &lt;code&gt;empty&lt;/code&gt; do DataFrame nos informa se o DataFrame está vazio ou não. Se o DataFrame estiver vazio, a propriedade retornará &lt;code&gt;True&lt;/code&gt;, caso contrário, retornará &lt;code&gt;False&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb6-1"&gt;vazio &lt;span&gt;=&lt;/span&gt; df.empty&lt;/span&gt;
&lt;span id="cb6-2"&gt;&lt;/span&gt;
&lt;span id="cb6-3"&gt;&lt;span&gt;print&lt;/span&gt;(&lt;span&gt;f"&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;''&lt;/span&gt; &lt;span&gt;if&lt;/span&gt; vazio &lt;span&gt;else&lt;/span&gt; &lt;span&gt;'Não'&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; está vazio"&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;Não está vazio&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Coluna está vazia&lt;/h2&gt;

&lt;p&gt;A propriedade &lt;code&gt;empty&lt;/code&gt; do DataFrame nos informa se a coluna está vazia ou não. Se a coluna estiver vazia, a propriedade retornará &lt;code&gt;True&lt;/code&gt;, caso contrário, retornará &lt;code&gt;False&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb8-1"&gt;vazio &lt;span&gt;=&lt;/span&gt; df[&lt;span&gt;'Name'&lt;/span&gt;].empty&lt;/span&gt;
&lt;span id="cb8-2"&gt;&lt;/span&gt;
&lt;span id="cb8-3"&gt;&lt;span&gt;print&lt;/span&gt;(&lt;span&gt;f" Coluna Name &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;''&lt;/span&gt; &lt;span&gt;if&lt;/span&gt; vazio &lt;span&gt;else&lt;/span&gt; &lt;span&gt;'Não'&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; está vazia"&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt; Coluna Name Não está vazia&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Verificando Valores Nulos&lt;/h2&gt;

&lt;p&gt;Este teste visa descobrir se existem dados faltando em nosso dataset. Podemos testar de maneira geral ou coluna a coluna. Para isso, utilizamos a função &lt;code&gt;isnull()&lt;/code&gt; que retorna &lt;code&gt;True&lt;/code&gt; para valores nulos e &lt;code&gt;False&lt;/code&gt; para valores não nulos.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb10-1"&gt;&lt;span&gt;# Testando se existe algum valor nulo&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb10-2"&gt;valores_nulos &lt;span&gt;=&lt;/span&gt; df.isnull().values.&lt;span&gt;any&lt;/span&gt;()&lt;/span&gt;
&lt;span id="cb10-3"&gt;&lt;/span&gt;
&lt;span id="cb10-4"&gt;&lt;span&gt;print&lt;/span&gt;(&lt;span&gt;f"&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;''&lt;/span&gt; &lt;span&gt;if&lt;/span&gt; valores_nulos &lt;span&gt;else&lt;/span&gt; &lt;span&gt;'Náo'&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; Existem Valores Nulos."&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt; Existem Valores Nulos.&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb12-1"&gt;&lt;span&gt;# O teste pode ser feito para uma coluna específica&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-2"&gt;valores_nulos &lt;span&gt;=&lt;/span&gt; df[&lt;span&gt;'Name'&lt;/span&gt;].isnull().values.&lt;span&gt;any&lt;/span&gt;()&lt;/span&gt;
&lt;span id="cb12-3"&gt;&lt;/span&gt;
&lt;span id="cb12-4"&gt;&lt;span&gt;print&lt;/span&gt;(&lt;span&gt;f"A coluna Name &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;'tem'&lt;/span&gt; &lt;span&gt;if&lt;/span&gt; valores_nulos &lt;span&gt;else&lt;/span&gt; &lt;span&gt;'não tem'&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; valores nulos."&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;A coluna Name tem valores nulos.&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb14-1"&gt;&lt;span&gt;# O teste pode ser feito para uma coluna específica&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb14-2"&gt;valores_nulos &lt;span&gt;=&lt;/span&gt; df[&lt;span&gt;'Age'&lt;/span&gt;].isnull().values.&lt;span&gt;any&lt;/span&gt;()&lt;/span&gt;
&lt;span id="cb14-3"&gt;&lt;/span&gt;
&lt;span id="cb14-4"&gt;&lt;span&gt;print&lt;/span&gt;(&lt;span&gt;f"A coluna Age &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;'tem'&lt;/span&gt; &lt;span&gt;if&lt;/span&gt; valores_nulos &lt;span&gt;else&lt;/span&gt; &lt;span&gt;'não tem'&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; valores nulos."&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;A coluna Age não tem valores nulos.&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Verificando os tipos de dados&lt;/h2&gt;

&lt;p&gt;Este teste visa verificar se o tipo de dados de uma coluna em todas as linhas do seu dataset é consistente com o objetivo de uso desta coluna. Por exemplo, vimos nos exemplos de dados, que a coluna Age está identificada com o tipo de dados objeto, o que certamente nos causará problemas se quisermos calcular a média de idade de nosso dataset, pois é um indicativo de que em alguma linha desta coluna, o valor não é numérico. Podemos fazer uma inspeção manual, já que estamos falando apenas de 50 linhas, mas vamos aprender a fazer isso de maneira automatizada.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb16-1"&gt;&lt;span&gt;# Testando se a coluna Age é do tipo numérico&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb16-2"&gt;&lt;span&gt;# A função isna() retorna um DataFrame de valores booleanos que indicam se um elemento é um número ou não.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb16-3"&gt;eh_numero &lt;span&gt;=&lt;/span&gt; df[&lt;span&gt;'Age'&lt;/span&gt;].isna().values.&lt;span&gt;any&lt;/span&gt;()&lt;/span&gt;
&lt;span id="cb16-4"&gt;&lt;/span&gt;
&lt;span id="cb16-5"&gt;&lt;span&gt;print&lt;/span&gt;(&lt;span&gt;f"A coluna Age &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;'é'&lt;/span&gt; &lt;span&gt;if&lt;/span&gt; eh_numero &lt;span&gt;else&lt;/span&gt; &lt;span&gt;'não é'&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; do tipo numérico."&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;A coluna Age não é do tipo numérico.&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Mas que valor é este? Vamos usar outra função para descobrir.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb18-1"&gt;&lt;span&gt;# A função unique() retorna uma matriz de valores exclusivos em uma coluna. &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb18-2"&gt;&lt;span&gt;# A função tolist() converte a matriz em uma lista.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb18-3"&gt;&lt;span&gt;print&lt;/span&gt;(&lt;span&gt;f" Valores únicos de Age: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;df[&lt;span&gt;'Age'&lt;/span&gt;]&lt;span&gt;.&lt;/span&gt;unique()&lt;span&gt;.&lt;/span&gt;tolist()&lt;span&gt;}&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt; Valores únicos de Age: ['46', '19', '30', '60', '69', '36', '64', '48', '53', '52', '32', '74', '35', '56', '49', 'Unknown', '57', '44', '54', '28', '41', '39', '62', '21', '71', '42', '38', '22', '59', '55']&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ao usar a função &lt;code&gt;unique()&lt;/code&gt;, podemos descobrir quais são os valores únicos de uma coluna. Se a coluna tiver um tipo de dados numérico, a função retornará uma lista de valores únicos. Se a coluna tiver um tipo de dados não numérico, a função retornará uma lista de strings. Existem uma ou mais linhas com o valor ‘Unknown’ na coluna Age, o que causa o comportamento que vimos anteriormente. Esse é mais um dos problemas a serem corrigidos, que o nosso teste unitário vai nos ajudar a identificar.&lt;/p&gt;



&lt;h1&gt;Outros Tipos de Validação&lt;/h1&gt;

&lt;p&gt;Veja abaixo alguns outros tipos de validação comum em testes de dados&lt;/p&gt;

&lt;h2&gt;Teste contra valores&lt;/h2&gt;

&lt;p&gt;Neste tipo de teste, verificamos se as colunas do nosso dataset respeitam, por exemplo, valores mínimos, máximos, conjunto especificos e limitados de opções, se obedecem a uma lógica dependente de outras colunas, etc.&lt;/p&gt;

&lt;h3&gt;Apenas maiores de 40 anos&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb20-1"&gt;&lt;span&gt;# Primeiro vamos corrigir os unknown&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb20-2"&gt;&lt;/span&gt;
&lt;span id="cb20-3"&gt;df[&lt;span&gt;'Age'&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; (df[&lt;span&gt;'Age'&lt;/span&gt;].&lt;span&gt;apply&lt;/span&gt;(&lt;span&gt;lambda&lt;/span&gt; x: &lt;span&gt;40&lt;/span&gt; &lt;span&gt;if&lt;/span&gt; x &lt;span&gt;==&lt;/span&gt; &lt;span&gt;'Unknown'&lt;/span&gt; &lt;span&gt;else&lt;/span&gt; x)).astype(&lt;span&gt;int&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb20-4"&gt;&lt;/span&gt;
&lt;span id="cb20-5"&gt;&lt;/span&gt;
&lt;span id="cb20-6"&gt;&lt;span&gt;# Agora fazemos a validação&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb20-7"&gt;&lt;/span&gt;
&lt;span id="cb20-8"&gt;menores_de_quarenta &lt;span&gt;=&lt;/span&gt; df.query(&lt;span&gt;'Age &amp;lt; 40'&lt;/span&gt;).empty&lt;/span&gt;
&lt;span id="cb20-9"&gt;&lt;/span&gt;
&lt;span id="cb20-10"&gt;&lt;span&gt;print&lt;/span&gt;(&lt;span&gt;f"&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;'Não Temos'&lt;/span&gt; &lt;span&gt;if&lt;/span&gt; menores_de_quarenta &lt;span&gt;else&lt;/span&gt; &lt;span&gt;'Temos'&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; menores de quarenta"&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;Temos menores de quarenta&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Verifica contra Lista de Valores&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb22-1"&gt;&lt;span&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb22-2"&gt;categoria_invalida &lt;span&gt;=&lt;/span&gt; (df[&lt;span&gt;'Category'&lt;/span&gt;].&lt;span&gt;apply&lt;/span&gt;(&lt;span&gt;lambda&lt;/span&gt; x: x &lt;span&gt;not&lt;/span&gt; &lt;span&gt;in&lt;/span&gt; [&lt;span&gt;'Category A'&lt;/span&gt;, &lt;span&gt;'Category B'&lt;/span&gt;, &lt;span&gt;'Category C'&lt;/span&gt;])).empty&lt;/span&gt;
&lt;span id="cb22-3"&gt;&lt;/span&gt;
&lt;span id="cb22-4"&gt;&lt;span&gt;print&lt;/span&gt;(&lt;span&gt;f"&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;'Não tem'&lt;/span&gt; &lt;span&gt;if&lt;/span&gt; categoria_invalida &lt;span&gt;else&lt;/span&gt; &lt;span&gt;'Tem'&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; categorias invalidas."&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;Tem categorias invalidas.&lt;/code&gt;&lt;/pre&gt;



&lt;h2&gt;EDA&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;EDA&lt;/code&gt; é a sigla para &lt;code&gt;Exploratory Data Analysis&lt;/code&gt;, que em português significa &lt;code&gt;Análise Exploratória de Dados&lt;/code&gt;. Este tipo de teste visa verificar se os dados estão de acordo com o esperado, ou seja, se estão dentro de um intervalo esperado, se não há outliers, se a distribuição dos dados está correta, etc. Ou seja, é uma análise mais aprofundada dos dados, que fazem validações mais complexas e de cunho estatístico.&lt;/p&gt;

&lt;p&gt;Para nos ajudar com essa análise, podemos utilizar a função &lt;code&gt;describe()&lt;/code&gt; do Pandas, que nos dá um resumo estatístico dos dados.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb24-1"&gt;df.describe()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Unnamed: 0&lt;/th&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Age&lt;/th&gt;
&lt;th&gt;Salary&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;count&lt;/td&gt;
&lt;td&gt;50.00000&lt;/td&gt;
&lt;td&gt;50.00000&lt;/td&gt;
&lt;td&gt;50.000000&lt;/td&gt;
&lt;td&gt;50.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mean&lt;/td&gt;
&lt;td&gt;24.50000&lt;/td&gt;
&lt;td&gt;25.50000&lt;/td&gt;
&lt;td&gt;46.320000&lt;/td&gt;
&lt;td&gt;5310.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;std&lt;/td&gt;
&lt;td&gt;14.57738&lt;/td&gt;
&lt;td&gt;14.57738&lt;/td&gt;
&lt;td&gt;14.618188&lt;/td&gt;
&lt;td&gt;1653.351574&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;min&lt;/td&gt;
&lt;td&gt;0.00000&lt;/td&gt;
&lt;td&gt;1.00000&lt;/td&gt;
&lt;td&gt;19.000000&lt;/td&gt;
&lt;td&gt;2000.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;td&gt;12.25000&lt;/td&gt;
&lt;td&gt;13.25000&lt;/td&gt;
&lt;td&gt;36.500000&lt;/td&gt;
&lt;td&gt;4025.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;td&gt;24.50000&lt;/td&gt;
&lt;td&gt;25.50000&lt;/td&gt;
&lt;td&gt;46.000000&lt;/td&gt;
&lt;td&gt;5350.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;75%&lt;/td&gt;
&lt;td&gt;36.75000&lt;/td&gt;
&lt;td&gt;37.75000&lt;/td&gt;
&lt;td&gt;56.000000&lt;/td&gt;
&lt;td&gt;6675.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;max&lt;/td&gt;
&lt;td&gt;49.00000&lt;/td&gt;
&lt;td&gt;50.00000&lt;/td&gt;
&lt;td&gt;74.000000&lt;/td&gt;
&lt;td&gt;8000.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Como podemos ver, a função &lt;code&gt;describe()&lt;/code&gt; nos dá um resumo estatístico dos dados numéricos, como a média, desvio padrão, mínimo, máximo, etc. Com essas informações, podemos fazer validações mais complexas, como verificar se a média de idade está dentro de um intervalo esperado, se a distribuição dos dados está correta, etc. Mas, como podemos ver, a coluna Age não está sendo considerada como numérica, o que nos impede de fazer essas validações. Vamos corrigir isso.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb25-1"&gt;&lt;span&gt;# A correção aplicada foi a substituição dos valores 'Unknown' por 40 e a conversão para inteiro.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-2"&gt;&lt;span&gt;# Por que 40? Porque é um valor que não altera a média e a mediana dos dados.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-3"&gt;&lt;/span&gt;
&lt;span id="cb25-4"&gt;df[&lt;span&gt;'Age'&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; df[&lt;span&gt;'Age'&lt;/span&gt;].&lt;span&gt;apply&lt;/span&gt;(&lt;span&gt;lambda&lt;/span&gt; x: &lt;span&gt;40&lt;/span&gt; &lt;span&gt;if&lt;/span&gt; x &lt;span&gt;==&lt;/span&gt; &lt;span&gt;'Unknown'&lt;/span&gt; &lt;span&gt;else&lt;/span&gt; x).astype(&lt;span&gt;int&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb26-1"&gt;df.describe()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Unnamed: 0&lt;/th&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Age&lt;/th&gt;
&lt;th&gt;Salary&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;count&lt;/td&gt;
&lt;td&gt;50.00000&lt;/td&gt;
&lt;td&gt;50.00000&lt;/td&gt;
&lt;td&gt;50.000000&lt;/td&gt;
&lt;td&gt;50.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mean&lt;/td&gt;
&lt;td&gt;24.50000&lt;/td&gt;
&lt;td&gt;25.50000&lt;/td&gt;
&lt;td&gt;46.320000&lt;/td&gt;
&lt;td&gt;5310.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;std&lt;/td&gt;
&lt;td&gt;14.57738&lt;/td&gt;
&lt;td&gt;14.57738&lt;/td&gt;
&lt;td&gt;14.618188&lt;/td&gt;
&lt;td&gt;1653.351574&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;min&lt;/td&gt;
&lt;td&gt;0.00000&lt;/td&gt;
&lt;td&gt;1.00000&lt;/td&gt;
&lt;td&gt;19.000000&lt;/td&gt;
&lt;td&gt;2000.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;td&gt;12.25000&lt;/td&gt;
&lt;td&gt;13.25000&lt;/td&gt;
&lt;td&gt;36.500000&lt;/td&gt;
&lt;td&gt;4025.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;td&gt;24.50000&lt;/td&gt;
&lt;td&gt;25.50000&lt;/td&gt;
&lt;td&gt;46.000000&lt;/td&gt;
&lt;td&gt;5350.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;75%&lt;/td&gt;
&lt;td&gt;36.75000&lt;/td&gt;
&lt;td&gt;37.75000&lt;/td&gt;
&lt;td&gt;56.000000&lt;/td&gt;
&lt;td&gt;6675.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;max&lt;/td&gt;
&lt;td&gt;49.00000&lt;/td&gt;
&lt;td&gt;50.00000&lt;/td&gt;
&lt;td&gt;74.000000&lt;/td&gt;
&lt;td&gt;8000.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Bom, agora que temos isso resolvido, vamos ao próximo passo: rodar o EDA. O EDA pode ser feito manualmente, mas vamos aprender a fazer isso de maneira automatizada. Para essa análise mais automatizada, vamos usar três ferramentas: &lt;code&gt;jupyter-summarytools&lt;/code&gt;, &lt;code&gt;sweetviz&lt;/code&gt; e &lt;code&gt;dtale&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;Jupyter-summarytools&lt;/h3&gt;

&lt;p&gt;É a versão mais bonita do &lt;code&gt;describe()&lt;/code&gt;. Ele nos dá um resumo estatístico dos dados, mas de uma maneira mais visual e interativa. Para instalar, basta rodar o comando &lt;code&gt;!pip install jupyter-summarytools&lt;/code&gt; no seu Jupyter Notebook.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb27-1"&gt;&lt;span&gt;from&lt;/span&gt; summarytools &lt;span&gt;import&lt;/span&gt; dfSummary&lt;/span&gt;
&lt;span id="cb27-2"&gt;&lt;/span&gt;
&lt;span id="cb27-3"&gt;dfSummary(df)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;
  
  
  T_e3ff2 thead&amp;gt;tr&amp;gt;th {
&lt;/h1&gt;

&lt;p&gt;text-align: left;&lt;br&gt;
}&lt;/p&gt;
&lt;h1&gt;
  
  
  T_e3ff2_row0_col0, #T_e3ff2_row1_col0, #T_e3ff2_row2_col0, #T_e3ff2_row3_col0, #T_e3ff2_row4_col0, #T_e3ff2_row5_col0, #T_e3ff2_row6_col0 {
&lt;/h1&gt;

&lt;p&gt;text-align: left;&lt;br&gt;
  font-size: 12px;&lt;br&gt;
  vertical-align: middle;&lt;br&gt;
  width: 5%;&lt;br&gt;
  max-width: 50px;&lt;br&gt;
  min-width: 20px;&lt;br&gt;
}&lt;/p&gt;
&lt;h1&gt;
  
  
  T_e3ff2_row0_col1, #T_e3ff2_row1_col1, #T_e3ff2_row2_col1, #T_e3ff2_row3_col1, #T_e3ff2_row4_col1, #T_e3ff2_row5_col1, #T_e3ff2_row6_col1 {
&lt;/h1&gt;

&lt;p&gt;text-align: left;&lt;br&gt;
  font-size: 12px;&lt;br&gt;
  vertical-align: middle;&lt;br&gt;
  width: 15%;&lt;br&gt;
  max-width: 200px;&lt;br&gt;
  min-width: 100px;&lt;br&gt;
  word-break: break-word;&lt;br&gt;
}&lt;/p&gt;
&lt;h1&gt;
  
  
  T_e3ff2_row0_col2, #T_e3ff2_row1_col2, #T_e3ff2_row2_col2, #T_e3ff2_row3_col2, #T_e3ff2_row4_col2, #T_e3ff2_row5_col2, #T_e3ff2_row6_col2 {
&lt;/h1&gt;

&lt;p&gt;text-align: left;&lt;br&gt;
  font-size: 12px;&lt;br&gt;
  vertical-align: middle;&lt;br&gt;
  width: 30%;&lt;br&gt;
  min-width: 100px;&lt;br&gt;
}&lt;/p&gt;
&lt;h1&gt;
  
  
  T_e3ff2_row0_col3, #T_e3ff2_row1_col3, #T_e3ff2_row2_col3, #T_e3ff2_row3_col3, #T_e3ff2_row4_col3, #T_e3ff2_row5_col3, #T_e3ff2_row6_col3 {
&lt;/h1&gt;

&lt;p&gt;text-align: left;&lt;br&gt;
  font-size: 12px;&lt;br&gt;
  vertical-align: middle;&lt;br&gt;
  width: 25%;&lt;br&gt;
  min-width: 100px;&lt;br&gt;
}&lt;/p&gt;
&lt;h1&gt;
  
  
  T_e3ff2_row0_col4, #T_e3ff2_row1_col4, #T_e3ff2_row2_col4, #T_e3ff2_row3_col4, #T_e3ff2_row4_col4, #T_e3ff2_row5_col4, #T_e3ff2_row6_col4 {
&lt;/h1&gt;

&lt;p&gt;text-align: left;&lt;br&gt;
  font-size: 12px;&lt;br&gt;
  vertical-align: middle;&lt;br&gt;
  width: 20%;&lt;br&gt;
  min-width: 150px;&lt;br&gt;
}&lt;/p&gt;
&lt;h1&gt;
  
  
  T_e3ff2_row0_col5, #T_e3ff2_row1_col5, #T_e3ff2_row2_col5, #T_e3ff2_row3_col5, #T_e3ff2_row4_col5, #T_e3ff2_row5_col5, #T_e3ff2_row6_col5 {
&lt;/h1&gt;

&lt;p&gt;text-align: left;&lt;br&gt;
  font-size: 12px;&lt;br&gt;
  vertical-align: middle;&lt;br&gt;
  width: 10%;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;

Table 1: &lt;strong&gt;Data Frame Summary&lt;/strong&gt;&lt;br&gt;
df&lt;br&gt;
Dimensions: 50 x 7&lt;br&gt;
Duplicates: 0

&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table id="T_e3ff2"&gt;
&lt;colgroup&gt;
&lt;col&gt;
&lt;col&gt;
&lt;col&gt;
&lt;col&gt;
&lt;col&gt;
&lt;col&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th id="T_e3ff2_level0_col0"&gt;No&lt;/th&gt;
&lt;th id="T_e3ff2_level0_col1"&gt;Variable&lt;/th&gt;
&lt;th id="T_e3ff2_level0_col2"&gt;Stats / Values&lt;/th&gt;
&lt;th id="T_e3ff2_level0_col3"&gt;Freqs / (% of Valid)&lt;/th&gt;
&lt;th id="T_e3ff2_level0_col4"&gt;Graph&lt;/th&gt;
&lt;th id="T_e3ff2_level0_col5"&gt;Missing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td id="T_e3ff2_row0_col0"&gt;1&lt;/td&gt;
&lt;td id="T_e3ff2_row0_col1"&gt;
&lt;strong&gt;Unnamed: 0&lt;/strong&gt;&lt;br&gt;
[int64]&lt;/td&gt;
&lt;td id="T_e3ff2_row0_col2"&gt;Mean (sd) : 24.5 (14.6)&lt;br&gt;
min &amp;lt; med &amp;lt; max:&lt;br&gt;
0.0 &amp;lt; 24.5 &amp;lt; 49.0&lt;br&gt;
IQR (CV) : 24.5 (1.7)&lt;/td&gt;
&lt;td id="T_e3ff2_row0_col3"&gt;50 distinct values&lt;/td&gt;
&lt;td id="T_e3ff2_row0_col4"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Ftestes-001%2Fdata%3Aimage%2Fpng%3Bbase64%2C%2520iVBORw0KGgoAAAANSUhEUgAAAKoAAABGCAYAAABc8A97AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAABxklEQVR4nO3XQU7CYBBA4fkbJSCkDSHCAbwBSw7hYT0EJ2DhxhU7EtKUUDEarCcAKTXqS963baczixcSUtM0If132V8fIF3i5rsXUkqDiOhd%2Bf0sIj6vnO06T91Nvbvr%2FHvTNIdTD8%2BGmlIaTCaTxzzPx223Ho%2FH27quH0aj0UuWZR%2B%2FOU%2FdTb37J%2BZ3u12ZUno6Fet3v6i9PM%2FHi8XiUBTFW5vF6%2FV6vFqt7ufz%2BfNsNivbzHadp%2B6m3t11vqqq%2FnK5HG%2B3215EXBVqREQURfE2nU5f2ywvy3IQETEcDlvPdp2n7qbe%2FRPzETE499A%2FU0IwVCEYqhAMVQiGKgRDFYKhCsFQhWCoQjBUIRiqEAxVCIYqBEMVgqEKwVCFYKhCMFQhGKoQDFUIhioEQxWCoQrBUIVgqEIwVCEYqhAMVQiGKgRDFYKhCsFQhWCoQjBUIRiqEAxVCIYqBEMVgqEKwVCFYKhCMFQhGKoQDFUIhioEQxWCoQrBUIVgqEIwVCEYqhAMVQiGKgRDFYKhCsFQhWCoQjBUIRiqEAxVCIYqBEMVgqEK4eaSl6qq6rf98H6%2F70dE1HXd32w2d785T91Nvbvr%2FCV9fQGSljnmc7n3zQAAAABJRU5ErkJggg%3D%3D" width="800" height="400"&gt;&lt;/td&gt;
&lt;td id="T_e3ff2_row0_col5"&gt;0&lt;br&gt;
(0.0%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td id="T_e3ff2_row1_col0"&gt;2&lt;/td&gt;
&lt;td id="T_e3ff2_row1_col1"&gt;
&lt;strong&gt;ID&lt;/strong&gt;&lt;br&gt;
[int64]&lt;/td&gt;
&lt;td id="T_e3ff2_row1_col2"&gt;Mean (sd) : 25.5 (14.6)&lt;br&gt;
min &amp;lt; med &amp;lt; max:&lt;br&gt;
1.0 &amp;lt; 25.5 &amp;lt; 50.0&lt;br&gt;
IQR (CV) : 24.5 (1.7)&lt;/td&gt;
&lt;td id="T_e3ff2_row1_col3"&gt;50 distinct values&lt;/td&gt;
&lt;td id="T_e3ff2_row1_col4"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Ftestes-001%2Fdata%3Aimage%2Fpng%3Bbase64%2C%2520iVBORw0KGgoAAAANSUhEUgAAAKoAAABGCAYAAABc8A97AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAABxklEQVR4nO3XQU7CYBBA4fkbJSCkDSHCAbwBSw7hYT0EJ2DhxhU7EtKUUDEarCcAKTXqS963baczixcSUtM0If132V8fIF3i5rsXUkqDiOhd%2Bf0sIj6vnO06T91Nvbvr%2FHvTNIdTD8%2BGmlIaTCaTxzzPx223Ho%2FH27quH0aj0UuWZR%2B%2FOU%2FdTb37J%2BZ3u12ZUno6Fet3v6i9PM%2FHi8XiUBTFW5vF6%2FV6vFqt7ufz%2BfNsNivbzHadp%2B6m3t11vqqq%2FnK5HG%2B3215EXBVqREQURfE2nU5f2ywvy3IQETEcDlvPdp2n7qbe%2FRPzETE499A%2FU0IwVCEYqhAMVQiGKgRDFYKhCsFQhWCoQjBUIRiqEAxVCIYqBEMVgqEKwVCFYKhCMFQhGKoQDFUIhioEQxWCoQrBUIVgqEIwVCEYqhAMVQiGKgRDFYKhCsFQhWCoQjBUIRiqEAxVCIYqBEMVgqEKwVCFYKhCMFQhGKoQDFUIhioEQxWCoQrBUIVgqEIwVCEYqhAMVQiGKgRDFYKhCsFQhWCoQjBUIRiqEAxVCIYqBEMVgqEK4eaSl6qq6rf98H6%2F70dE1HXd32w2d785T91Nvbvr%2FCV9fQGSljnmc7n3zQAAAABJRU5ErkJggg%3D%3D" width="800" height="400"&gt;&lt;/td&gt;
&lt;td id="T_e3ff2_row1_col5"&gt;0&lt;br&gt;
(0.0%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td id="T_e3ff2_row2_col0"&gt;3&lt;/td&gt;
&lt;td id="T_e3ff2_row2_col1"&gt;
&lt;strong&gt;Name&lt;/strong&gt;&lt;br&gt;
[object]&lt;/td&gt;
&lt;td id="T_e3ff2_row2_col2"&gt;1. nan&lt;br&gt;
2. Name1&lt;br&gt;
3. Name38&lt;br&gt;
4. Name28&lt;br&gt;
5. Name29&lt;br&gt;
6. Name31&lt;br&gt;
7. Name32&lt;br&gt;
8. Name33&lt;br&gt;
9. Name34&lt;br&gt;
10. Name36&lt;br&gt;
11. other&lt;/td&gt;
&lt;td id="T_e3ff2_row2_col3"&gt;10 (20.0%)&lt;br&gt;
1 (2.0%)&lt;br&gt;
1 (2.0%)&lt;br&gt;
1 (2.0%)&lt;br&gt;
1 (2.0%)&lt;br&gt;
1 (2.0%)&lt;br&gt;
1 (2.0%)&lt;br&gt;
1 (2.0%)&lt;br&gt;
1 (2.0%)&lt;br&gt;
1 (2.0%)&lt;br&gt;
31 (62.0%)&lt;/td&gt;
&lt;td id="T_e3ff2_row2_col4"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Ftestes-001%2Fdata%3Aimage%2Fpng%3Bbase64%2C%2520iVBORw0KGgoAAAANSUhEUgAAAJsAAAD%2BCAYAAAAtWHdlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAADuklEQVR4nO3cQUrjYACG4b9DEd20FKGH6SHmsHOI3KZIs1Bx01mog7r3zWCeZ%2BcqRV5SE%2F7PzfV6HVD4tfQHYD3ERkZsZMRGRmxkxEZGbGTERkZsZDZjjLsxxs1C13%2B5Xq9PC12b2Pb%2B%2Fv73brc7LHHxeZ4fNpvNH8Gtw3a32x1Op9PTfr9%2FLi98uVxup2k6nM%2FnmzGG2FZgO8YY%2B%2F3%2B%2BXg8Pi5w%2FbsFrslCPCCQERsZsZERGxmxkREbGbGRERsZsZERGxmxkREbGbGRERuZ7RivZ8vqCy9xTZa1nef5YZqmw1jgbNk8zw9jjJf6uizDBoHMxr%2FMovL1zuZOw7f5tK6yduI7%2FXpfV51Op6e36Jb6%2B40f7t%2B66u1naye%2BjZe6ZMRGRmxkxEZGbGTERkZsZMRGRmxkxEZGbGTERkZsZBYbvLA%2BHwcvBih8K8fCyRi8kHFnI2PwQsbghYzBCxkvdcmIjYzYyIiNjNjIiI2M2MiIjYzYyIiNjNjIiI2M2MgYvJAxeCHjWDgZgxcyHhDI%2BBolY11FxrqKjHUVGQ8IZMRGRmxkxEZGbGTERkZsZMRGRmxkxEZGbGTERkZsZKyryFhXkXEsnIx1FRl3NjIGL2QMXsgYvJDxUpeM2MiIjYzYyIiNjNjIiI2M2MiIjYzYyIiNjNjIiI2MwQsZgxcyjoWTMXgh485GxuCFjMELGYMXMl7qkhEbGbGRERsZsZERGxmxkREbGbGRERsZsZERGxmxkREbGesqMtZVZGwQyFhXkXFnI2NdRca6iox1FRkvdcmIjYzYyIiNjNjIiI2M2MiIjYzYyIiNjNjIiI2M2MgYvJAxeCHjWDgZgxcy7mxkDF7IGLyQMXgh46UuGbGRERsZsZERGxmxkREbGbGRERsZsZERGxmxkREbGYMXMgYvZBwLJ2PwQsYDAhlfo2Ssq8hYV5GxriLjAYGM2MiIjYzYyIiNjNjIiI2M2MiIjYzYyIiNjNjIiI2MdRUZ6yoyjoWTsa4i485GxuCFjMELGYMXMl7qkhEbGbGRERsZsZERGxmxkREbGbGRERsZsZERGxmxkTF4IWPwQsaxcDIGL2S%2B3tnorebb5NPghd6aRkbb98HLhx0CkcvlcjtN0%2BF8Pt%2BMMX5%2BbGO8Dl6Ox%2BPj0h9mpVYzMvJSl4zYyIiNjNjIiI2M2MiIjYzYyIiNjNjIiI2M2MiIjYzBy4LW9nv%2FOHhZzVGX%2F8maRkaOhS9vNcfCDV7IeEAgIzYyYiMjNjJiIyM2MmIjIzYyYiPzF4xg33yOeCIqAAAAAElFTkSuQmCC" width="800" height="400"&gt;&lt;/td&gt;
&lt;td id="T_e3ff2_row2_col5"&gt;10&lt;br&gt;
(20.0%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td id="T_e3ff2_row3_col0"&gt;4&lt;/td&gt;
&lt;td id="T_e3ff2_row3_col1"&gt;
&lt;strong&gt;Age&lt;/strong&gt;&lt;br&gt;
[int64]&lt;/td&gt;
&lt;td id="T_e3ff2_row3_col2"&gt;Mean (sd) : 46.3 (14.6)&lt;br&gt;
min &amp;lt; med &amp;lt; max:&lt;br&gt;
19.0 &amp;lt; 46.0 &amp;lt; 74.0&lt;br&gt;
IQR (CV) : 19.5 (3.2)&lt;/td&gt;
&lt;td id="T_e3ff2_row3_col3"&gt;30 distinct values&lt;/td&gt;
&lt;td id="T_e3ff2_row3_col4"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Ftestes-001%2Fdata%3Aimage%2Fpng%3Bbase64%2C%2520iVBORw0KGgoAAAANSUhEUgAAAKoAAABGCAYAAABc8A97AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAACf0lEQVR4nO3bQYriQBiG4apJK1EhQQTdeYGBWbj0EHPYOcIsPIE3cCeIREx3MMbMeqDp1qqU5iveZx8rkBe7y8pv27Y1QN%2F9ePUNAPd4e%2FUN4H%2FW2pExZujxEZe2bT%2B6up%2B%2BINQesdaOZrPZ7yzLpq6fcTqdjtbaP7HFSqj9MsyybLperz%2FyPK8evbgoinSz2UwPh8PQGEOoCCvP82o%2Bn787Xj7q9GZ6gs0UJBAqJBAqJBAqJBAqJBAqJBAqJBAqJBAqJBAqJBAqJBAqJBAqJBAqJBAqJBAqJBAqJBAqJBAqJEQ7M8XYcVyiDJWx4%2FhEGaph7Dg6sYZqjGHsOCZspiAh6m9UH03TDIwxmbXW5XI2Yh0j1E%2BUZTmo6%2FrXcrlMkiR5%2BH9cNmLdI9RPXC6XtzRNx6vVqlosFsdHrmUjFgahfmEymbhuxtiIdYzNFCQQKiQQKiQQKiQQKiQQKiQQKiR8%2Bzuq53udXkeJHmtnt9tt4Lou3IRs5ctQfd%2Fr9DlK9Fm7ruu0aZqfVVX9Nca4vj2FB4Ru5btvVOf3Ojs4SnRee7fbTbfb7fh6vSYO68JN0FbuOkL1eK%2FT%2ByjRZe3j8cgR5ouEaoXNFCQQKiQQKiQQKiQQKiQQKiQQKiQwihKAxwSr99FvrNOzhNoxnwlW36PfmKdnCbVjPhOsvke%2FMU%2FPEmogLhOsXR39xjg9y2YKEggVEggVEggVEggVEggVEggVEoL%2Bjup5nMck6ZP1%2BXkFC9X3OI9J0ufq%2B%2FMKFqrPcZ4xTJI%2BW9%2BfV%2FAjVNfjPCZJX6Ovz4vNFCQQKiTc9ae%2FKIr00Q8%2Bn8%2BpMcaUZZnu9%2FvxM69XXVv1vn2vv6evf1x2vLqhBkfLAAAAAElFTkSuQmCC" width="800" height="400"&gt;&lt;/td&gt;
&lt;td id="T_e3ff2_row3_col5"&gt;0&lt;br&gt;
(0.0%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td id="T_e3ff2_row4_col0"&gt;5&lt;/td&gt;
&lt;td id="T_e3ff2_row4_col1"&gt;
&lt;strong&gt;Salary&lt;/strong&gt;&lt;br&gt;
[int64]&lt;/td&gt;
&lt;td id="T_e3ff2_row4_col2"&gt;Mean (sd) : 5310.0 (1653.4)&lt;br&gt;
min &amp;lt; med &amp;lt; max:&lt;br&gt;
2000.0 &amp;lt; 5350.0 &amp;lt; 8000.0&lt;br&gt;
IQR (CV) : 2650.0 (3.2)&lt;/td&gt;
&lt;td id="T_e3ff2_row4_col3"&gt;48 distinct values&lt;/td&gt;
&lt;td id="T_e3ff2_row4_col4"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Ftestes-001%2Fdata%3Aimage%2Fpng%3Bbase64%2C%2520iVBORw0KGgoAAAANSUhEUgAAAKoAAABGCAYAAABc8A97AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAChUlEQVR4nO3dv4riUBiG8e%2FoKPEPCSKrnc2WC1tYehF7sXsJW3gFFttMZSeIRMyOGGO22VmmGNTkRJMXnl9%2F5jsJDwNJMHF5nhvQdK26NwDc46XuDVzjnOuZWbfk8paZXTzGn%2FI8fyuz0HPfpedWMNv3nPmsv3rcjQ3VOdcbj8c%2FwjAcFV2bZVknSZKvw%2BHwtdVqpWXm7%2Ff7nXPuZ9FofPbtM9d3tu85811%2F67gbG6qZdcMwHC0Wi7coio5FFq7X69Fqtfoyn89%2FT6fTXdHBcRwHy%2BVytN1uu2ZWNJjS%2B%2Fac6zXb95z5rL%2FnuJscqpmZRVF0nEwmf4qs2e12PTOzwWBQeO0HvZLrzKzcvquYW3a27zmr4JxfPW4upiCBUCGBUCGBUCGBUCGBUCGBUCGh8fdR65JlWcfMQudc0aXh5XLp1DDXe3aTEeonkiTppGn6fTabtdvtdqEnPGmaBlmWfTsej7%2FMrNCNb5%2B5vrObjlA%2FcTqdXoIg6M%2Fn82PRx4H%2FHiX2z%2Bdz%2B5lzfWc3HaFeUeZx4PujxGfPrWp2U3ExBQmECgmECgmECgmECgmECgmECgmECgmECgmECgmECgmECgmECgmECgmECgmECgmECgmECgmECgk3fzNV59uTgXdXQ63z7cnAR7f%2Bo9b59mTgv7t%2BLl3n25MBMy6mIIJQIYFQIYFQIYFQIYFQIYFQIYFQIYFQIYFQIYFQIYFQIYFQIYFQIYFQIYFQIYFQIYFQIeGhX%2B7jA7SoysNC5QO0qNLDQuUDtKjSwz%2FaywdoUQUupiCBUCGBUCGBUCGBUCGBUCGBUCHhrvuocRwHRf%2Fw4XAIzMySJAk2m03%2FmetVZ6vu23f9PX39BVwWjdGl3F3FAAAAAElFTkSuQmCC" width="800" height="400"&gt;&lt;/td&gt;
&lt;td id="T_e3ff2_row4_col5"&gt;0&lt;br&gt;
(0.0%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td id="T_e3ff2_row5_col0"&gt;6&lt;/td&gt;
&lt;td id="T_e3ff2_row5_col1"&gt;
&lt;strong&gt;Join_Date&lt;/strong&gt;&lt;br&gt;
[object]&lt;/td&gt;
&lt;td id="T_e3ff2_row5_col2"&gt;1. 2022-01-31&lt;br&gt;
2. 2025-02-28&lt;br&gt;
3. 2024-04-30&lt;br&gt;
4. 2024-05-31&lt;br&gt;
5. 2024-06-30&lt;br&gt;
6. 2024-07-31&lt;br&gt;
7. 2024-08-31&lt;br&gt;
8. 2024-09-30&lt;br&gt;
9. 2024-10-31&lt;br&gt;
10. 2024-11-30&lt;br&gt;
11. other&lt;/td&gt;
&lt;td id="T_e3ff2_row5_col3"&gt;1 (2.0%)&lt;br&gt;
1 (2.0%)&lt;br&gt;
1 (2.0%)&lt;br&gt;
1 (2.0%)&lt;br&gt;
1 (2.0%)&lt;br&gt;
1 (2.0%)&lt;br&gt;
1 (2.0%)&lt;br&gt;
1 (2.0%)&lt;br&gt;
1 (2.0%)&lt;br&gt;
1 (2.0%)&lt;br&gt;
40 (80.0%)&lt;/td&gt;
&lt;td id="T_e3ff2_row5_col4"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Ftestes-001%2Fdata%3Aimage%2Fpng%3Bbase64%2C%2520iVBORw0KGgoAAAANSUhEUgAAAJsAAAD%2BCAYAAAAtWHdlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAADjElEQVR4nO3cQUobcRyG4V8kiG4iIniYHKKH7SFymyDJohY36aK2aDeFQt%2BByfPsshAHfJkww%2F9zc7lcBgo3S18A10NsZMRGRmxkxEZGbGTERkZsZMRGZjMz9zNz%2B%2F757XK5vC54PazY9unp6ctut3ucmTmfzy%2Bbzear4Pgfbna73eN%2Bv3%2Fd7%2Fev79Hd%2FvWn4B9sZ2YeHh6%2Bv3%2B%2BX%2FBaWDkPCGTERkZsZMRGRmxkxEZGbGTERkZsZMRGRmxkxEZGbGTERmY7M3M6ne6WvhDWb3s%2Bn18Oh8Pvk7oz87bwNbFSNghkNv5lFhV3NjLWVWSsq8hYV5HxUpeM2MiIjYzYyIiNjNjIiI2M2MiIjYzYyIiNjNjIiI2MwQsZgxcyjoWTMXgh485GxuCFjMELGYMXMl7qkhEbGbGRERsZsZERGxmxkREbGbGRERsZsZERGxmxkTF4IWPwQsaxcDIGL2Q8IJDxNUrGuoqMdRUZ6yoyHhDIiI2M2MiIjYzYyIiNjNjIiI2M2MiIjYzYyIiNjNjIWFeRsa4i41g4GesqMu5sZAxeyBi8kDF4IeOlLhmxkREbGbGRERsZsZERGxmxkREbGbGRERsZsZERGxmDFzIGL2QcCydj8ELGnY2MwQsZgxcyBi9kvNQlIzYyYiMjNjJiIyM2MmIjIzYyYiMjNjJiIyM2MmIjIzYy1lVkrKvI2CCQsa4i485GxrqKjHUVGesqMl7qkhEbGbGRERsZsZERGxmxkREbGbGRERsZsZERGxmxkTF4IWPwQsaxcDIGL2Tc2cgYvJAxeCFj8ELGS10yYiMjNjJiIyM2MmIjIzYyYiMjNjJiIyM2MmIjIzYyBi9kDF7IOBZOxuCFjAcEMr5GyVhXkbGuImNdRcYDAhmxkREbGbGRERsZsZERGxmxkREbGbGRERsZsZERGxnrKjLWVWQcCydjXUXGnY2MwQsZgxcyBi9kvNQlIzYyYiMjNjJiIyM2MmIjIzYyYiMjNjJiIyM2MmIjY%2FBCxuCFjGPhZAxeyPx5Z2P9Fvv2%2BjR4Yf2WHDVtfw1ePuwQWKnT6XR3OBwej8fj7cz0sc38HLw8Pz9%2Fq385i1hs1OSlLhmxkREbGbGRERsZsZERGxmxkREbGbGRERsZsZERGxmDlyuy9N%2F54%2BDF%2F9O9AkuOmhwLvz6LHQs3eCHjAYGM2MiIjYzYyIiNjNjIiI2M2MiIjcwPft%2FTHfATJ2MAAAAASUVORK5CYII%3D" width="800" height="400"&gt;&lt;/td&gt;
&lt;td id="T_e3ff2_row5_col5"&gt;0&lt;br&gt;
(0.0%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td id="T_e3ff2_row6_col0"&gt;7&lt;/td&gt;
&lt;td id="T_e3ff2_row6_col1"&gt;
&lt;strong&gt;Category&lt;/strong&gt;&lt;br&gt;
[object]&lt;/td&gt;
&lt;td id="T_e3ff2_row6_col2"&gt;1. Category A&lt;br&gt;
2. Category B&lt;br&gt;
3. Category C&lt;br&gt;
4. No Category&lt;/td&gt;
&lt;td id="T_e3ff2_row6_col3"&gt;19 (38.0%)&lt;br&gt;
15 (30.0%)&lt;br&gt;
13 (26.0%)&lt;br&gt;
3 (6.0%)&lt;/td&gt;
&lt;td id="T_e3ff2_row6_col4"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Ftestes-001%2Fdata%3Aimage%2Fpng%3Bbase64%2C%2520iVBORw0KGgoAAAANSUhEUgAAAJsAAABcCAYAAAB5jMeAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAB8klEQVR4nO3bQWrbQACF4VERodlIGIMP40P0sD2EbmOMtUhCNuqi20JMY7%2FRSN93gjH8yIzQ65ZlKZDwo%2FYB2A%2BxEdOVUl5LKS%2B1DxLyuSzLe%2B1D7FV%2FPB5%2FDcNwqH2QhHmer13X%2FRZcHf0wDIfz%2Bfw%2BjuNH7cM80%2B12%2BzlN0%2BFyubyUUsRWQV9KKeM4fpxOp7fahwl4rX2APXNBIEZsxIiNGLERIzZixEaM2IgRGzFiI0ZsxIiNGLERIzZi%2BlL%2Bfn5T%2ByDPtoffuHb9PM%2FXaZoOZQef38zzfC2lfNY%2Bx175LJyYzpSPFBcEYlr%2FG%2FW32JCm11XWUm1pdl1lLdWe1tdVm39dsyUuCMSIjRixESM2YsRGjNiIERsxYiNGbMSIjRixESM2YsRGjNiIaXbK1%2BKZ967pKZ9pXltsEIgx5SOmhSebp9dGrH5dZUG1HateV1lQbUsL66rmbsn8m5e6xIiNGLERIzZixEaM2IgRGzFiI0ZsxIiNGLERIzZixEaM2IhZ9bpqrefi%2F6x%2BXWVBtR02CMRYVxFz75PN04Vvu2tdZeHEI3y5rrJw4lHuXVet8qZKW7zUJUZsxIiNGLERIzZixEaM2IgRGzFiI0ZsxIiNGLERIzZixEbMl%2BsqCyce5a51lYUTj2CDQIx1FTEuCMT8AbNY2LkzuLoMAAAAAElFTkSuQmCC" width="800" height="400"&gt;&lt;/td&gt;
&lt;td id="T_e3ff2_row6_col5"&gt;0&lt;br&gt;
(0.0%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;Sweetviz&lt;/h3&gt;

&lt;p&gt;O Sweetviz é uma ferramenta que nos dá um relatório completo dos dados, com gráficos e tabelas que nos ajudam a entender melhor os dados. Para instalar, basta rodar o comando &lt;code&gt;!pip install sweetviz&lt;/code&gt; no seu Jupyter Notebook. Ele é muito fácil de usar, basta rodar o comando &lt;code&gt;sweetviz.analyze([seu_dataframe])&lt;/code&gt; e ele vai gerar um relatório completo dos seus dados.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb28-1"&gt;&lt;span&gt;import&lt;/span&gt; sweetviz &lt;span&gt;as&lt;/span&gt; sv&lt;/span&gt;
&lt;span id="cb28-2"&gt;&lt;/span&gt;
&lt;span id="cb28-3"&gt;my_report &lt;span&gt;=&lt;/span&gt; sv.analyze(df)&lt;/span&gt;
&lt;span id="cb28-4"&gt;&lt;/span&gt;
&lt;span id="cb28-5"&gt;&lt;span&gt;# Exibindo o relatório no próprio notebook&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb28-6"&gt;&lt;span&gt;# Existem outras opções de saída, como HTML e JSON.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb28-7"&gt;my_report.show_notebook()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;D-Tale&lt;/h3&gt;

&lt;p&gt;O D-Tale é uma ferramenta que nos dá um relatório completo dos dados, com gráficos e tabelas que nos ajudam a entender melhor os dados. Para instalar, basta rodar o comando &lt;code&gt;!pip install dtale&lt;/code&gt; no seu Jupyter Notebook. Ele é muito fácil de usar, basta rodar o comando &lt;code&gt;dtale.show([seu_dataframe])&lt;/code&gt; e ele vai gerar um relatório completo dos seus dados.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb29-1"&gt;&lt;span&gt;import&lt;/span&gt; dtale&lt;/span&gt;
&lt;span id="cb29-2"&gt;&lt;/span&gt;
&lt;span id="cb29-3"&gt;&lt;span&gt;import&lt;/span&gt; dtale.app &lt;span&gt;as&lt;/span&gt; dtale_app&lt;/span&gt;
&lt;span id="cb29-4"&gt;&lt;/span&gt;
&lt;span id="cb29-5"&gt;dtale_app.USE_COLAB &lt;span&gt;=&lt;/span&gt; &lt;span&gt;True&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb29-6"&gt;&lt;/span&gt;
&lt;span id="cb29-7"&gt;dtale.show(df)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Infelizmente, não podemos ver o resultado aqui, mas você pode rodar no seu Jupyter Notebook ou Google Colab e ver o resultado.&lt;/p&gt;


&lt;br&gt;


&lt;h1&gt;Criando os testes unitários&lt;/h1&gt;

&lt;p&gt;Agora que sabemos sobre alguns dos tipos de testes que podemos aplicar aos nossos dados, vamos aprender como organizar isso de uma forma prática.&lt;/p&gt;

&lt;p&gt;A idéia é englobar os testes aprendidos em funções que podem ser chamadas a qualquer momento, assim a cada alteração que fazemos no dataset, podemos validar o mesmo.&lt;/p&gt;

&lt;p&gt;Em primeiro lugar, englobamos os testes que fizemos em funções.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb30-1"&gt;&lt;span&gt;def&lt;/span&gt; teste_nulos(data_frame, coluna&lt;span&gt;=&lt;/span&gt;&lt;span&gt;None&lt;/span&gt;):&lt;/span&gt;
&lt;span id="cb30-2"&gt; &lt;span&gt;"""Verifica se o DataFrame ou uma Coluna específica possui valores nulos.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb30-3"&gt;&lt;/span&gt;
&lt;span id="cb30-4"&gt;&lt;span&gt; Returns:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb30-5"&gt;&lt;span&gt; True se houver valores nulos, False caso contrário.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb30-6"&gt;&lt;span&gt; """&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb30-7"&gt; &lt;span&gt;if&lt;/span&gt; coluna &lt;span&gt;is&lt;/span&gt; &lt;span&gt;None&lt;/span&gt;:&lt;/span&gt;
&lt;span id="cb30-8"&gt; &lt;span&gt;return&lt;/span&gt; data_frame.isnull().values.&lt;span&gt;any&lt;/span&gt;()&lt;/span&gt;
&lt;span id="cb30-9"&gt; &lt;span&gt;else&lt;/span&gt;:&lt;/span&gt;
&lt;span id="cb30-10"&gt; &lt;span&gt;return&lt;/span&gt; data_frame[coluna].isnull().values.&lt;span&gt;any&lt;/span&gt;()&lt;/span&gt;
&lt;span id="cb30-11"&gt;&lt;/span&gt;
&lt;span id="cb30-12"&gt;&lt;/span&gt;
&lt;span id="cb30-13"&gt;&lt;span&gt;def&lt;/span&gt; teste_eh_numero(data_frame, coluna):&lt;/span&gt;
&lt;span id="cb30-14"&gt; &lt;span&gt;"""Verifica se os valores de uma coluna são numéricos.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb30-15"&gt;&lt;/span&gt;
&lt;span id="cb30-16"&gt;&lt;span&gt; Returns:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb30-17"&gt;&lt;span&gt; True se algum dos valores não é numérico, False caso contrário.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb30-18"&gt;&lt;span&gt; """&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb30-19"&gt; &lt;span&gt;from&lt;/span&gt; pandas.api.types &lt;span&gt;import&lt;/span&gt; is_numeric_dtype&lt;/span&gt;
&lt;span id="cb30-20"&gt;&lt;/span&gt;
&lt;span id="cb30-21"&gt; &lt;span&gt;return&lt;/span&gt; is_numeric_dtype(data_frame[coluna])&lt;/span&gt;
&lt;span id="cb30-22"&gt;&lt;/span&gt;
&lt;span id="cb30-23"&gt;&lt;/span&gt;
&lt;span id="cb30-24"&gt;&lt;span&gt;def&lt;/span&gt; teste_vazio(data_frame, coluna&lt;span&gt;=&lt;/span&gt;&lt;span&gt;None&lt;/span&gt;):&lt;/span&gt;
&lt;span id="cb30-25"&gt; &lt;span&gt;"""Verifica se o DataFrame ou uma Coluna específica está vazio.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb30-26"&gt;&lt;/span&gt;
&lt;span id="cb30-27"&gt;&lt;span&gt; Returns:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb30-28"&gt;&lt;span&gt; True se estiver vazio, False caso contrário.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb30-29"&gt;&lt;span&gt; """&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb30-30"&gt; &lt;span&gt;if&lt;/span&gt; coluna &lt;span&gt;is&lt;/span&gt; &lt;span&gt;None&lt;/span&gt;:&lt;/span&gt;
&lt;span id="cb30-31"&gt; &lt;span&gt;return&lt;/span&gt; data_frame.empty&lt;/span&gt;
&lt;span id="cb30-32"&gt; &lt;span&gt;else&lt;/span&gt;:&lt;/span&gt;
&lt;span id="cb30-33"&gt; &lt;span&gt;return&lt;/span&gt; data_frame[coluna].empty&lt;/span&gt;
&lt;span id="cb30-34"&gt;&lt;/span&gt;
&lt;span id="cb30-35"&gt;&lt;/span&gt;
&lt;span id="cb30-36"&gt;&lt;span&gt;def&lt;/span&gt; teste_condicional(data_frame, condicao):&lt;/span&gt;
&lt;span id="cb30-37"&gt; &lt;span&gt;"""Verifica se o DataFrame atende a uma condição.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb30-38"&gt;&lt;/span&gt;
&lt;span id="cb30-39"&gt;&lt;span&gt; Returns:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb30-40"&gt;&lt;span&gt; True se atender a condicão, False caso contrário.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb30-41"&gt;&lt;span&gt; """&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb30-42"&gt; result &lt;span&gt;=&lt;/span&gt; data_frame.query(condicao)&lt;/span&gt;
&lt;span id="cb30-43"&gt; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;not&lt;/span&gt;(result.empty)&lt;/span&gt;
&lt;span id="cb30-44"&gt;&lt;/span&gt;
&lt;span id="cb30-45"&gt;&lt;/span&gt;
&lt;span id="cb30-46"&gt;&lt;span&gt;def&lt;/span&gt; teste_valores(data_frame, coluna, valores):&lt;/span&gt;
&lt;span id="cb30-47"&gt; &lt;span&gt;"""Verifica se os valores de uma coluna estão contidos em uma lista.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb30-48"&gt;&lt;/span&gt;
&lt;span id="cb30-49"&gt;&lt;span&gt; Returns:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb30-50"&gt;&lt;span&gt; True se estiver na lista, False caso contrário.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb30-51"&gt;&lt;span&gt; """&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb30-52"&gt; result &lt;span&gt;=&lt;/span&gt; data_frame[coluna].&lt;span&gt;apply&lt;/span&gt;(&lt;span&gt;lambda&lt;/span&gt; x: x &lt;span&gt;in&lt;/span&gt; valores).&lt;span&gt;any&lt;/span&gt;()&lt;/span&gt;
&lt;span id="cb30-53"&gt; &lt;span&gt;return&lt;/span&gt; result&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A próxima etapa é criar uma função que irá chamar todas essas funções utilizando o comando &lt;a href="https://www.hashtagtreinamentos.com/assert-em-python?gad_source=1&amp;amp;gclid=CjwKCAjwnK60BhA9EiwAmpHZwyuM4NTnpYRAah1I0XwTUgO6m60fiSbxWIM_RmxkwLHddA-Yl9DqPBoCbrQQAvD_BwE" rel="noopener noreferrer"&gt;assert&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O comando &lt;code&gt;assert&lt;/code&gt; é utilizado para verificar se uma expressão é verdadeira. Se a expressão for verdadeira, o programa continua a execução normalmente. Se a expressão for falsa, o programa lança uma exceção do tipo &lt;code&gt;AssertionError&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb31-1"&gt;&lt;span&gt;def&lt;/span&gt; run_unit_test(data_frame):&lt;/span&gt;
&lt;span id="cb31-2"&gt; &lt;span&gt;try&lt;/span&gt;:&lt;/span&gt;
&lt;span id="cb31-3"&gt; &lt;span&gt;assert&lt;/span&gt; teste_nulos(data_frame) &lt;span&gt;==&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;, &lt;span&gt;'Existem valores nulos'&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb31-4"&gt; &lt;span&gt;assert&lt;/span&gt; teste_nulos(data_frame, &lt;span&gt;'Name'&lt;/span&gt;) &lt;span&gt;==&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;, &lt;span&gt;'Existem valores nulos na coluna Name'&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb31-5"&gt; &lt;span&gt;assert&lt;/span&gt; teste_eh_numero(data_frame, &lt;span&gt;'Age'&lt;/span&gt;), &lt;span&gt;'A coluna Age não é do tipo numérico'&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb31-6"&gt; &lt;span&gt;assert&lt;/span&gt; teste_vazio(data_frame) &lt;span&gt;==&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;, &lt;span&gt;'O data_frame está vazio'&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb31-7"&gt; &lt;span&gt;assert&lt;/span&gt; teste_condicional(data_frame, &lt;span&gt;'Age &amp;lt; 40'&lt;/span&gt;) &lt;span&gt;==&lt;/span&gt; &lt;span&gt;True&lt;/span&gt;, &lt;span&gt;'Não tem menores de quarenta'&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb31-8"&gt; &lt;span&gt;assert&lt;/span&gt; teste_valores(data_frame, &lt;span&gt;'Category'&lt;/span&gt;, [&lt;span&gt;'Category A'&lt;/span&gt;, &lt;span&gt;'Category B'&lt;/span&gt;, &lt;span&gt;'Category C'&lt;/span&gt;]) &lt;span&gt;==&lt;/span&gt; &lt;span&gt;True&lt;/span&gt;, &lt;span&gt;'Categoria Invalida'&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb31-9"&gt; &lt;span&gt;print&lt;/span&gt;(&lt;span&gt;'Testes finalizados com sucesso.'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb31-10"&gt; &lt;span&gt;except&lt;/span&gt; &lt;span&gt;AssertionError&lt;/span&gt; &lt;span&gt;as&lt;/span&gt; e:&lt;/span&gt;
&lt;span id="cb31-11"&gt; &lt;span&gt;print&lt;/span&gt;(e)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Tendo criado a função, agora só resta executa-la, observar as falhas, aplicar as correções e rodar os testes unitários novamente, até que todos passem.&lt;/p&gt;

&lt;h4&gt;1a Execução&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb32-1"&gt;run_unit_test(df)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;Existem valores nulos&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Para determinar isso, podemos apenas chamar a função info() do dataframe, que nos dá informações sobre o dataset, como o número de linhas, colunas, tipos de dados, etc.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb34-1"&gt;df.info()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;class 'pandas.core.frame.DataFrame'&amp;gt;
RangeIndex: 50 entries, 0 to 49
Data columns (total 7 columns):
 # Column Non-Null Count Dtype 
--- ------ -------------- ----- 
 0 Unnamed: 0 50 non-null int64 
 1 ID 50 non-null int64 
 2 Name 40 non-null object
 3 Age 50 non-null int64 
 4 Salary 50 non-null int64 
 5 Join_Date 50 non-null object
 6 Category 50 non-null object
dtypes: int64(4), object(3)
memory usage: 2.9+ KB&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;O campo Name está com problema. Vamos corrigir isso.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb36-1"&gt;df[&lt;span&gt;'Name'&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; df[&lt;span&gt;'Name'&lt;/span&gt;].fillna(&lt;span&gt;'Desconhecido'&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora, vamos para a segunda execução.&lt;/p&gt;

&lt;h4&gt;2a Execução&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb37-1"&gt;run_unit_test(df)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;Testes finalizados com sucesso.&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora, é a coluna Age que está com problema. Vamos corrigir isso.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb39-1"&gt;df[&lt;span&gt;'Age'&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; pd.to_numeric(df[&lt;span&gt;'Age'&lt;/span&gt;])&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vamos para a 3a execução.&lt;/p&gt;

&lt;h4&gt;3a Execução&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb40-1"&gt;run_unit_test(df)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;Testes finalizados com sucesso.&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vamos ver os valores possíveis do campo Category.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb42-1"&gt;df[&lt;span&gt;'Category'&lt;/span&gt;].unique().tolist()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;['Category B', 'Category C', 'Category A', 'No Category']&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Temos um No Category ali que está fazendo o teste falhar. Vamos corrigir isso. Mas qual seria a melhor correção? Trocar o valor por um dos válidos ou corrigir o teste? A resposta dependerá do contexto do negócio. Aqui, vamos assumir que corrigir o teste é a melhor alternativa.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb44-1"&gt;&lt;span&gt;def&lt;/span&gt; run_unit_test(data_frame):&lt;/span&gt;
&lt;span id="cb44-2"&gt; &lt;span&gt;try&lt;/span&gt;:&lt;/span&gt;
&lt;span id="cb44-3"&gt; &lt;span&gt;assert&lt;/span&gt; teste_nulos(data_frame) &lt;span&gt;==&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;, &lt;span&gt;"Existem valores nulos"&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb44-4"&gt; &lt;span&gt;assert&lt;/span&gt; (&lt;/span&gt;
&lt;span id="cb44-5"&gt; teste_nulos(data_frame, &lt;span&gt;"Name"&lt;/span&gt;) &lt;span&gt;==&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb44-6"&gt; ), &lt;span&gt;"Existem valores nulos na coluna Name"&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb44-7"&gt; &lt;span&gt;assert&lt;/span&gt; teste_eh_numero(data_frame, &lt;span&gt;"Age"&lt;/span&gt;), &lt;span&gt;"A coluna Age não é do tipo numérico"&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb44-8"&gt; &lt;span&gt;assert&lt;/span&gt; teste_vazio(data_frame) &lt;span&gt;==&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;, &lt;span&gt;"O data_frame está vazio"&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb44-9"&gt; &lt;span&gt;assert&lt;/span&gt; (&lt;/span&gt;
&lt;span id="cb44-10"&gt; teste_condicional(data_frame, &lt;span&gt;"Age &amp;lt; 40"&lt;/span&gt;) &lt;span&gt;==&lt;/span&gt; &lt;span&gt;True&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb44-11"&gt; ), &lt;span&gt;"Não tem menores de quarenta"&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb44-12"&gt; &lt;span&gt;assert&lt;/span&gt; (&lt;/span&gt;
&lt;span id="cb44-13"&gt; teste_valores(&lt;/span&gt;
&lt;span id="cb44-14"&gt; data_frame, &lt;span&gt;"Category"&lt;/span&gt;, [&lt;span&gt;"Category A"&lt;/span&gt;, &lt;span&gt;"Category B"&lt;/span&gt;, &lt;span&gt;"Category C"&lt;/span&gt;, &lt;span&gt;"No Category"&lt;/span&gt;]&lt;/span&gt;
&lt;span id="cb44-15"&gt; )&lt;/span&gt;
&lt;span id="cb44-16"&gt; &lt;span&gt;==&lt;/span&gt; &lt;span&gt;True&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb44-17"&gt; ), &lt;span&gt;"Categoria Invalida"&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb44-18"&gt; &lt;span&gt;print&lt;/span&gt;(&lt;span&gt;"Testes finalizados com sucesso."&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb44-19"&gt; &lt;span&gt;except&lt;/span&gt; &lt;span&gt;AssertionError&lt;/span&gt; &lt;span&gt;as&lt;/span&gt; e:&lt;/span&gt;
&lt;span id="cb44-20"&gt; &lt;span&gt;print&lt;/span&gt;(e)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;4a Execução&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb45-1"&gt;run_unit_test(df)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;Testes finalizados com sucesso.&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora sim, finalizamos o nosso processo de testar os dados. Agora, temos um dataset que está de acordo com as regras de negócio e podemos utilizá-lo para fazer análises.&lt;/p&gt;



&lt;h1&gt;Conclusão&lt;/h1&gt;

&lt;p&gt;Neste artigo, aprendemos como fazer testes unitários em dados utilizando a biblioteca Pandas. Vimos que é possível fazer testes simples, como verificar se o dataset está vazio, se uma coluna está vazia, se existem valores nulos, se os tipos de dados estão corretos, etc. Também vimos que é possível fazer testes mais complexos, como verificar se os valores de uma coluna estão dentro de um intervalo esperado, se obedecem a uma lógica dependente de outras colunas, etc.&lt;/p&gt;

&lt;p&gt;Aprendemos também como organizar esses testes em funções e como criar uma função que chama todas essas funções e verifica se os testes passaram ou não. Com isso, podemos garantir que os dados estão de acordo com as regras de negócio e que podemos utilizá-los para fazer análises.&lt;/p&gt;

&lt;p&gt;Mas é importante lembrar que os testes unitários não são a única forma de garantir a qualidade dos dados. É importante também fazer uma análise exploratória dos dados, verificar se os dados estão de acordo com o esperado, se não há outliers, se a distribuição dos dados está correta, etc. E, é claro, é importante também fazer validações manuais, para garantir que os dados estão corretos.&lt;/p&gt;

&lt;p&gt;Um abraço e até a próxima,&lt;/p&gt;

&lt;p&gt;Walter.&lt;/p&gt;



</description>
      <category>visualização</category>
      <category>pandas</category>
      <category>teste</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>AI na Análise de Dados - Classificação de Texto com a API da OpenAI</title>
      <dc:creator>Walter R P Cortes</dc:creator>
      <pubDate>Fri, 16 Jun 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/wpcortes75/ai-na-analise-de-dados-classificacao-de-texto-com-a-api-da-openai-2f3f</link>
      <guid>https://dev.to/wpcortes75/ai-na-analise-de-dados-classificacao-de-texto-com-a-api-da-openai-2f3f</guid>
      <description>&lt;h2&gt;Introdução&lt;/h2&gt;

&lt;p&gt;Olá, tudo bem?&lt;/p&gt;

&lt;p&gt;A esta altura do ano de 2023, é quase impossível que você não tenha ouvido falar sobre o ChatGPT. E verdade seja dita, o ChatGPT é uma aplicação incrível, que permite sermos mais eficientes em diversas tarefas do dia dia-a-dia! Mas é importante salientar que ele é apenas uma aplicação, o que está por trás do ChatGPT e que chamamos de um LLM (Large Language Model) é o que realmente faz toda a mágica acontecer. Não iremos entrar em detalhes de como o modelo GPT (Generative Pretrained Transformer) funciona (veja os links no final do post), mas vamos explicar como podemos trazer todo esse poder para dentro de nossos códigos Python e criar scripts e aplicações que vão aumentar ainda mais nossa produtividade.&lt;/p&gt;

&lt;p&gt;Este será o primeiro de uma série de artigos que visam auxiliar na compreensão de como as IAs podem ser assistentes poderosos para o Analista de Dados.&lt;/p&gt;

&lt;h2&gt;Classificação de Dados&lt;/h2&gt;

&lt;p&gt;Classificação de dados é uma tarefa de aprendizado supervisionado que envolve a categorização de uma determinada amostra de dados em uma das várias classes predefinidas. Cada amostra é atribuída a uma e somente uma classe, baseando-se nas características dessa amostra.&lt;/p&gt;

&lt;p&gt;Por exemplo, imagine que você tem um conjunto de emails e você quer classificá-los como “spam” ou “não spam”. Nesse caso, “spam” e “não spam” são as classes, e cada email é uma amostra que será classificada em uma dessas classes.&lt;/p&gt;

&lt;p&gt;A classificação é geralmente realizada utilizando algoritmos de aprendizado de máquina. Esses algoritmos aprendem a classificar novas amostras baseando-se em um conjunto de treinamento. O conjunto de treinamento é um conjunto de amostras para as quais as classes verdadeiras são conhecidas.&lt;/p&gt;

&lt;p&gt;Os algoritmos de classificação incluem árvores de decisão, regressão logística, máquinas de vetores de suporte, redes neurais e muitos outros. A escolha do algoritmo depende de vários fatores, como a natureza dos dados, o número de classes, a necessidade de interpretabilidade e outros.&lt;/p&gt;

&lt;h3&gt;Mas e se não temos conjuntos de dados de treinamento?&lt;/h3&gt;

&lt;p&gt;Se você não tem um conjunto de dados de treinamento rotulado, ainda existem várias abordagens que você pode usar, tais como:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Aprendizado não supervisionado&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aprendizado semi-supervisionado&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aprendizado por reforço&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rotulagem manual&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Geração de rótulos sintéticos&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Processamento de Linguagem Natural&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;E é nesta última opção que podemos utilizar o GPT para nos ajudar, pois o modelo do GPT é gigantesco, tendo sido treinado com conteúdo de toda a internet.&lt;/p&gt;

&lt;h3&gt;GPT versus métodos mais tradicionais de classificação&lt;/h3&gt;

&lt;p&gt;Os modelos de linguagem como o GPT (Generative Pretrained Transformer) têm várias vantagens e desvantagens, especialmente quando comparados a outros métodos de análise de texto. Aqui estão algumas delas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vantagens:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compreensão Profunda da Linguagem&lt;/strong&gt;: O GPT é treinado em enormes quantidades de texto, o que lhe permite aprender uma rica compreensão da linguagem natural. Isso inclui uma compreensão de sintaxe, semântica, e até mesmo alguns elementos de conhecimento do mundo real.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Versatilidade&lt;/strong&gt;: O GPT pode ser usado para uma ampla gama de tarefas de processamento de linguagem natural, incluindo tradução de texto, geração de texto, resumo de texto, análise de sentimento, resposta a perguntas e muito mais.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Aprendizado Transferível&lt;/strong&gt;: O GPT utiliza o aprendizado transferível, o que significa que o conhecimento aprendido durante o treinamento em um grande conjunto de dados pode ser aplicado a tarefas específicas com relativamente poucos dados de treinamento adicionais. Isso permite ao GPT se adaptar a uma ampla gama de tarefas com um desempenho impressionante.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Modelagem de Contexto&lt;/strong&gt;: A arquitetura do Transformer, utilizada pelo GPT, é especialmente boa para entender o contexto em uma sequência de texto, o que é crucial para muitas tarefas de processamento de linguagem natural.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Desvantagens:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Necessidade de Grandes Quantidades de Dados de Treinamento&lt;/strong&gt;: O GPT precisa de grandes quantidades de dados de treinamento para aprender efetivamente. Isso pode tornar o treinamento do modelo do zero proibitivamente caro em termos de tempo e recursos computacionais.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dificuldade de Interpretação&lt;/strong&gt;: O GPT, como muitos modelos de aprendizado profundo, pode ser difícil de interpretar. Ele pode produzir resultados impressionantes, mas pode ser difícil entender por que fez uma determinada previsão.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sensibilidade ao Ruído e Erros&lt;/strong&gt;: Embora o GPT seja robusto em muitos aspectos, ele pode ser sensível a ruído e erros no texto de entrada. Pequenas mudanças no texto de entrada podem às vezes levar a grandes mudanças nas previsões do modelo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Potencial de Viés&lt;/strong&gt;: O GPT aprende com os dados em que é treinado, e se esses dados contêm viés, o modelo também pode exibir viés. Isso pode ser um problema significativo quando o modelo é usado em contextos sensíveis.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;



&lt;h2&gt;Ok, o GPT é legal e tudo o mais… Mas e daí?&lt;/h2&gt;

&lt;p&gt;E daí que, graças ao modelo GPT, podemos ter um classificador de texto super calibrado para nos ajudar em nossas tarefas, sem o ônus de treinar tal modelo. E podemos utilizar o GPT a partir da API da OpenAI, de maneira muito simples! Outra vantagem que vale ressaltar é que, ao contrário de modelos tradicionais de classificação, podemos atribuir múltiplas categorias ao nosso texto.&lt;/p&gt;

&lt;p&gt;Vamos ver um exemplo?&lt;/p&gt;



&lt;h2&gt;Organizando um catálogo de artigos&lt;/h2&gt;

&lt;p&gt;Imagine o seguinte cenário: temos uma lista de todos os artigos que salvamos no site Medium. O problema desta lista é que o Medium não oferece nenhum tipo de categorização dos artigos. A única maneira de fazer isso é separando em várias listas, o que dificulta principalmente o processo de busca dos artigos. Além, é claro, de pressupor a classificação antes de ler o artigo.&lt;/p&gt;

&lt;p&gt;Essa tarefa realmente não é trivial, e seria muito útil poder fazer isso de forma automatizada. E o primeiro problema que temos é que nossa lista tem apenas o título e a url dos artigos. Para que a classificação seja mais precisa, precisamos de pelo menos algum texto que nos ajude a ter mais contexto a respeito do artigo.&lt;/p&gt;

&lt;p&gt;Então, vamos criar o nosso script classificador? Esse script vai executar as seguintes tarefas:&lt;/p&gt;







&lt;pre&gt;flowchart LR
  A[Carregar Lista de Arquivos] --&amp;gt; B
  B[Buscar Título e Resumo&amp;lt;br&amp;gt;dos Artigos] --&amp;gt; C
  C[Classificar Artigos] --&amp;gt; D[Salvar Lista de Artigos]
&lt;/pre&gt;






&lt;br&gt;
&lt;br&gt;



&lt;h3&gt;Inicializando o ambiente&lt;/h3&gt;
&lt;p&gt;Vamos utilizar as seguintes bibliotecas: - beautifulsoup4 - biblioteca para extrair a informação do HTML que contém a lista de artigos - openai - biblioteca para utilizar a API da openAI - requests - bibliotea para buscar informações da internet&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb1-1"&gt;&lt;span&gt;import&lt;/span&gt; os&lt;/span&gt;
&lt;span id="cb1-2"&gt;&lt;span&gt;import&lt;/span&gt; openai&lt;/span&gt;
&lt;span id="cb1-3"&gt;&lt;span&gt;import&lt;/span&gt; bs4&lt;/span&gt;
&lt;span id="cb1-4"&gt;&lt;span&gt;import&lt;/span&gt; json&lt;/span&gt;
&lt;span id="cb1-5"&gt;&lt;/span&gt;
&lt;span id="cb1-6"&gt;&lt;span&gt;from&lt;/span&gt; dotenv &lt;span&gt;import&lt;/span&gt; load_dotenv&lt;/span&gt;
&lt;span id="cb1-7"&gt;&lt;span&gt;from&lt;/span&gt; requests_html &lt;span&gt;import&lt;/span&gt; HTMLSession &lt;span&gt;# importando o objeto de sessão do html requests&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A próxima etapa é carregar variáveis de ambiente. Lembrando que é necessário ter uma API key para usar a API da OpenAI.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb2-1"&gt;load_dotenv()&lt;/span&gt;
&lt;span id="cb2-2"&gt;&lt;/span&gt;
&lt;span id="cb2-3"&gt;openai.api_key &lt;span&gt;=&lt;/span&gt; os.getenv(&lt;span&gt;"OPENAI_API_KEY"&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora, precisamos carregar nossa lista de artigos, que está em um arquivo HTML, que podemos baixar lá no site do Medium. Vamos criar uma função, de forma que poderemos re-utilizar essa parte da rotina sempre que for necessário.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb3-1"&gt;&lt;span&gt;def&lt;/span&gt; retorna_lista(nomearquivo: &lt;span&gt;str&lt;/span&gt;):&lt;/span&gt;
&lt;span id="cb3-2"&gt; html_artigos &lt;span&gt;=&lt;/span&gt; bs4.BeautifulSoup(&lt;span&gt;open&lt;/span&gt;(nomearquivo, &lt;span&gt;"r"&lt;/span&gt;))&lt;/span&gt;
&lt;span id="cb3-3"&gt; list_artigos &lt;span&gt;=&lt;/span&gt; html_artigos.find_all(&lt;span&gt;"li"&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb3-4"&gt;&lt;/span&gt;
&lt;span id="cb3-5"&gt; artigos &lt;span&gt;=&lt;/span&gt; []&lt;/span&gt;
&lt;span id="cb3-6"&gt; &lt;span&gt;for&lt;/span&gt; item &lt;span&gt;in&lt;/span&gt; list_artigos:&lt;/span&gt;
&lt;span id="cb3-7"&gt; record &lt;span&gt;=&lt;/span&gt; {}&lt;/span&gt;
&lt;span id="cb3-8"&gt; record &lt;span&gt;=&lt;/span&gt; {&lt;/span&gt;
&lt;span id="cb3-9"&gt; &lt;span&gt;"titulo"&lt;/span&gt;: item.a.text,&lt;/span&gt;
&lt;span id="cb3-10"&gt; &lt;span&gt;"link"&lt;/span&gt;: item.a[&lt;span&gt;"href"&lt;/span&gt;],&lt;/span&gt;
&lt;span id="cb3-11"&gt; &lt;span&gt;"autores"&lt;/span&gt;: &lt;span&gt;None&lt;/span&gt;,&lt;/span&gt;
&lt;span id="cb3-12"&gt; &lt;span&gt;"resumo"&lt;/span&gt;: &lt;span&gt;None&lt;/span&gt;,&lt;/span&gt;
&lt;span id="cb3-13"&gt; &lt;span&gt;"categorias"&lt;/span&gt;: &lt;span&gt;None&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb3-14"&gt; }&lt;/span&gt;
&lt;span id="cb3-15"&gt; artigos.append(record)&lt;/span&gt;
&lt;span id="cb3-16"&gt; &lt;span&gt;return&lt;/span&gt; artigos&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Este código define uma função chamada “retorna_lista” que recebe um único parâmetro chamado “nomearquivo” do tipo string. A função primeiro abre o arquivo especificado pela string “nomearquivo” usando a função “open”, lê o conteúdo e usa o método “find_all” do Beautiful Soup para procurar todos os elementos de lista no documento HTML e armazená-los na variável “list_artigos”. A função, então, inicializa uma lista vazia chamada “artigos”. Em um loop, ela itera sobre cada item da lista na variável “list_artigos” e cria um dicionário chamado “record” com três chaves: “titulo”, “link”, “autores”, “resumo” e “categorias”. Os valores para “titulo” e “link” são extraídos do texto da tag “a” e do atributo “href”, respectivamente. O valor das chaves “autores”, “resumo” e “categorias” são uma string vazia. O dicionário “record” completo é então adicionado à lista “artigos”. Depois que todos os itens da lista são processados, a função retorna a lista “artigos”.&lt;/p&gt;

&lt;p&gt;Então, podemos utilizar essa função conforme abaixo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb4-1"&gt;artigos &lt;span&gt;=&lt;/span&gt; retorna_lista(&lt;span&gt;"reading-list-medium.html"&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb4-2"&gt;&lt;/span&gt;
&lt;span id="cb4-3"&gt;&lt;span&gt;print&lt;/span&gt;(&lt;span&gt;f" Número de Artigos: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;len&lt;/span&gt;(artigos)&lt;span&gt;}&lt;/span&gt;&lt;span&gt;."&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt; Número de Artigos: 1865.&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vamos ver como ficou um registro:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb6-1"&gt;&lt;span&gt;print&lt;/span&gt;(json.dumps(artigos[&lt;span&gt;0&lt;/span&gt;], indent&lt;span&gt;=&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;))&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;{
    "titulo": "Prompting ChatGPT for Python Code Generation: An Effective Framework",
    "link": "https://medium.com/p/e323b2d24987",
    "autores": null,
    "resumo": null,
    "categorias": null
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Perfeito! Estamos com os artigos preparados para buscarmos os dados extra que nos darão mais contexto para a categorização.&lt;/p&gt;

&lt;p&gt;Para fazer isso, vamos utilizar a biblioteca requests-html. Novamente, criaremos uma função para reutilizar depois.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb8-1"&gt;&lt;span&gt;def&lt;/span&gt; retorna_campos(registro: &lt;span&gt;dict&lt;/span&gt;):&lt;/span&gt;
&lt;span id="cb8-2"&gt; &lt;span&gt;# Declaramos variaveis que contem seletores HTML&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-3"&gt; &lt;span&gt;# Esses seletores nos ajudarão a encontrar os elementos HTML que contém o &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-4"&gt; &lt;span&gt;# conteúdo referente ao autor, data publicação, titulo e lead&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-5"&gt; seletor_autor &lt;span&gt;=&lt;/span&gt; [&lt;/span&gt;
&lt;span id="cb8-6"&gt; &lt;span&gt;"#root &amp;gt; div &amp;gt; div &amp;gt; div:nth-child(3) &amp;gt; div &amp;gt; article &amp;gt; div &amp;gt; div &amp;gt; section &amp;gt; div &amp;gt; div:nth-child(3) &amp;gt; div &amp;gt; div &amp;gt; div:nth-child(2) &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; span &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; p &amp;gt; a"&lt;/span&gt;, &lt;/span&gt;
&lt;span id="cb8-7"&gt; &lt;span&gt;"#root &amp;gt; div &amp;gt; div &amp;gt; div:nth-child(3) &amp;gt; div &amp;gt; article &amp;gt; div &amp;gt; div &amp;gt; section &amp;gt; div &amp;gt; div:nth-child(3) &amp;gt; div &amp;gt; div &amp;gt; div:nth-child(1) &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; span &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; p &amp;gt; a"&lt;/span&gt;, &lt;/span&gt;
&lt;span id="cb8-8"&gt; &lt;span&gt;"#root &amp;gt; div &amp;gt; div &amp;gt; div:nth-child(2) &amp;gt; div &amp;gt; article &amp;gt; div &amp;gt; div &amp;gt; section &amp;gt; div &amp;gt; div:nth-child(2) &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; span &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; p &amp;gt; a"&lt;/span&gt;, &lt;/span&gt;
&lt;span id="cb8-9"&gt; &lt;span&gt;"#root &amp;gt; div &amp;gt; div &amp;gt; div:nth-child(2) &amp;gt; div &amp;gt; article &amp;gt; div &amp;gt; div &amp;gt; section &amp;gt; div &amp;gt; div:nth-child(3) &amp;gt; div:nth-child(1) &amp;gt; div &amp;gt; div:nth-child(2) &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; span &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; p &amp;gt; a"&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-10"&gt; ]&lt;/span&gt;
&lt;span id="cb8-11"&gt; seletor_titulo_lead &lt;span&gt;=&lt;/span&gt; [&lt;/span&gt;
&lt;span id="cb8-12"&gt; &lt;span&gt;"#root &amp;gt; div &amp;gt; div &amp;gt; div:nth-child(3) &amp;gt; div &amp;gt; article &amp;gt; div &amp;gt; div &amp;gt; section &amp;gt; div &amp;gt; div:nth-child(3) &amp;gt; div &amp;gt; div &amp;gt; div:nth-child(2)"&lt;/span&gt;, &lt;span&gt;"#root &amp;gt; div &amp;gt; div &amp;gt; div:nth-child(2) &amp;gt; div &amp;gt; article &amp;gt; div &amp;gt; div &amp;gt; section &amp;gt; div &amp;gt; div:nth-child(3) &amp;gt; div:nth-child(1) &amp;gt; div &amp;gt; div:nth-child(2)"&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-13"&gt; ]&lt;/span&gt;
&lt;span id="cb8-14"&gt; &lt;/span&gt;
&lt;span id="cb8-15"&gt; &lt;span&gt;# Inicializamos o objeto HTMLSession para fazer a coleta da informação dos artigos&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-16"&gt; request &lt;span&gt;=&lt;/span&gt; HTMLSession()&lt;/span&gt;
&lt;span id="cb8-17"&gt; &lt;span&gt;try&lt;/span&gt;:&lt;/span&gt;
&lt;span id="cb8-18"&gt; &lt;span&gt;print&lt;/span&gt;(registro[&lt;span&gt;"link"&lt;/span&gt;])&lt;/span&gt;
&lt;span id="cb8-19"&gt; conteudo_html &lt;span&gt;=&lt;/span&gt; request.get(registro[&lt;span&gt;"link"&lt;/span&gt;])&lt;/span&gt;
&lt;span id="cb8-20"&gt; autor &lt;span&gt;=&lt;/span&gt; &lt;span&gt;"Not available"&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-21"&gt; &lt;/span&gt;
&lt;span id="cb8-22"&gt; &lt;span&gt;for&lt;/span&gt; item &lt;span&gt;in&lt;/span&gt; seletor_autor:&lt;/span&gt;
&lt;span id="cb8-23"&gt; aux_autor &lt;span&gt;=&lt;/span&gt; &lt;span&gt;None&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-24"&gt; aux_autor &lt;span&gt;=&lt;/span&gt; conteudo_html.html.find(item, first&lt;span&gt;=&lt;/span&gt;&lt;span&gt;True&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb8-25"&gt; &lt;span&gt;if&lt;/span&gt; aux_autor &lt;span&gt;is&lt;/span&gt; &lt;span&gt;not&lt;/span&gt; &lt;span&gt;None&lt;/span&gt;:&lt;/span&gt;
&lt;span id="cb8-26"&gt; autor &lt;span&gt;=&lt;/span&gt; aux_autor&lt;/span&gt;
&lt;span id="cb8-27"&gt; &lt;span&gt;break&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-28"&gt;&lt;/span&gt;
&lt;span id="cb8-29"&gt; head &lt;span&gt;=&lt;/span&gt; &lt;span&gt;"Not available"&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-30"&gt; &lt;span&gt;for&lt;/span&gt; item &lt;span&gt;in&lt;/span&gt; seletor_titulo_lead:&lt;/span&gt;
&lt;span id="cb8-31"&gt; aux_head &lt;span&gt;=&lt;/span&gt; &lt;span&gt;None&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-32"&gt; aux_head &lt;span&gt;=&lt;/span&gt; conteudo_html.html.find(item, first&lt;span&gt;=&lt;/span&gt;&lt;span&gt;True&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb8-33"&gt; &lt;span&gt;if&lt;/span&gt; aux_head:&lt;/span&gt;
&lt;span id="cb8-34"&gt; aux_lead &lt;span&gt;=&lt;/span&gt; aux_head.find(&lt;span&gt;'h2'&lt;/span&gt;, first&lt;span&gt;=&lt;/span&gt;&lt;span&gt;True&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb8-35"&gt; &lt;span&gt;if&lt;/span&gt; aux_lead &lt;span&gt;is&lt;/span&gt; &lt;span&gt;not&lt;/span&gt; &lt;span&gt;None&lt;/span&gt;:&lt;/span&gt;
&lt;span id="cb8-36"&gt; head &lt;span&gt;=&lt;/span&gt; aux_lead.text&lt;/span&gt;
&lt;span id="cb8-37"&gt; &lt;/span&gt;
&lt;span id="cb8-38"&gt; registro[&lt;span&gt;"autores"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; autor.text&lt;/span&gt;
&lt;span id="cb8-39"&gt; registro[&lt;span&gt;"resumo"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; head&lt;/span&gt;
&lt;span id="cb8-40"&gt; &lt;/span&gt;
&lt;span id="cb8-41"&gt; &lt;span&gt;return&lt;/span&gt; registro&lt;/span&gt;
&lt;span id="cb8-42"&gt; &lt;span&gt;except&lt;/span&gt;:&lt;/span&gt;
&lt;span id="cb8-43"&gt; &lt;span&gt;print&lt;/span&gt;(&lt;span&gt;'URL &lt;/span&gt;&lt;span&gt;{0}&lt;/span&gt;&lt;span&gt; com erro. Verifique.'&lt;/span&gt;.&lt;span&gt;format&lt;/span&gt;(registro[&lt;span&gt;"link"&lt;/span&gt;]))&lt;/span&gt;
&lt;span id="cb8-44"&gt; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;None&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A função &lt;code&gt;retorna_campos&lt;/code&gt; faz o scraping de dados de páginas da web, especificamente páginas de notícias ou artigos de blog do Medium. Ele pega um dicionário de “registro” como entrada, que parece conter um “link” para uma página da web.&lt;/p&gt;

&lt;p&gt;Passo-a-Passo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Variáveis &lt;code&gt;seletor_autor&lt;/code&gt; e &lt;code&gt;seletor_titulo_lead&lt;/code&gt; são listas de seletores CSS. Seletores CSS são padrões usados para selecionar os elementos que você deseja estilizar. Aqui, eles são usados para identificar os elementos HTML onde as informações de autor e título/lead estão localizadas no HTML da página.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A função então inicia uma sessão HTML usando o módulo &lt;code&gt;HTMLSession()&lt;/code&gt; do pacote &lt;code&gt;requests_html&lt;/code&gt;, que é uma biblioteca Python para fazer solicitações HTTP e para parsing de HTML.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A função tenta fazer uma solicitação GET para a URL que está no campo “link” do dicionário de entrada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Em seguida, a função tenta encontrar o autor do artigo. Para isso, itera sobre a lista &lt;code&gt;seletor_autor&lt;/code&gt; e, para cada seletor, tenta encontrar um elemento correspondente na página HTML. Se encontrar um autor, interrompe o loop e guarda o autor encontrado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Depois disso, a função tenta encontrar o título do artigo da mesma maneira, usando a lista &lt;code&gt;seletor_titulo_lead&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Os resultados são então adicionados ao dicionário de entrada no campo “autores” para o autor e “resumo” para o título.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Se houver algum erro durante o processo, como um link quebrado ou se o seletor CSS não corresponder a nenhum elemento, a função exibe uma mensagem de erro e retorna None.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Se tudo correr bem, a função retorna o dicionário de entrada, agora com informações adicionais sobre o autor e o resumo do artigo.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Agora vamos a execução da função para cada artigo em nossa lista. Observe que colocamos um limitador para fazer isso para 10 registros.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb9-1"&gt;artigos_comp &lt;span&gt;=&lt;/span&gt; []&lt;/span&gt;
&lt;span id="cb9-2"&gt;i &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb9-3"&gt;&lt;span&gt;for&lt;/span&gt; item &lt;span&gt;in&lt;/span&gt; artigos:&lt;/span&gt;
&lt;span id="cb9-4"&gt; artigos_comp.append(retorna_campos(item))&lt;/span&gt;
&lt;span id="cb9-5"&gt; i &lt;span&gt;+=&lt;/span&gt; &lt;span&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb9-6"&gt; &lt;span&gt;if&lt;/span&gt; i &lt;span&gt;==&lt;/span&gt; &lt;span&gt;10&lt;/span&gt;:&lt;/span&gt;
&lt;span id="cb9-7"&gt; &lt;span&gt;break&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;https://medium.com/p/e323b2d24987
https://medium.com/p/9e9536ebd839
https://medium.com/p/bb7d31ed2e76
https://medium.com/p/2688e319e2a5
https://medium.com/p/7edae42a20b3
https://medium.com/p/f87419cb14cb
https://medium.com/p/d6169fc81204
https://medium.com/p/74361bc3b92e
https://medium.com/p/9dc1566d960d
https://medium.com/p/3c053357c47f&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora temos os nossos artigos com título, autor e uma lead line, que vai nos ajudar no processo da categorização.&lt;/p&gt;

&lt;p&gt;Vamos agora, a nossa rotina de categorização, usando a API do OpenAI.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb11-1"&gt;&lt;span&gt;def&lt;/span&gt; retorna_categorias(titulo, resumo):&lt;/span&gt;
&lt;span id="cb11-2"&gt; response &lt;span&gt;=&lt;/span&gt; openai.Completion.create(&lt;/span&gt;
&lt;span id="cb11-3"&gt; engine&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"text-davinci-003"&lt;/span&gt;,&lt;/span&gt;
&lt;span id="cb11-4"&gt; prompt&lt;span&gt;=&lt;/span&gt;&lt;span&gt;f"We have these categories: dbt, Python, DataViz, Tableau, PowerBI, and Generative AI. Given those categories, please classify the following text with those categories: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;titulo&lt;span&gt;}&lt;/span&gt;&lt;span&gt; - &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;resumo&lt;span&gt;}&lt;/span&gt;&lt;span&gt;. You can use only the categories listed. You can classify with multiple categories. If you think that none of the categories applies, you can tag as Other."&lt;/span&gt;,&lt;/span&gt;
&lt;span id="cb11-5"&gt; temperature&lt;span&gt;=&lt;/span&gt;&lt;span&gt;0.8&lt;/span&gt;,&lt;/span&gt;
&lt;span id="cb11-6"&gt; max_tokens&lt;span&gt;=&lt;/span&gt;&lt;span&gt;20&lt;/span&gt;,&lt;/span&gt;
&lt;span id="cb11-7"&gt; )&lt;/span&gt;
&lt;span id="cb11-8"&gt; &lt;span&gt;return&lt;/span&gt; response.choices[&lt;span&gt;0&lt;/span&gt;].text.strip()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Este código define uma função chamada “retorna_categorias” que recebe dois parâmetros: “titulo” e “resumo”. A função utiliza a API OpenAI para classificar o título e o resumo com base em um conjunto de categorias previamente determinadas - dbt, Python, DataViz, Tableau, PowerBI e Generative AI. Em seguida, retorna o resultado da classificação como uma string.&lt;/p&gt;

&lt;p&gt;A função retorna então a primeira (e única) escolha da resposta da API OpenAI, que é a string que representa a categoria que foi escolhida como a melhor correspondência para o texto de entrada. O método strip() é usado para remover qualquer espaço em branco inicial ou final da string retornada.&lt;/p&gt;

&lt;p&gt;Observação: Para usar este código, o módulo openai precisa ser importado e uma chave de API OpenAI precisa ser obtida.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb12-1"&gt;lista_final &lt;span&gt;=&lt;/span&gt; []&lt;/span&gt;
&lt;span id="cb12-2"&gt;&lt;span&gt;for&lt;/span&gt; item &lt;span&gt;in&lt;/span&gt; artigos_comp:&lt;/span&gt;
&lt;span id="cb12-3"&gt; item[&lt;span&gt;"categorias"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; retorna_categorias(item[&lt;span&gt;'titulo'&lt;/span&gt;], item[&lt;span&gt;'resumo'&lt;/span&gt;])&lt;/span&gt;
&lt;span id="cb12-4"&gt; lista_final.append(item)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora que executamos a rotina acima, podemos imprimir os três primeiros registros e verificar que agora, temos categorias.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb13-1"&gt;&lt;span&gt;for&lt;/span&gt; idx, item &lt;span&gt;in&lt;/span&gt; &lt;span&gt;enumerate&lt;/span&gt;(lista_final):&lt;/span&gt;
&lt;span id="cb13-2"&gt; &lt;span&gt;print&lt;/span&gt;(json.dumps(item, indent&lt;span&gt;=&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;))&lt;/span&gt;
&lt;span id="cb13-3"&gt; &lt;span&gt;if&lt;/span&gt; idx &lt;span&gt;==&lt;/span&gt; &lt;span&gt;2&lt;/span&gt;:&lt;/span&gt;
&lt;span id="cb13-4"&gt; &lt;span&gt;break&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;{
    "titulo": "Prompting ChatGPT for Python Code Generation: An Effective Framework",
    "link": "https://medium.com/p/e323b2d24987",
    "autores": "John Loewen",
    "resumo": "I\u2019ve done the prompt engineering research so you don\u2019t have to",
    "categorias": "Python, Generative AI"
}
{
    "titulo": "Power BI: How I Started Using Python To Automate Tasks",
    "link": "https://medium.com/p/9e9536ebd839",
    "autores": "Gabe Araujo, M.Sc.",
    "resumo": "Not available",
    "categorias": "PowerBI, Python"
}
{
    "titulo": "Chat with your databases using LangChain",
    "link": "https://medium.com/p/bb7d31ed2e76",
    "autores": "Vishnu Sivan",
    "resumo": "Not available",
    "categorias": "Other"
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E aí estão os nossos artigos, devidamente categorizados. Inclusive, podemos ver um artigo que foi classificado como “Other”, indicando que o texto que foi enviado não foi suficiente para classificar com as categorias selecionadas.&lt;/p&gt;

&lt;p&gt;Obrigado por ler até aqui! Espero que este script seja útil para vocês!!!&lt;/p&gt;



&lt;h2&gt;Links Úteis&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://www.openai.com/blog/gpt-3/" rel="noopener noreferrer"&gt;Understanding GPT-3: OpenAI’s Language Generation AI: Blog oficial da OpenAI sobre GPT-3&lt;/a&gt; - Apresenta uma explicação detalhada do GPT-3 e seu uso potencial&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.geeksforgeeks.org/ml-data-classification/" rel="noopener noreferrer"&gt;Data Classification in Machine Learning&lt;/a&gt; - Este é um artigo do site GeeksforGeeks que explica o conceito básico de classificação de dados em aprendizado de máquina, os diferentes tipos de algoritmos de classificação e como eles funcionam.&lt;/li&gt;
&lt;li&gt;Bibliotecas Python utilizadas no artigo:
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://requests.readthedocs.io/projects/requests-html/en/latest/" rel="noopener noreferrer"&gt;requests-html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://platform.openai.com/docs/api-reference" rel="noopener noreferrer"&gt;openai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.crummy.com/software/BeautifulSoup/bs4/doc/" rel="noopener noreferrer"&gt;BeautifulSoup4&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;/li&gt;


&lt;/ol&gt;



</description>
      <category>openaiapi</category>
    </item>
    <item>
      <title>Power BI no Jupyter!</title>
      <dc:creator>Walter R P Cortes</dc:creator>
      <pubDate>Tue, 30 May 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/wpcortes75/power-bi-no-jupyter-372j</link>
      <guid>https://dev.to/wpcortes75/power-bi-no-jupyter-372j</guid>
      <description>&lt;h2&gt;Introdução&lt;/h2&gt;

&lt;p&gt;Se você é um entusiasta de visualização de dados, cientista de dados ou analista de negócios em busca de novas maneiras de explorar e compartilhar seus dados, este post é para você. Prepare-se para descobrir como o poder do Power BI pode ser desbloqueado dentro do Jupyter Notebook, ampliando suas possibilidades de análise e proporcionando uma experiência envolvente e interativa.&lt;/p&gt;

&lt;h2&gt;PowerBI - Rápida Introdução&lt;/h2&gt;

&lt;p&gt;O Power BI é uma poderosa ferramenta de business intelligence desenvolvida pela Microsoft, projetada para ajudar as empresas a visualizar e analisar seus dados de maneira intuitiva e interativa. Com recursos avançados de criação de relatórios, painéis e dashboards personalizados, o Power BI permite que os usuários transformem seus dados em informações acionáveis, facilitando a tomada de decisões informadas em tempo real. E todo esse poder pode ser entregue tanto de forma independente quanto integrada a outros meios, através do que chamamos de embedded reports.&lt;/p&gt;

&lt;h3&gt;Power BI Embeddings&lt;/h3&gt;

&lt;p&gt;As capacidades de embedding do Power BI permitem que os desenvolvedores incorporem relatórios, painéis e visualizações interativas do Power BI diretamente em seus aplicativos, sites ou portais. Essa funcionalidade de integração oferece uma maneira flexível e personalizada de compartilhar informações e insights com usuários finais, proporcionando uma experiência perfeita e integrada. Com as capacidades de embedding do Power BI, os desenvolvedores podem aproveitar as APIs e SDKs disponíveis para incorporar visualizações interativas em seus aplicativos existentes, personalizar a aparência e a funcionalidade, controlar a segurança e permissões de acesso aos dados e até mesmo habilitar recursos como filtragem dinâmica e interação com os dados subjacentes. Essa flexibilidade permite que as organizações integrem as poderosas capacidades analíticas do Power BI diretamente em seus fluxos de trabalho, fornecendo aos usuários acesso direto a informações relevantes e atualizadas, tudo dentro do contexto de sua própria aplicação.&lt;/p&gt;

&lt;p&gt;Entre outros conhecimentos, para trabalhar com embeddings, é necessário compreender:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Linguagens de programação: Ter conhecimentos básicos de programação é fundamental para interagir com as APIs e SDKs do Power BI. Python, JavaScript e .NET são exemplos de linguagens comumente usadas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Desenvolvimento web: Familiaridade com desenvolvimento web é importante para incorporar e personalizar visualizações do Power BI. Isso inclui conhecimentos em HTML, CSS e JavaScript para integrar o código do Power BI em aplicativos e sites.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Autenticação e segurança: Compreender os conceitos de autenticação e autorização é crucial para garantir a segurança dos dados. Isso envolve entender como autenticar usuários no Power BI e definir permissões de acesso adequadas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Power BI Desktop e serviço Power BI: Ter conhecimento sobre o Power BI Desktop e o serviço Power BI é essencial. Isso inclui habilidades em criação de relatórios, painéis e visualizações interativas, além de recursos de filtragem e interação.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modelagem e transformação de dados: Noções básicas de modelagem e transformação de dados são úteis para preparar os dados antes de incorporá-los. Isso envolve limpeza, filtragem e organização dos dados para criar visualizações eficazes.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Neste post, exploraremos a integração do Power BI com o Jupyter Notebook, combinando a flexibilidade do ambiente de codificação do Python com a riqueza de recursos do Power BI. Descobriremos como utilizar a biblioteca &lt;code&gt;powerbiclient&lt;/code&gt; para trazer o poder do Power BI para dentro de um Jupyter Notebook.&lt;/p&gt;



&lt;h2&gt;Biblioteca &lt;code&gt;powerbiclient&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;A biblioteca &lt;code&gt;powerbiclient&lt;/code&gt; é uma ferramenta poderosa que permite interagir com o serviço do Power BI diretamente por meio de APIs. Essa biblioteca, desenvolvida pela Microsoft, fornece uma interface de programação fácil de usar para criar, publicar, atualizar e gerenciar relatórios, dashboards e conjuntos de dados no Power BI. Com o &lt;code&gt;powerbiclient&lt;/code&gt;, os desenvolvedores podem automatizar tarefas, extrair informações e integrar o Power BI a aplicativos, permitindo a criação de soluções personalizadas e aprimorando a capacidade de visualização e análise de dados. Essa biblioteca é uma excelente opção para aqueles que desejam aproveitar ao máximo o ecossistema do Power BI e incorporar suas funcionalidades em seus próprios fluxos de trabalho e aplicativos.&lt;/p&gt;

&lt;p&gt;Dentre todas as possibilidades que esta biblioteca oferece, vamos focar em como carregar gráficos interativos em Power BI dentro do nosso notebook Jupyter. E vamos lá, sem demora!&lt;/p&gt;



&lt;h2&gt;Preparando o ambiente&lt;/h2&gt;

&lt;p&gt;Como sempre, o nosso primeiro passo é instalar as bibliotecas que estão faltando.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb1-1"&gt;&lt;span&gt;$&lt;/span&gt; pip install powerbiclient&lt;/span&gt;
&lt;span id="cb1-2"&gt;&lt;/span&gt;
&lt;span id="cb1-3"&gt;&lt;span&gt;Nosso&lt;/span&gt; próximo passo é inicializar o ambiente, chamando nossas bibliotecas.&lt;/span&gt;
&lt;span id="cb1-4"&gt;&lt;/span&gt;
&lt;span id="cb1-5"&gt;&lt;span&gt;:::&lt;/span&gt; {#cell-11 .cell execution_count=4}&lt;/span&gt;
&lt;span id="cb1-6"&gt;&lt;span&gt;

```

&lt;/span&gt; &lt;span&gt;{.python&lt;/span&gt; .cell-code}&lt;/span&gt;
&lt;span id="cb1-7"&gt;&lt;span&gt;from&lt;/span&gt; powerbiclient import QuickVisualize, get_dataset_config, Report&lt;/span&gt;
&lt;span id="cb1-8"&gt;&lt;span&gt;from&lt;/span&gt; powerbiclient.authentication import DeviceCodeLoginAuthentication&lt;/span&gt;
&lt;span id="cb1-9"&gt;&lt;/span&gt;
&lt;span id="cb1-10"&gt;&lt;span&gt;import&lt;/span&gt; pandas as pd&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;:::&lt;/p&gt;

&lt;p&gt;Depois disso, vamos ao código de verdade!&lt;/p&gt;

&lt;h2&gt;Carregando os dados&lt;/h2&gt;

&lt;p&gt;A primeira tarefa, como em todo o trabalho de um cientista de dados, é carregar os dados em um DataFrame.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb2-1"&gt;pokemons &lt;span&gt;=&lt;/span&gt; pd.read_csv(&lt;span&gt;'pokemons.csv'&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;h2&gt;Autenticando no Serviço do Power BI&lt;/h2&gt;

&lt;p&gt;Em seguida, temos que fazer a autenticação no serviço do Power BI. O Power BI, como todos os aplicativos do Office 365, requer que estejamos autenticados para utiliza-los. Aqui, o processo é simplificado, mas ainda requerido. Esse modo é o mais simples, se estiver interessado em outras maneiras, dê uma olhada mais a fundo na documentação da Microsoft.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb3-1"&gt;device_auth &lt;span&gt;=&lt;/span&gt; DeviceCodeLoginAuthentication()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;Performing device flow authentication. Please follow the instructions below.
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code A8EL2Y8WJ to authenticate.

Device flow authentication successfully completed.
You are now logged in .

The result should be passed only to trusted code in your notebook.&lt;/code&gt;&lt;/pre&gt;


&lt;br&gt;


&lt;h2&gt;Visualizando!&lt;/h2&gt;

&lt;p&gt;O próximo passo é plotar o gráfico usando o Power BI. Neste post vamos explorar a classe &lt;code&gt;QuickVisualize&lt;/code&gt; que nos entregará um tipo de sumário dos nossos dados, como em uma Análise Exploratória de Dados. Para isso, enviamos nosso DataFrame, o objeto de autenticação e chamamos a função &lt;code&gt;PBI_visualize&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb5-1"&gt;&lt;span&gt;# Create a Power BI report from your data&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-2"&gt;PBI_visualize &lt;span&gt;=&lt;/span&gt; QuickVisualize(get_dataset_config(pokemons), auth&lt;span&gt;=&lt;/span&gt;device_auth)&lt;/span&gt;
&lt;span id="cb5-3"&gt;&lt;/span&gt;
&lt;span id="cb5-4"&gt;&lt;span&gt;# Render the new report&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-5"&gt;PBI_visualize&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;{"model_id":"43ce7f1b3c004463a9409fb5cd45a9d9","version_major":2,"version_minor":0,"quarto_mimetype":"application/vnd.jupyter.widget-view+json"}&lt;/p&gt;


&lt;br&gt;


&lt;h2&gt;Finalizando&lt;/h2&gt;

&lt;p&gt;E desta forma, conseguimos trazer o Power BI e todo o seu poder para dentro do nosso notebook! E essa é apenas uma das formas que temos para trabalhar com Power BI dentro do notebook! Se você quiser aprender mais, não deixe de acessar a documentação da biblioteca &lt;code&gt;powerbiclient&lt;/code&gt; em &lt;a href="https://github.com/Microsoft/powerbi-jupyter" rel="noopener noreferrer"&gt;Power BI - Jupyter&lt;/a&gt;.&lt;/p&gt;



</description>
      <category>pandas</category>
      <category>powerbi</category>
      <category>jupyter</category>
    </item>
    <item>
      <title>Pandas AI - Converse com seu DataFrame</title>
      <dc:creator>Walter R P Cortes</dc:creator>
      <pubDate>Mon, 29 May 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/wpcortes75/pandas-ai-converse-com-seu-dataframe-27a8</link>
      <guid>https://dev.to/wpcortes75/pandas-ai-converse-com-seu-dataframe-27a8</guid>
      <description>&lt;h2&gt;Introdução&lt;/h2&gt;

&lt;p&gt;Desde outubro do ano passado, com a liberação do ChatGPT 3.5, as interfaces conversacionais vem se popularizando de maneira muito rápida. É verdade que interfaces conversacionais não são novidade, e chatbots e assistentes virtuais vem dominando tarefas relacionadas a atendimento de clientes, mas desde o advento do ChatGPT, tem-se expandido para outras áreas de atuação.&lt;/p&gt;

&lt;p&gt;Utilizamos o ChatGPT para criarmos resumos de textos longos, para consultar algo que ocorreu no passado, explicar conceitos e por aí vai. Já existem cursos que ensinam como utilizar o ChatGPT para criar campanhas de marketing nas redes sociais e outras tantas funções que são basicamente apoiadas em texto.&lt;/p&gt;

&lt;p&gt;Dentro da programação, é possível gerar pequenos trechos de código e até páginas HTML e arquivos CSS inteiros.&lt;/p&gt;

&lt;h3&gt;Status Outubro/2024&lt;/h3&gt;

&lt;p&gt;Se você não estava embaixo de uma pedra, certamente já sabe que as LLMs vigentes são muito boas em análise de dados, gerando códigos muito bons, inclusive para alguns casos mais complexos. No entanto, o conteúdo deste artigo ainda tem relevância, pois mostra uma das muitas maneiras de integrar uma LLM ao processo de análise de dados.&lt;/p&gt;



&lt;h2&gt;E o que isso tem a ver com Ciências de Dados?&lt;/h2&gt;

&lt;p&gt;Os DataFrames são basicamente textos organizados em tabelas e colunas, que são correlacionados. Portanto, é possível carregar os dados em um modelo LLM (Large Language Model), habilitando a extração da informação destes DataFrames de maneira conversacional, como se estivéssemos dialogando. Mas o que realmente instiga esta nossa área é descobrir se podemos fazer este modelo realizar o trabalho de análise para nós, cientistas e analistas iniciantes (e até mesmo os mais experientes). A resposta mais recente que temos para isso é chamada de &lt;code&gt;Pandas AI&lt;/code&gt;.&lt;/p&gt;



&lt;h2&gt;O que é o Pandas AI?&lt;/h2&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fp0002-pandasai%2Fpandas-llamas.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fp0002-pandasai%2Fpandas-llamas.png" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;
Pandas e Llamas



&lt;p&gt;O Pandas AI é o melhor amigo do seu DataFrame! Com esta nova biblioteca, podemos dar aos nossos DataFrames a capacidade de serem consultados de maneira simples e eficiente, utilizando uma interface conversacional.&lt;/p&gt;

&lt;p&gt;Então, vamos ver como podemos utilizar Pandas AI?&lt;/p&gt;

&lt;h3&gt;Preparando o Ambiente&lt;/h3&gt;

&lt;p&gt;A primeira coisa é garantir que seu ambiente tenha todas as bibliotecas necessárias instaladas: &lt;code&gt;Pandas&lt;/code&gt;, &lt;code&gt;PandasAI&lt;/code&gt;, &lt;code&gt;OpenAI&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb1-1"&gt;&lt;span&gt;$&lt;/span&gt; pip install pandas pandasai openai&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Então, vamos iniciar o nosso notebook. Temos que fazer o import das bibliotecas que vamos utilizar na nossa demonstração.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb2-1"&gt;&lt;span&gt;import&lt;/span&gt; os&lt;/span&gt;
&lt;span id="cb2-2"&gt;&lt;span&gt;import&lt;/span&gt; pandas &lt;span&gt;as&lt;/span&gt; pd&lt;/span&gt;
&lt;span id="cb2-3"&gt;&lt;/span&gt;
&lt;span id="cb2-4"&gt;&lt;span&gt;from&lt;/span&gt; pandasai &lt;span&gt;import&lt;/span&gt; PandasAI&lt;/span&gt;
&lt;span id="cb2-5"&gt;&lt;span&gt;from&lt;/span&gt; pandasai.llm.openai &lt;span&gt;import&lt;/span&gt; OpenAI&lt;/span&gt;
&lt;span id="cb2-6"&gt;&lt;span&gt;from&lt;/span&gt; dotenv &lt;span&gt;import&lt;/span&gt; load_dotenv&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Observe que carregamos a função &lt;code&gt;load_dotenv&lt;/code&gt;, pois iremos precisar carregar a chave de acesso para a API da OpenAI. Para fazer isso, podemos simplesmente executar a função.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb3-1"&gt;load_dotenv()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;True&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;O próximo passo é carregar os nossos dados no DataFrame. Como sempre, vamos utilizar o dataset de pokemons.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb5-1"&gt;pokemons &lt;span&gt;=&lt;/span&gt; pd.read_csv(&lt;span&gt;'pokemons.csv'&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Em seguida, vamos inicializar o LLM para que consigamos conversar com o nosso DataFrame.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb6-1"&gt;llm &lt;span&gt;=&lt;/span&gt; OpenAI(api_token&lt;span&gt;=&lt;/span&gt;os.environ[&lt;span&gt;'OPENAI_API_KEY'&lt;/span&gt;])&lt;/span&gt;
&lt;span id="cb6-2"&gt;pandas_ai &lt;span&gt;=&lt;/span&gt; PandasAI(llm)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Até agora, tudo correu bem! Agora, podemos executar diversas vezes a função &lt;code&gt;pandas_ai.run&lt;/code&gt;, passando nosso DataFrame e um prompt, e ele nos responderá. Vamos testar?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb7-1"&gt;pandas_ai.run(pokemons, prompt&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"Quantos pokemons temos no DataFrame?"&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;'Unfortunately, I was not able to answer your question. Please try again. If the problem persists, try rephrasing your question.'&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Para verificar isso, podemos apenas ver o shape do DataFrame e confirmar:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb9-1"&gt;pokemons.shape&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;(1032, 44)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;De fato, 1032 pokemons. Vamos continuar?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb11-1"&gt;pandas_ai.run(pokemons, prompt&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"Quantos tipos de pokemons existem?"&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;'Well, there are actually 18 different types of pokemons out there!'&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vamos conferir?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb13-1"&gt;tipos &lt;span&gt;=&lt;/span&gt; pd.concat([pokemons[&lt;span&gt;'Type 1'&lt;/span&gt;], pokemons[&lt;span&gt;'Type 2'&lt;/span&gt;]]).unique().tolist()&lt;/span&gt;
&lt;span id="cb13-2"&gt;&lt;/span&gt;
&lt;span id="cb13-3"&gt;&lt;/span&gt;
&lt;span id="cb13-4"&gt;&lt;span&gt;print&lt;/span&gt;(&lt;span&gt;len&lt;/span&gt;(tipos))&lt;/span&gt;
&lt;span id="cb13-5"&gt;&lt;span&gt;print&lt;/span&gt;(tipos)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;19
['Grass', 'Fire', 'Water', 'Bug', 'Normal', 'Dark', 'Poison', 'Electric', 'Ground', 'Ice', 'Fairy', 'Steel', 'Fighting', 'Psychic', 'Rock', 'Ghost', 'Dragon', 'Flying', nan]&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Parece que funciona mesmo! Note que o nosso vetor tem 19 posições porque está contando o nulo como um valor. Vamos nos aprofundar mais um pouco…&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb15-1"&gt;pandas_ai.run(pokemons, prompt&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Liste os tipos com as quantidades de pokemons'&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;'Existem diversos tipos de pokemons e suas quantidades variam. O tipo mais comum é o Normal, com 114 pokemons, seguido pelo tipo Água, com 131. Já o tipo Voador é o menos comum, com apenas 8 pokemons. Além disso, existem outros tipos como Fogo, Grama, Elétrico, Psíquico, entre outros, cada um com sua quantidade específica de pokemons. No total, existem mais de 800 espécies diferentes de pokemons.'&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ele respondeu, mas não exatamente como queríamos - observe que ele listou alguns tipos apenas com suas quantidades. Vamos tentar melhorar, aplicando um pouco de prompt engineering (ou seja, escrever nossa solicitação de forma mais explícita).&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb17-1"&gt;pandas_ai.run(pokemons, prompt&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"Crie uma tabela que tem duas colunas: tipo de pokemon e quantidade. Liste todos os tipos possíveis e suas quantidades."&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;'Para responder à pergunta, criei uma tabela com duas colunas: tipo de pokemon e quantidade. Nessa tabela, listei todos os tipos possíveis de pokemon e suas respectivas quantidades. Por exemplo, há 81 pokemons do tipo Bug, 46 do tipo Dark, 42 do tipo Dragon, e assim por diante. No total, foram listados 18 tipos diferentes de pokemon e suas quantidades correspondentes.'&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Humm, ainda não conseguimos listar todos os tipos. Vamos explicar um pouco mais?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb19-1"&gt;pandas_ai.run(pokemons, prompt&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"Gerar uma listagem completa da quantidade de pokemons por tipo, em formato markdown."&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;'Para saber a quantidade de pokemons por tipo, podemos gerar uma listagem completa em formato markdown. Aqui está a tabela com o número de pokemons para cada tipo: \n\n| Type | Count |\n|------|-------|\n| Bug | 81 |\n| Dark | 46 |\n| Dragon | 42 |\n| Electric | 59 |\n| Fairy | 22 |\n| Fighting | 42 |\n| Fire | 64 |\n| Flying | 8 |\n| Ghost | 41 |\n| Grass | 91 |\n| Ground | 41 |\n| Ice | 38 |\n| Normal | 114 |\n| Poison | 40 |\n| Psychic | 77 |\n| Rock | 59 |\n| Steel | 36 |\n| Water | 131 |\n\nAssim, você pode ter uma visão geral da distribuição dos tipos de pokemons na lista.'&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Opa,agora foi. Mas como o notebook não formata markdown no output, precisamos fazer um copia e cola do resultado.&lt;/p&gt;

&lt;p&gt;Para saber a quantidade de pokemons por tipo, podemos gerar uma listagem completa em formato markdown. Aqui está a tabela com o número de pokemons para cada tipo:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bug&lt;/td&gt;
&lt;td&gt;81&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dark&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dragon&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Electric&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fairy&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fighting&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fire&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flying&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ghost&lt;/td&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grass&lt;/td&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ground&lt;/td&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ice&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Normal&lt;/td&gt;
&lt;td&gt;114&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Poison&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Psychic&lt;/td&gt;
&lt;td&gt;77&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rock&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Steel&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Water&lt;/td&gt;
&lt;td&gt;131&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Assim, você pode ter uma visão geral da distribuição dos tipos de pokemons na lista.’&lt;/p&gt;



&lt;h2&gt;Vamos complicar um pouco?&lt;/h2&gt;

&lt;p&gt;Nas primeiras perguntas, utilizamos perguntas que pedem respostas quase que diretas das métricas que temos no DataFrame. Contamos o número de pokemons, contamos valores distinto de tipos, agrupamos a contagem por tipos. Mas será que o Pandas AI pode fazer uma análise comparativa simples, tal como analisar uma métrica e retornar o insight solicitado?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb21-1"&gt;pandas_ai.run(pokemons, prompt&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"Qual o pokemon mais pesado?"&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;'Bem, o pokemon mais pesado é o Snorlax, ele pode chegar a pesar mais de 460 quilos!'&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Opa, e não é que respondeu? Mas, sem precipitação, vamos conferir: vamos executar uma query em pandas que filtra os pokemons com peso &amp;gt;= ao do Snorlax.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb23-1"&gt;pokemons[[&lt;span&gt;"Name"&lt;/span&gt;,&lt;span&gt;"Weight"&lt;/span&gt;]].sort_values(&lt;span&gt;"Weight"&lt;/span&gt;).query(&lt;span&gt;"Weight &amp;gt; 459"&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;925&lt;/td&gt;
&lt;td&gt;Dusk Mane Necrozma&lt;/td&gt;
&lt;td&gt;460.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;181&lt;/td&gt;
&lt;td&gt;Snorlax&lt;/td&gt;
&lt;td&gt;460.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;837&lt;/td&gt;
&lt;td&gt;Hoopa Unbound&lt;/td&gt;
&lt;td&gt;490.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;826&lt;/td&gt;
&lt;td&gt;Avalugg&lt;/td&gt;
&lt;td&gt;505.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1001&lt;/td&gt;
&lt;td&gt;Stonjourner&lt;/td&gt;
&lt;td&gt;520.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;445&lt;/td&gt;
&lt;td&gt;Metagross&lt;/td&gt;
&lt;td&gt;550.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;833&lt;/td&gt;
&lt;td&gt;Zygarde Complete&lt;/td&gt;
&lt;td&gt;610.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;578&lt;/td&gt;
&lt;td&gt;Giratina-Origin&lt;/td&gt;
&lt;td&gt;650.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1007&lt;/td&gt;
&lt;td&gt;Copperajah&lt;/td&gt;
&lt;td&gt;650.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;573&lt;/td&gt;
&lt;td&gt;Dialga&lt;/td&gt;
&lt;td&gt;683.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;254&lt;/td&gt;
&lt;td&gt;Mega Steelix&lt;/td&gt;
&lt;td&gt;740.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;577&lt;/td&gt;
&lt;td&gt;Giratina&lt;/td&gt;
&lt;td&gt;750.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1019&lt;/td&gt;
&lt;td&gt;Zamazenta Crowned Shield&lt;/td&gt;
&lt;td&gt;785.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1027&lt;/td&gt;
&lt;td&gt;Glastrier&lt;/td&gt;
&lt;td&gt;800.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;936&lt;/td&gt;
&lt;td&gt;Melmetal&lt;/td&gt;
&lt;td&gt;800.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1030&lt;/td&gt;
&lt;td&gt;Calyrex Ice Rider&lt;/td&gt;
&lt;td&gt;809.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;932&lt;/td&gt;
&lt;td&gt;Stakataka&lt;/td&gt;
&lt;td&gt;820.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;923&lt;/td&gt;
&lt;td&gt;Guzzlord&lt;/td&gt;
&lt;td&gt;888.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;873&lt;/td&gt;
&lt;td&gt;Mudsdale&lt;/td&gt;
&lt;td&gt;920.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;446&lt;/td&gt;
&lt;td&gt;Mega Metagross&lt;/td&gt;
&lt;td&gt;942.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1020&lt;/td&gt;
&lt;td&gt;Eternatus&lt;/td&gt;
&lt;td&gt;950.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;456&lt;/td&gt;
&lt;td&gt;Groudon&lt;/td&gt;
&lt;td&gt;950.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;457&lt;/td&gt;
&lt;td&gt;Primal Groudon&lt;/td&gt;
&lt;td&gt;999.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;914&lt;/td&gt;
&lt;td&gt;Cosmoem&lt;/td&gt;
&lt;td&gt;999.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;921&lt;/td&gt;
&lt;td&gt;Celesteela&lt;/td&gt;
&lt;td&gt;999.9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;br&gt;


&lt;p&gt;Ops, algo deu errado. Temos vários pokemons mais pesados. Será que ele não analisou todos os pokemons antes de responder? Quem sabe um problema nos dados? Vamos perguntar algo mais direto.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;&lt;span id="cb24-1"&gt;pandas_ai.run(pokemons, prompt&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"O pokemon Dialga é mais ou menos pesado que o Snorlax?"&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;'Well, it turns out that Snorlax is actually heavier than Dialga.'&lt;/code&gt;&lt;/pre&gt;




&lt;p&gt;Isso certamente deve ser um problema. Ele passou a responder em inglês, como se tivesse perdido o contexto. Vamos perguntar de maneira diferente…&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;&lt;span id="cb26-1"&gt;pandas_ai.run(pokemons, prompt&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"Porque o pokemon Dialga é mais pesado que o Snorlax?"&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;'Well, actually, Snorlax weighs more than Dialga.'&lt;/code&gt;&lt;/pre&gt;




&lt;p&gt;É, ele realmente tem uma implicância com o Snorlax… Caso você não tenha lido nada a respeito do ChatGPT e LLMs em geral, esse tipo de erro é chamado de “alucinação” que ocorre quando o modelo produz resultados incorretos, correlacionando informações de maneira espúria.&lt;/p&gt;



&lt;h2&gt;Usando outras funcionalidades do Pandas via conversação&lt;/h2&gt;

&lt;p&gt;Agora vamos testar se o pandasAI consegue entender instruções para plotar gráficos. Isso é um DataFrame pandas, correto? Será que eu posso plotar um countplot() por geração?&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;&lt;span id="cb28-1"&gt;pandas_ai.run(pokemons, prompt&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"Plote um gráfico de colunas totalizando pokemons por geração."&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fp0002-pandasai%2Findex_files%2Ffigure-html%2Fcell-17-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fp0002-pandasai%2Findex_files%2Ffigure-html%2Fcell-17-output-1.png" width="571" height="463"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;'Claro! Vou plotar um gráfico de colunas que mostra a quantidade total de pokemons por geração.'&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Parece que funcionou bem! Vamos tentar mais um?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb30-1"&gt;&lt;/span&gt;
&lt;span id="cb30-2"&gt;pandas_ai.run(pokemons, prompt&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"Plote um gráfico de pizza totalizando pokemons pelo campo lendário."&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fp0002-pandasai%2Findex_files%2Ffigure-html%2Fcell-18-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fp0002-pandasai%2Findex_files%2Ffigure-html%2Fcell-18-output-1.png" width="389" height="411"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;'Sure, I can help you with that! To plot a pie chart showing the total number of legendary Pokémon, we need to gather the data first. Once we have the numbers, we can create a visual representation of the data using a pie chart. Would you like me to proceed with the task?'&lt;/code&gt;&lt;/pre&gt;


&lt;br&gt;


&lt;h2&gt;O que aprendemos até aqui&lt;/h2&gt;

&lt;p&gt;A biblioteca Pandas AI é uma biblioteca interessante, que nos permite “dialogar”com nossos DataFrames, extraindo informações do mesmo. Através de nossos exemplos, podemos verificar que quase tudo que podemos descobrir através de consultas normais pandas, podemos perguntar ao DataFrame através do Pandas AI.&lt;/p&gt;

&lt;h3&gt;Mas nem tudo são flores…&lt;/h3&gt;

&lt;p&gt;Apesar dos acertos, observamos que a biblioteca Pandas AI não é imune aos problemas comuns das LLM, e mesmo com uma base de conhecimento mais limitada, é acometida de alucinações. A biblioteca também sofre de um problema de performance: uma resposta que em pandas leva um segundo ou menos para ser mostrada, como podemos ver, pode levar até mais de 1 minuto usando PandasAI.&lt;/p&gt;

&lt;p&gt;Por último, podemos perceber que a biblioteca ainda precisa um pouco mais de trabalho até mesmo em sua usabilidade - notamos que a mesma passa a responder em inglês quando a resposta está errada, deixando o usuário confuso.&lt;/p&gt;



&lt;h2&gt;Vale a pena utilizar?&lt;/h2&gt;

&lt;p&gt;Se você quer fazer explorações simples dos dados, parece ser uma boa idéia utilizar o PandasAI, visto que é mais fácil perguntar em português ou inglês do que lembrar a sintaxe de todos os comandos Pandas que você teria que fazer para isso. No entanto, é preciso tomar muito cuidado com os resultados, que podem estar errados, mas são comunicados com convicção.&lt;/p&gt;

&lt;p&gt;É, com certeza, mais uma ferramenta no seu cinto de utilidades de cientista de dados, e como toda ferramenta, devemos conhece-la bem antes de usar. Explore mais, entenda suas limitações e faça o melhor uso possivel!&lt;/p&gt;

&lt;p&gt;Até mais!!!&lt;/p&gt;

&lt;p&gt;Walter.&lt;/p&gt;



</description>
      <category>ciênciadedados</category>
      <category>pandas</category>
      <category>ai</category>
      <category>gpt</category>
    </item>
    <item>
      <title>Parte 09 - Seaborn - Melhorando seus Visuais</title>
      <dc:creator>Walter R P Cortes</dc:creator>
      <pubDate>Sun, 12 Feb 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/wpcortes75/parte-09-seaborn-melhorando-seus-visuais-4g3</link>
      <guid>https://dev.to/wpcortes75/parte-09-seaborn-melhorando-seus-visuais-4g3</guid>
      <description>&lt;p&gt;Olá Devs!&lt;/p&gt;

&lt;p&gt;Se você chegou até aqui, você já se familiarizou com o básico das bibliotecas seaborn, matplotlib e pandas! Esse conhecimento já garante a você a capacidade de realizar análises de dados e apresentar resultados de maneira simples e eficiente.&lt;/p&gt;

&lt;p&gt;O próximo passo é ensiná-lo a dar a esses gráficos uma aparência extremamente profissional e que leve em conta as boas práticas da área de Visualização de Dados. Para isso, vamos apresentar um pequeno problema e a versão inicial da visualização com o conhecimento que temos e, depois, apresentamos o passo a passo com as boas práticas e como codifica-las, chegando a nossa versão final da visualização.&lt;/p&gt;

&lt;h2&gt;Problema&lt;/h2&gt;

&lt;p&gt;Considere o seguinte cenário: Você é um cientista de dados encarregado de fazer uma análise em cima dos dados da população mundial. Os seus gráficos serão incorporados em uma apresentação PowerPoint.&lt;/p&gt;

&lt;p&gt;O gráfico que você deve montar mostra a evolução no tamanho da população dos países do bloco econômico BRICS (Brasil, Russia, India, China e Africa do Sul), fazendo uma comparação com os Estados Unidos. Deve ser um gráfico de barras, onde cada barra irá representar um ano ou década.&lt;/p&gt;

&lt;p&gt;O arquivo com os dados pode ser encontrado &lt;a href="https://media.githubusercontent.com/media/labeduc/datasets/main/worldpop/world_population.csv" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;. Você pode fazer o download e subir no seu Google Colab ou carregar diretamente do endereço.&lt;/p&gt;

&lt;h2&gt;Solução Passo a Passo&lt;/h2&gt;

&lt;h3&gt;Carregando Bibliotecas&lt;/h3&gt;

&lt;p&gt;O primeiro passo é sempre carregar as bibliotecas que vamos utilizar.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb1-1"&gt;&lt;span&gt;import&lt;/span&gt; pandas &lt;span&gt;as&lt;/span&gt; pd&lt;/span&gt;
&lt;span id="cb1-2"&gt;&lt;span&gt;import&lt;/span&gt; seaborn &lt;span&gt;as&lt;/span&gt; sns&lt;/span&gt;
&lt;span id="cb1-3"&gt;&lt;span&gt;import&lt;/span&gt; matplotlib.pyplot &lt;span&gt;as&lt;/span&gt; plt&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Carregando dados&lt;/h3&gt;

&lt;p&gt;A próxima etapa é carregar os dados. Durante o curso, utilizamos um arquivo local para fazer isso. Hoje vamos exercitar uma pequena variação. Como explicamos anteriormente, todos os nossos conjuntos de dados estão em um repositório no GitHub -&amp;gt; &lt;a href="https://github.com/labeduc/datasets" rel="noopener noreferrer"&gt;https://github.com/labeduc/datasets&lt;/a&gt;. Ensinamos vocês a baixarem o repositório no seu computador e subir o arquivo que vocês vão trabalhar direto no Google Colab (que é temporário e precisar ser salvo lá cada vez que se abre o notebook) ou colocar no seu Google Drive e mapear o Google Drive no Google Colab.&lt;/p&gt;

&lt;p&gt;Agora, vamos explorar uma capacidade da biblioteca pandas que é ler o arquivo direto da internet. O que fizemos foi ir até o Github e observar qual era a URL de download do arquivo que pretendemos usar. Copiamos e colocamos no primeiro parâmetro da função &lt;code&gt;read_csv()&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb2-1"&gt;worldpop &lt;span&gt;=&lt;/span&gt; pd.read_csv(&lt;span&gt;'https://media.githubusercontent.com/media/labeduc/datasets/main/worldpop/world_population.csv'&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Para verificar que temos os dados carregados, vamos pedir um sample de 2 linhas.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb3-1"&gt;worldpop.sample(&lt;span&gt;2&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Rank&lt;/th&gt;
&lt;th&gt;CCA3&lt;/th&gt;
&lt;th&gt;Country&lt;/th&gt;
&lt;th&gt;Capital&lt;/th&gt;
&lt;th&gt;Continent&lt;/th&gt;
&lt;th&gt;2022 Population&lt;/th&gt;
&lt;th&gt;2020 Population&lt;/th&gt;
&lt;th&gt;2015 Population&lt;/th&gt;
&lt;th&gt;2010 Population&lt;/th&gt;
&lt;th&gt;2000 Population&lt;/th&gt;
&lt;th&gt;1990 Population&lt;/th&gt;
&lt;th&gt;1980 Population&lt;/th&gt;
&lt;th&gt;1970 Population&lt;/th&gt;
&lt;th&gt;Area (km²)&lt;/th&gt;
&lt;th&gt;Density (per km²)&lt;/th&gt;
&lt;th&gt;Growth Rate&lt;/th&gt;
&lt;th&gt;World Population Percentage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;131&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;MEX&lt;/td&gt;
&lt;td&gt;Mexico&lt;/td&gt;
&lt;td&gt;Mexico City&lt;/td&gt;
&lt;td&gt;North America&lt;/td&gt;
&lt;td&gt;127504125&lt;/td&gt;
&lt;td&gt;125998302&lt;/td&gt;
&lt;td&gt;120149897&lt;/td&gt;
&lt;td&gt;112532401&lt;/td&gt;
&lt;td&gt;97873442&lt;/td&gt;
&lt;td&gt;81720428&lt;/td&gt;
&lt;td&gt;67705186&lt;/td&gt;
&lt;td&gt;50289306&lt;/td&gt;
&lt;td&gt;1964375&lt;/td&gt;
&lt;td&gt;64.9082&lt;/td&gt;
&lt;td&gt;1.0063&lt;/td&gt;
&lt;td&gt;1.60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;194&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;KOR&lt;/td&gt;
&lt;td&gt;South Korea&lt;/td&gt;
&lt;td&gt;Seoul&lt;/td&gt;
&lt;td&gt;Asia&lt;/td&gt;
&lt;td&gt;51815810&lt;/td&gt;
&lt;td&gt;51844690&lt;/td&gt;
&lt;td&gt;50994401&lt;/td&gt;
&lt;td&gt;48813042&lt;/td&gt;
&lt;td&gt;46788591&lt;/td&gt;
&lt;td&gt;44120039&lt;/td&gt;
&lt;td&gt;38170501&lt;/td&gt;
&lt;td&gt;32601143&lt;/td&gt;
&lt;td&gt;100210&lt;/td&gt;
&lt;td&gt;517.0722&lt;/td&gt;
&lt;td&gt;0.9997&lt;/td&gt;
&lt;td&gt;0.65&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Perfeito, temos os dados, e estamos prontos para prosseguir.&lt;/p&gt;

&lt;h3&gt;Analisando os dados&lt;/h3&gt;

&lt;p&gt;A primeira coisa que podemos fazer nesta análise é descobrir quais são todos os campos de conjunto de dados, seus tipos de dados e se temos muitos campos vazios.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb4-1"&gt;worldpop.info()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;class 'pandas.core.frame.DataFrame'&amp;gt;
RangeIndex: 234 entries, 0 to 233
Data columns (total 17 columns):
 # Column Non-Null Count Dtype  
--- ------ -------------- -----  
 0 Rank 234 non-null int64  
 1 CCA3 234 non-null object 
 2 Country 234 non-null object 
 3 Capital 234 non-null object 
 4 Continent 234 non-null object 
 5 2022 Population 234 non-null int64  
 6 2020 Population 234 non-null int64  
 7 2015 Population 234 non-null int64  
 8 2010 Population 234 non-null int64  
 9 2000 Population 234 non-null int64  
 10 1990 Population 234 non-null int64  
 11 1980 Population 234 non-null int64  
 12 1970 Population 234 non-null int64  
 13 Area (km²) 234 non-null int64  
 14 Density (per km²) 234 non-null float64
 15 Growth Rate 234 non-null float64
 16 World Population Percentage 234 non-null float64
dtypes: float64(3), int64(10), object(4)
memory usage: 31.2+ KB&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A informação está bem estruturada: todos os campos tem valores, os campos númerico são de um tipo numérico, temos poucas categorias e são do tipo object, que basicamente diz que são texto.&lt;/p&gt;

&lt;p&gt;Podemos perceber que estruturalmente, esse conjunto de dados tem um país por linha, com os anos sendo colunas. Em um cenário ideal, os nossos gráficos devem plotar a partir de uma única coluna de valor, e teríamos algum outro atributo para separa-los se for o caso.&lt;/p&gt;

&lt;p&gt;Outro ponto a ser considerado é que precisamos apenas dos Estados Unidos e dos países do bloco econômico BRICS, então temos mais dados do que o necessário.&lt;/p&gt;

&lt;p&gt;Isso significa que vamos fazer alguns ajustes nos nossos dados.&lt;/p&gt;

&lt;h3&gt;Transformando os dados&lt;/h3&gt;

&lt;p&gt;Acompanhem explicações nos comentários.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb6-1"&gt;&lt;span&gt;# Primeira coisa é selecionar apenas as colunas que vamos utilizar&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb6-2"&gt;worldpop_sb &lt;span&gt;=&lt;/span&gt; worldpop[[&lt;span&gt;"Country"&lt;/span&gt;, &lt;/span&gt;
&lt;span id="cb6-3"&gt; &lt;span&gt;"1970 Population"&lt;/span&gt;,&lt;/span&gt;
&lt;span id="cb6-4"&gt; &lt;span&gt;"1980 Population"&lt;/span&gt;,&lt;/span&gt;
&lt;span id="cb6-5"&gt; &lt;span&gt;"1990 Population"&lt;/span&gt;,&lt;/span&gt;
&lt;span id="cb6-6"&gt; &lt;span&gt;"2000 Population"&lt;/span&gt;,&lt;/span&gt;
&lt;span id="cb6-7"&gt; &lt;span&gt;"2010 Population"&lt;/span&gt;,&lt;/span&gt;
&lt;span id="cb6-8"&gt; &lt;span&gt;"2015 Population"&lt;/span&gt;,&lt;/span&gt;
&lt;span id="cb6-9"&gt; &lt;span&gt;"2020 Population"&lt;/span&gt;,&lt;/span&gt;
&lt;span id="cb6-10"&gt; &lt;span&gt;"2022 Population"&lt;/span&gt;]]&lt;/span&gt;
&lt;span id="cb6-11"&gt;&lt;/span&gt;
&lt;span id="cb6-12"&gt;&lt;span&gt;# Em seguida, filtramos as linhas para pegar apenas US e os países do BRICS&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb6-13"&gt;worldpop_sb2 &lt;span&gt;=&lt;/span&gt; worldpop_sb.query(&lt;span&gt;"Country in ('United States', 'Brazil', 'Russia', 'India', 'China', 'South Africa')"&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb6-14"&gt;&lt;/span&gt;
&lt;span id="cb6-15"&gt;&lt;span&gt;# Fazemos a transformação das colunas de ano em linhas.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb6-16"&gt;brics_us &lt;span&gt;=&lt;/span&gt; worldpop_sb2.melt(id_vars&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Country'&lt;/span&gt;, var_name&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Year'&lt;/span&gt;, value_name&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Population'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb6-17"&gt;&lt;/span&gt;
&lt;span id="cb6-18"&gt;&lt;span&gt;# Pedimos uma amostra para ver como nossos dados ficaram.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb6-19"&gt;&lt;span&gt;# Parece tudo certo, temos apenas paises do BRICS e US,&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb6-20"&gt;&lt;span&gt;# no caso do Brasil, vemos agora duas linhas, uma para a&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb6-21"&gt;&lt;span&gt;# informação do ano de 2022 e outra para 2015.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb6-22"&gt;brics_us.sample(&lt;span&gt;5&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Country&lt;/th&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Population&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;China&lt;/td&gt;
&lt;td&gt;1970 Population&lt;/td&gt;
&lt;td&gt;822534450&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;China&lt;/td&gt;
&lt;td&gt;1990 Population&lt;/td&gt;
&lt;td&gt;1153704252&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;India&lt;/td&gt;
&lt;td&gt;2015 Population&lt;/td&gt;
&lt;td&gt;1322866505&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;China&lt;/td&gt;
&lt;td&gt;2000 Population&lt;/td&gt;
&lt;td&gt;1264099069&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;Brazil&lt;/td&gt;
&lt;td&gt;2000 Population&lt;/td&gt;
&lt;td&gt;175873720&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Aí estão nossos dados, devidamente formatados. Vamos agora plotar o gráfico.&lt;/p&gt;

&lt;h3&gt;Primeira Versão&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb7-1"&gt;sns.barplot(brics_us, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Country'&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Population'&lt;/span&gt;, hue&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Year'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb7-2"&gt;&lt;/span&gt;
&lt;span id="cb7-3"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-7-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-7-output-1.png" width="572" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E aí está nosso gráfico. A partir de agora, vamos passo a passo aplicando melhorias sucessivas.&lt;/p&gt;

&lt;h3&gt;Passo 1 - Adicionando Títulos&lt;/h3&gt;

&lt;p&gt;Os gráficos precisam de títulos, preferencialmente um título que esclareça o significado do gráfico. Em nossas aulas anteriores, já haviamos adicionado títulos significativos em nossos gráficos e nos eixos também. Então, vamos apenas relembrar.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb8-1"&gt;sns.barplot(brics_us, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Country'&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Population'&lt;/span&gt;, hue&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Year'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb8-2"&gt;&lt;span&gt;# Esta função adiciona um título no gráfico&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-3"&gt;plt.title(&lt;span&gt;'Crescimento Populacional no BRICS (1970 - 2020)'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb8-4"&gt;&lt;/span&gt;
&lt;span id="cb8-5"&gt;&lt;span&gt;# Estas funções nos permitem alterar o títulos nos eixos&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-6"&gt;plt.xlabel(&lt;span&gt;'Países'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb8-7"&gt;plt.ylabel(&lt;span&gt;'População'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb8-8"&gt;&lt;/span&gt;
&lt;span id="cb8-9"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-8-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-8-output-1.png" width="572" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Passo 2 - Ajustando tamanho da imagem&lt;/h3&gt;

&lt;p&gt;Ao olharmos nosso gráfico, logo percebemos que os nomes dos países estão se sobrepondo no final. Para este e muitos outros ajustes, vamos introduzir a propriedade rcParams. Esta propriedade é um dicionário que armazena outras configurações. Você pode encontrar mais informaç!oes &lt;a href="https://matplotlib.org/stable/api/matplotlib_configuration_api.html#matplotlib.rcParams" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb9-1"&gt;&lt;span&gt;# É aconselhavel mudar o tamanho da imagem antes de plotar&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb9-2"&gt;&lt;span&gt;# Para tanto, o MatPlotLib nos permite modificar entradas &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb9-3"&gt;&lt;span&gt;# em um dicionário de parâmetros chamado rcParams.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb9-4"&gt;&lt;span&gt;# A nossa modificação será da entrada figure.figsize&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb9-5"&gt;&lt;span&gt;# Este parâmetro recebe uma tupla com largura e altura em polegadas&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb9-6"&gt;&lt;span&gt;# O valor padrão é 6.4 de largura e 4.8 de altura em polegadas&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb9-7"&gt;plt.rcParams[&lt;span&gt;"figure.figsize"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; (&lt;span&gt;9&lt;/span&gt;,&lt;span&gt;5&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb9-8"&gt;&lt;/span&gt;
&lt;span id="cb9-9"&gt;sns.barplot(brics_us, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Country'&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Population'&lt;/span&gt;, hue&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Year'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb9-10"&gt;&lt;/span&gt;
&lt;span id="cb9-11"&gt;&lt;span&gt;# Esta função adiciona um título no gráfico&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb9-12"&gt;plt.title(&lt;span&gt;'Crescimento Populacional no BRICS (1970 - 2020)'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb9-13"&gt;&lt;/span&gt;
&lt;span id="cb9-14"&gt;&lt;span&gt;# Estas funções nos permitem alterar o títulos nos eixos&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb9-15"&gt;plt.xlabel(&lt;span&gt;'Países'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb9-16"&gt;plt.ylabel(&lt;span&gt;'População'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb9-17"&gt;&lt;/span&gt;
&lt;span id="cb9-18"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-9-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-9-output-1.png" width="768" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse tamanho deixou as barras mais separadas, e agora conseguimos ver claramente todos os países.&lt;/p&gt;

&lt;h3&gt;Passo 3 - Ajustando Qualidade da Imagem&lt;/h3&gt;

&lt;p&gt;Dentro do contexto de visualização online, nosso gráfico parece bom. Mas, se precisarmos exportar esse gráfico como imagem para usar em um powerpoint, por exemplo, veremos que a qualidade da imagem ficará ruim. Isso acontece porque o padrão do matplotlib é gerar imagens com resolução de 100dpi. Para exportar, normalmente é recomendado utilizar 300dpi. Vamos arrumar isso e ver como fica?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb10-1"&gt;&lt;span&gt;# É aconselhavel mudar o tamanho da imagem antes de plotar&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb10-2"&gt;&lt;span&gt;# Para tanto, o MatPlotLib nos permite modificar entradas &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb10-3"&gt;&lt;span&gt;# em um dicionário de parâmetros chamado rcParams.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb10-4"&gt;&lt;span&gt;# A nossa modificação será da entrada figure.figsize&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb10-5"&gt;&lt;span&gt;# Este parâmetro recebe uma tupla com largura e altura em polegadas&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb10-6"&gt;&lt;span&gt;# O valor padrão é 6.4 de largura e 4.8 de altura em polegadas&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb10-7"&gt;plt.rcParams[&lt;span&gt;"figure.figsize"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; (&lt;span&gt;9&lt;/span&gt;,&lt;span&gt;5&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb10-8"&gt;&lt;/span&gt;
&lt;span id="cb10-9"&gt;&lt;span&gt;#Ajustando qualidade da imagem&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb10-10"&gt;plt.rcParams[&lt;span&gt;"figure.dpi"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;300&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb10-11"&gt;plt.rcParams[&lt;span&gt;"savefig.dpi"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;300&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb10-12"&gt;plt.rcParams[&lt;span&gt;"savefig.format"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;"svg"&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb10-13"&gt;&lt;/span&gt;
&lt;span id="cb10-14"&gt;sns.barplot(brics_us, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Country'&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Population'&lt;/span&gt;, hue&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Year'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb10-15"&gt;&lt;/span&gt;
&lt;span id="cb10-16"&gt;&lt;span&gt;# Esta função adiciona um título no gráfico&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb10-17"&gt;plt.title(&lt;span&gt;'Crescimento Populacional no BRICS (1970 - 2020)'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb10-18"&gt;&lt;/span&gt;
&lt;span id="cb10-19"&gt;&lt;span&gt;# Estas funções nos permitem alterar o títulos nos eixos&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb10-20"&gt;plt.xlabel(&lt;span&gt;'Países'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb10-21"&gt;plt.ylabel(&lt;span&gt;'População'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb10-22"&gt;&lt;/span&gt;
&lt;span id="cb10-23"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-10-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-10-output-1.png" width="800" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Passo 4 - Removendo o “Ruído” do Gráfico&lt;/h3&gt;

&lt;p&gt;De acordo com as boas práticas na área de visualização, uma boa visualização é limpa, ou seja, não possui elementos que não estejam relacionados aos dados. No gráfico acima, o box em torno do gráfico, a legenda com muito texto, aquela informação 1e9 perdida no gráfico são ruídos, que tiram a atenção das barras que são os dados.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb11-1"&gt;&lt;span&gt;# É aconselhavel mudar o tamanho da imagem antes de plotar&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb11-2"&gt;&lt;span&gt;# Para tanto, o MatPlotLib nos permite modificar entradas &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb11-3"&gt;&lt;span&gt;# em um dicionário de parâmetros chamado rcParams.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb11-4"&gt;&lt;span&gt;# A nossa modificação será da entrada figure.figsize&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb11-5"&gt;&lt;span&gt;# Este parâmetro recebe uma tupla com largura e altura em polegadas&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb11-6"&gt;&lt;span&gt;# O valor padrão é 6.4 de largura e 4.8 de altura em polegadas&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb11-7"&gt;plt.rcParams[&lt;span&gt;"figure.figsize"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; (&lt;span&gt;9&lt;/span&gt;,&lt;span&gt;5&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb11-8"&gt;&lt;/span&gt;
&lt;span id="cb11-9"&gt;&lt;span&gt;#Ajustando qualidade da imagem&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb11-10"&gt;plt.rcParams[&lt;span&gt;"figure.dpi"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;300&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb11-11"&gt;plt.rcParams[&lt;span&gt;"savefig.dpi"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;300&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb11-12"&gt;plt.rcParams[&lt;span&gt;"savefig.format"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;"svg"&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb11-13"&gt;&lt;/span&gt;
&lt;span id="cb11-14"&gt;&lt;span&gt;# Para remover parte do box da imagem, fazemos isso:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb11-15"&gt;plt.rcParams[&lt;span&gt;"axes.spines.right"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb11-16"&gt;plt.rcParams[&lt;span&gt;"axes.spines.top"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb11-17"&gt;plt.rcParams[&lt;span&gt;"axes.spines.bottom"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb11-18"&gt;&lt;/span&gt;
&lt;span id="cb11-19"&gt;plt.ticklabel_format(style&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"plain"&lt;/span&gt;, useLocale&lt;span&gt;=&lt;/span&gt;&lt;span&gt;True&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb11-20"&gt;&lt;/span&gt;
&lt;span id="cb11-21"&gt;sns.barplot(brics_us, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Country'&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Population'&lt;/span&gt;, hue&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Year'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb11-22"&gt;&lt;/span&gt;
&lt;span id="cb11-23"&gt;&lt;span&gt;# Esta função adiciona um título no gráfico&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb11-24"&gt;plt.title(&lt;span&gt;'Crescimento Populacional no BRICS (1970 - 2020)'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb11-25"&gt;&lt;/span&gt;
&lt;span id="cb11-26"&gt;&lt;span&gt;# Estas funções nos permitem alterar o títulos nos eixos&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb11-27"&gt;plt.xlabel(&lt;span&gt;'Países'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb11-28"&gt;plt.ylabel(&lt;span&gt;'População'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb11-29"&gt;&lt;/span&gt;
&lt;span id="cb11-30"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-11-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-11-output-1.png" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Conseguimos deixar a imagem maior, removemos alguns elementos que adicionavam apenas ruído no gráfico. Mas observem que agora a formatação dos valores no eixo Y está estranho. Vamos corrigir?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb12-1"&gt;&lt;span&gt;# É aconselhavel mudar o tamanho da imagem antes de plotar&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-2"&gt;&lt;span&gt;# Para tanto, o MatPlotLib nos permite modificar entradas &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-3"&gt;&lt;span&gt;# em um dicionário de parâmetros chamado rcParams.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-4"&gt;&lt;span&gt;# A nossa modificação será da entrada figure.figsize&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-5"&gt;&lt;span&gt;# Este parâmetro recebe uma tupla com largura e altura em polegadas&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-6"&gt;&lt;span&gt;# O valor padrão é 6.4 de largura e 4.8 de altura em polegadas&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-7"&gt;plt.rcParams[&lt;span&gt;"figure.figsize"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; (&lt;span&gt;9&lt;/span&gt;,&lt;span&gt;5&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb12-8"&gt;&lt;/span&gt;
&lt;span id="cb12-9"&gt;&lt;span&gt;#Ajustando qualidade da imagem&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-10"&gt;plt.rcParams[&lt;span&gt;"figure.dpi"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;300&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-11"&gt;plt.rcParams[&lt;span&gt;"savefig.dpi"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;300&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-12"&gt;plt.rcParams[&lt;span&gt;"savefig.format"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;"svg"&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-13"&gt;&lt;/span&gt;
&lt;span id="cb12-14"&gt;&lt;span&gt;# Para remover parte do box da imagem, fazemos isso:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-15"&gt;plt.rcParams[&lt;span&gt;"axes.spines.right"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-16"&gt;plt.rcParams[&lt;span&gt;"axes.spines.top"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-17"&gt;plt.rcParams[&lt;span&gt;"axes.spines.bottom"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-18"&gt;&lt;/span&gt;
&lt;span id="cb12-19"&gt;plt.ticklabel_format(style&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"plain"&lt;/span&gt;, useLocale&lt;span&gt;=&lt;/span&gt;&lt;span&gt;True&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb12-20"&gt;&lt;/span&gt;
&lt;span id="cb12-21"&gt;sns.barplot(brics_us, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Country'&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Population'&lt;/span&gt;, hue&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Year'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb12-22"&gt;&lt;/span&gt;
&lt;span id="cb12-23"&gt;&lt;span&gt;# Aqui buscamos os valores que foram adicionados no eixo e os modificamos &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-24"&gt;&lt;span&gt;# com a formatação adequada&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-25"&gt;current_values &lt;span&gt;=&lt;/span&gt; plt.gca().get_yticks()&lt;/span&gt;
&lt;span id="cb12-26"&gt;plt.gca().set_yticklabels([&lt;span&gt;'&lt;/span&gt;&lt;span&gt;{:,.1f}&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;.&lt;span&gt;format&lt;/span&gt;(x) &lt;span&gt;for&lt;/span&gt; x &lt;span&gt;in&lt;/span&gt; current_values&lt;span&gt;/&lt;/span&gt;&lt;span&gt;1000000000&lt;/span&gt;])&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-27"&gt;&lt;/span&gt;
&lt;span id="cb12-28"&gt;&lt;span&gt;# Esta função adiciona um título no gráfico&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-29"&gt;plt.title(&lt;span&gt;'Crescimento Populacional no BRICS (1970 - 2020)'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb12-30"&gt;&lt;/span&gt;
&lt;span id="cb12-31"&gt;&lt;span&gt;# Estas funções nos permitem alterar o títulos nos eixos&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb12-32"&gt;plt.xlabel(&lt;span&gt;'Países'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb12-33"&gt;plt.ylabel(&lt;span&gt;'População (bilhões)'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb12-34"&gt;&lt;/span&gt;
&lt;span id="cb12-35"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;/tmp/ipykernel_382990/823456077.py:26: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
  plt.gca().set_yticklabels(['{:,.1f}'.format(x) for x in current_values/1000000000]);&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-12-output-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-12-output-2.png" width="800" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por último, vamos remover o label do eixo X.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb14-1"&gt;&lt;span&gt;# É aconselhavel mudar o tamanho da imagem antes de plotar&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb14-2"&gt;&lt;span&gt;# Para tanto, o MatPlotLib nos permite modificar entradas &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb14-3"&gt;&lt;span&gt;# em um dicionário de parâmetros chamado rcParams.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb14-4"&gt;&lt;span&gt;# A nossa modificação será da entrada figure.figsize&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb14-5"&gt;&lt;span&gt;# Este parâmetro recebe uma tupla com largura e altura em polegadas&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb14-6"&gt;&lt;span&gt;# O valor padrão é 6.4 de largura e 4.8 de altura em polegadas&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb14-7"&gt;plt.rcParams[&lt;span&gt;"figure.figsize"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; (&lt;span&gt;9&lt;/span&gt;,&lt;span&gt;5&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb14-8"&gt;&lt;/span&gt;
&lt;span id="cb14-9"&gt;&lt;span&gt;#Ajustando qualidade da imagem&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb14-10"&gt;plt.rcParams[&lt;span&gt;"figure.dpi"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;300&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb14-11"&gt;plt.rcParams[&lt;span&gt;"savefig.dpi"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;300&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb14-12"&gt;plt.rcParams[&lt;span&gt;"savefig.format"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;"svg"&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb14-13"&gt;&lt;/span&gt;
&lt;span id="cb14-14"&gt;&lt;span&gt;# Para remover parte do box da imagem, fazemos isso:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb14-15"&gt;plt.rcParams[&lt;span&gt;"axes.spines.right"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb14-16"&gt;plt.rcParams[&lt;span&gt;"axes.spines.top"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb14-17"&gt;plt.rcParams[&lt;span&gt;"axes.spines.bottom"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb14-18"&gt;&lt;/span&gt;
&lt;span id="cb14-19"&gt;plt.ticklabel_format(style&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"plain"&lt;/span&gt;, useLocale&lt;span&gt;=&lt;/span&gt;&lt;span&gt;True&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb14-20"&gt;&lt;/span&gt;
&lt;span id="cb14-21"&gt;sns.barplot(brics_us, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Country'&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Population'&lt;/span&gt;, hue&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Year'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb14-22"&gt;&lt;/span&gt;
&lt;span id="cb14-23"&gt;&lt;span&gt;# Aqui buscamos os valores que foram adicionados no eixo e os modificamos &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb14-24"&gt;&lt;span&gt;# com a formatação adequada&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb14-25"&gt;current_values &lt;span&gt;=&lt;/span&gt; plt.gca().get_yticks()&lt;/span&gt;
&lt;span id="cb14-26"&gt;plt.gca().set_yticklabels([&lt;span&gt;'&lt;/span&gt;&lt;span&gt;{:,.1f}&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;.&lt;span&gt;format&lt;/span&gt;(x) &lt;span&gt;for&lt;/span&gt; x &lt;span&gt;in&lt;/span&gt; current_values&lt;span&gt;/&lt;/span&gt;&lt;span&gt;1000000000&lt;/span&gt;])&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb14-27"&gt;&lt;/span&gt;
&lt;span id="cb14-28"&gt;&lt;span&gt;# Esta função adiciona um título no gráfico&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb14-29"&gt;plt.title(&lt;span&gt;'Crescimento Populacional no BRICS (1970 - 2020)'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb14-30"&gt;&lt;/span&gt;
&lt;span id="cb14-31"&gt;&lt;span&gt;# Estas funções nos permitem alterar o títulos nos eixos&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb14-32"&gt;plt.xlabel(&lt;span&gt;''&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb14-33"&gt;plt.ylabel(&lt;span&gt;'População (bilhões)'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb14-34"&gt;&lt;/span&gt;
&lt;span id="cb14-35"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;/tmp/ipykernel_382990/1234354454.py:26: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
  plt.gca().set_yticklabels(['{:,.1f}'.format(x) for x in current_values/1000000000]);&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-13-output-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-13-output-2.png" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Passo 5 - Colocando foco nos dados&lt;/h3&gt;

&lt;p&gt;Agora que trabalhamos na formatação inicial, precisamos realizar melhorias que irão nos ajudar a colocar o foco nos dados. Eis o que vamos fazer: - diminuir a legenda - Alinhar o título a esquerda - o título centralizado faz com que os olhos façam um escaneamento extra do gráfico, dificultando a compreensão - vamos colocar os valores em cima de cada barra. Também para evitar que precisemos olhar no eixo a esquerda para ver o valor de cada barra, ou seja, que fiquemos constantemente escaneando o gráfico - ajustar o tamanho das fontes - ajustar as cores.&lt;/p&gt;

&lt;h4&gt;Diminuindo a legenda&lt;/h4&gt;

&lt;p&gt;A princípio, podemos resolver isso manipulando os dados.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb16-1"&gt;brics_us[&lt;span&gt;'Year'&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; brics_us[&lt;span&gt;'Year'&lt;/span&gt;].&lt;span&gt;apply&lt;/span&gt;(&lt;span&gt;lambda&lt;/span&gt; x: x.replace(&lt;span&gt;' Population'&lt;/span&gt;,&lt;span&gt;''&lt;/span&gt;))&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vamos ver o resultado?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb17-1"&gt;&lt;span&gt;# É aconselhavel mudar o tamanho da imagem antes de plotar&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb17-2"&gt;&lt;span&gt;# Para tanto, o MatPlotLib nos permite modificar entradas &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb17-3"&gt;&lt;span&gt;# em um dicionário de parâmetros chamado rcParams.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb17-4"&gt;&lt;span&gt;# A nossa modificação será da entrada figure.figsize&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb17-5"&gt;&lt;span&gt;# Este parâmetro recebe uma tupla com largura e altura em polegadas&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb17-6"&gt;&lt;span&gt;# O valor padrão é 6.4 de largura e 4.8 de altura em polegadas&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb17-7"&gt;plt.rcParams[&lt;span&gt;"figure.figsize"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; (&lt;span&gt;9&lt;/span&gt;,&lt;span&gt;5&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb17-8"&gt;&lt;/span&gt;
&lt;span id="cb17-9"&gt;&lt;span&gt;#Ajustando qualidade da imagem&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb17-10"&gt;plt.rcParams[&lt;span&gt;"figure.dpi"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;300&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb17-11"&gt;plt.rcParams[&lt;span&gt;"savefig.dpi"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;300&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb17-12"&gt;plt.rcParams[&lt;span&gt;"savefig.format"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;"svg"&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb17-13"&gt;&lt;/span&gt;
&lt;span id="cb17-14"&gt;&lt;span&gt;# Para remover parte do box da imagem, fazemos isso:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb17-15"&gt;plt.rcParams[&lt;span&gt;"axes.spines.right"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb17-16"&gt;plt.rcParams[&lt;span&gt;"axes.spines.top"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb17-17"&gt;plt.rcParams[&lt;span&gt;"axes.spines.bottom"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb17-18"&gt;&lt;/span&gt;
&lt;span id="cb17-19"&gt;plt.ticklabel_format(style&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"plain"&lt;/span&gt;, useLocale&lt;span&gt;=&lt;/span&gt;&lt;span&gt;True&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb17-20"&gt;&lt;/span&gt;
&lt;span id="cb17-21"&gt;sns.barplot(brics_us, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Country'&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Population'&lt;/span&gt;, hue&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Year'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb17-22"&gt;&lt;/span&gt;
&lt;span id="cb17-23"&gt;&lt;span&gt;# Aqui buscamos os valores que foram adicionados no eixo e os modificamos &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb17-24"&gt;&lt;span&gt;# com a formatação adequada&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb17-25"&gt;current_values &lt;span&gt;=&lt;/span&gt; plt.gca().get_yticks()&lt;/span&gt;
&lt;span id="cb17-26"&gt;plt.gca().set_yticklabels([&lt;span&gt;'&lt;/span&gt;&lt;span&gt;{:,.1f}&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;.&lt;span&gt;format&lt;/span&gt;(x) &lt;span&gt;for&lt;/span&gt; x &lt;span&gt;in&lt;/span&gt; current_values&lt;span&gt;/&lt;/span&gt;&lt;span&gt;1000000000&lt;/span&gt;])&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb17-27"&gt;&lt;/span&gt;
&lt;span id="cb17-28"&gt;&lt;span&gt;# Esta função adiciona um título no gráfico&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb17-29"&gt;plt.title(&lt;span&gt;'Crescimento Populacional no BRICS (1970 - 2020)'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb17-30"&gt;&lt;/span&gt;
&lt;span id="cb17-31"&gt;&lt;span&gt;# Estas funções nos permitem alterar o títulos nos eixos&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb17-32"&gt;plt.xlabel(&lt;span&gt;''&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb17-33"&gt;plt.ylabel(&lt;span&gt;'População (bilhões)'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb17-34"&gt;&lt;/span&gt;
&lt;span id="cb17-35"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;/tmp/ipykernel_382990/1234354454.py:26: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
  plt.gca().set_yticklabels(['{:,.1f}'.format(x) for x in current_values/1000000000]);&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-15-output-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-15-output-2.png" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;Alinhar o Titulo e Diminuir fontes&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb19-1"&gt;&lt;span&gt;# É aconselhavel mudar o tamanho da imagem antes de plotar&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb19-2"&gt;&lt;span&gt;# Para tanto, o MatPlotLib nos permite modificar entradas &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb19-3"&gt;&lt;span&gt;# em um dicionário de parâmetros chamado rcParams.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb19-4"&gt;&lt;span&gt;# A nossa modificação será da entrada figure.figsize&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb19-5"&gt;&lt;span&gt;# Este parâmetro recebe uma tupla com largura e altura em polegadas&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb19-6"&gt;&lt;span&gt;# O valor padrão é 6.4 de largura e 4.8 de altura em polegadas&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb19-7"&gt;plt.rcParams[&lt;span&gt;"figure.figsize"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; (&lt;span&gt;9&lt;/span&gt;,&lt;span&gt;5&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb19-8"&gt;&lt;/span&gt;
&lt;span id="cb19-9"&gt;&lt;span&gt;#Ajustando qualidade da imagem&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb19-10"&gt;plt.rcParams[&lt;span&gt;"figure.dpi"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;300&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb19-11"&gt;plt.rcParams[&lt;span&gt;"savefig.dpi"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;300&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb19-12"&gt;plt.rcParams[&lt;span&gt;"savefig.format"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;"svg"&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb19-13"&gt;&lt;/span&gt;
&lt;span id="cb19-14"&gt;&lt;span&gt;# Para remover parte do box da imagem, fazemos isso:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb19-15"&gt;plt.rcParams[&lt;span&gt;"axes.spines.right"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb19-16"&gt;plt.rcParams[&lt;span&gt;"axes.spines.top"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb19-17"&gt;plt.rcParams[&lt;span&gt;"axes.spines.bottom"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb19-18"&gt;&lt;/span&gt;
&lt;span id="cb19-19"&gt;&lt;span&gt;#Fontes&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb19-20"&gt;plt.rcParams[&lt;span&gt;"legend.fontsize"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb19-21"&gt;plt.rcParams[&lt;span&gt;"legend.title_fontsize"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;6&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb19-22"&gt;plt.rcParams[&lt;span&gt;"legend.frameon"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb19-23"&gt;&lt;/span&gt;
&lt;span id="cb19-24"&gt;plt.ticklabel_format(style&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"plain"&lt;/span&gt;, useLocale&lt;span&gt;=&lt;/span&gt;&lt;span&gt;True&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb19-25"&gt;plt.tick_params(axis&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'both'&lt;/span&gt;, which&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'major'&lt;/span&gt;, labelsize&lt;span&gt;=&lt;/span&gt;&lt;span&gt;6&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb19-26"&gt;&lt;/span&gt;
&lt;span id="cb19-27"&gt;sns.barplot(brics_us, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Country'&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Population'&lt;/span&gt;, hue&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Year'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb19-28"&gt;&lt;/span&gt;
&lt;span id="cb19-29"&gt;&lt;span&gt;# Aqui buscamos os valores que foram adicionados no eixo e os modificamos &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb19-30"&gt;&lt;span&gt;# com a formatação adequada&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb19-31"&gt;current_values &lt;span&gt;=&lt;/span&gt; plt.gca().get_yticks()&lt;/span&gt;
&lt;span id="cb19-32"&gt;plt.gca().set_yticklabels([&lt;span&gt;'&lt;/span&gt;&lt;span&gt;{:,.1f}&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;.&lt;span&gt;format&lt;/span&gt;(x) &lt;span&gt;for&lt;/span&gt; x &lt;span&gt;in&lt;/span&gt; current_values&lt;span&gt;/&lt;/span&gt;&lt;span&gt;1000000000&lt;/span&gt;])&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb19-33"&gt;&lt;/span&gt;
&lt;span id="cb19-34"&gt;&lt;span&gt;# Esta função adiciona um título no gráfico&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb19-35"&gt;plt.title(&lt;span&gt;'Crescimento Populacional no BRICS (1970 - 2020)'&lt;/span&gt;, fontsize&lt;span&gt;=&lt;/span&gt;&lt;span&gt;8&lt;/span&gt;, loc&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'left'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb19-36"&gt;&lt;/span&gt;
&lt;span id="cb19-37"&gt;&lt;span&gt;# Estas funções nos permitem alterar o títulos nos eixos&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb19-38"&gt;plt.xlabel(&lt;span&gt;''&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb19-39"&gt;plt.ylabel(&lt;span&gt;'População (bilhões)'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb19-40"&gt;&lt;/span&gt;
&lt;span id="cb19-41"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;/tmp/ipykernel_382990/1419233821.py:32: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
  plt.gca().set_yticklabels(['{:,.1f}'.format(x) for x in current_values/1000000000]);&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-16-output-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-16-output-2.png" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;Removendo o eixo Y e adicionando os valores nas barras&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb21-1"&gt;&lt;span&gt;# É aconselhavel mudar o tamanho da imagem antes de plotar&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-2"&gt;&lt;span&gt;# Para tanto, o MatPlotLib nos permite modificar entradas &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-3"&gt;&lt;span&gt;# em um dicionário de parâmetros chamado rcParams.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-4"&gt;&lt;span&gt;# A nossa modificação será da entrada figure.figsize&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-5"&gt;&lt;span&gt;# Este parâmetro recebe uma tupla com largura e altura em polegadas&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-6"&gt;&lt;span&gt;# O valor padrão é 6.4 de largura e 4.8 de altura em polegadas&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-7"&gt;plt.rcParams[&lt;span&gt;"figure.figsize"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; (&lt;span&gt;9&lt;/span&gt;,&lt;span&gt;5&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb21-8"&gt;&lt;/span&gt;
&lt;span id="cb21-9"&gt;&lt;span&gt;#Ajustando qualidade da imagem&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-10"&gt;plt.rcParams[&lt;span&gt;"figure.dpi"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;300&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-11"&gt;plt.rcParams[&lt;span&gt;"savefig.dpi"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;300&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-12"&gt;plt.rcParams[&lt;span&gt;"savefig.format"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;"svg"&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-13"&gt;&lt;/span&gt;
&lt;span id="cb21-14"&gt;&lt;span&gt;# Para remover parte do box da imagem, fazemos isso:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-15"&gt;plt.rcParams[&lt;span&gt;"axes.spines.left"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-16"&gt;plt.rcParams[&lt;span&gt;"axes.spines.right"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-17"&gt;plt.rcParams[&lt;span&gt;"axes.spines.top"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-18"&gt;plt.rcParams[&lt;span&gt;"axes.spines.bottom"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-19"&gt;&lt;/span&gt;
&lt;span id="cb21-20"&gt;&lt;span&gt;#Fontes&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-21"&gt;plt.rcParams[&lt;span&gt;"legend.fontsize"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-22"&gt;plt.rcParams[&lt;span&gt;"legend.title_fontsize"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;6&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-23"&gt;plt.rcParams[&lt;span&gt;"legend.frameon"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-24"&gt;&lt;/span&gt;
&lt;span id="cb21-25"&gt;plt.ticklabel_format(style&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"plain"&lt;/span&gt;, useLocale&lt;span&gt;=&lt;/span&gt;&lt;span&gt;True&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb21-26"&gt;plt.tick_params(axis&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'both'&lt;/span&gt;, which&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'major'&lt;/span&gt;, labelsize&lt;span&gt;=&lt;/span&gt;&lt;span&gt;6&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb21-27"&gt;&lt;/span&gt;
&lt;span id="cb21-28"&gt;sx &lt;span&gt;=&lt;/span&gt; sns.barplot(brics_us, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Country'&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Population'&lt;/span&gt;, hue&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Year'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb21-29"&gt;&lt;/span&gt;
&lt;span id="cb21-30"&gt;&lt;span&gt;# Aqui buscamos os valores que foram adicionados no eixo e os modificamos &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-31"&gt;&lt;span&gt;# com a formatação adequada&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-32"&gt;current_values &lt;span&gt;=&lt;/span&gt; plt.gca().get_yticks()&lt;/span&gt;
&lt;span id="cb21-33"&gt;plt.gca().set_yticklabels([&lt;span&gt;'&lt;/span&gt;&lt;span&gt;{:,.1f}&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;.&lt;span&gt;format&lt;/span&gt;(x) &lt;span&gt;for&lt;/span&gt; x &lt;span&gt;in&lt;/span&gt; current_values&lt;span&gt;/&lt;/span&gt;&lt;span&gt;1000000000&lt;/span&gt;])&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-34"&gt;&lt;/span&gt;
&lt;span id="cb21-35"&gt;&lt;span&gt;# Esta função adiciona um título no gráfico&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-36"&gt;plt.title(&lt;span&gt;'Crescimento Populacional no BRICS (1970 - 2020)'&lt;/span&gt;, fontsize&lt;span&gt;=&lt;/span&gt;&lt;span&gt;8&lt;/span&gt;, loc&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'left'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb21-37"&gt;&lt;/span&gt;
&lt;span id="cb21-38"&gt;&lt;span&gt;# Estas funções nos permitem alterar o títulos nos eixos&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-39"&gt;plt.xlabel(&lt;span&gt;''&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb21-40"&gt;&lt;/span&gt;
&lt;span id="cb21-41"&gt;&lt;span&gt;# Removendo todo o eixo Y&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-42"&gt;sx.get_yaxis().set_visible(&lt;span&gt;False&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb21-43"&gt;&lt;/span&gt;
&lt;span id="cb21-44"&gt;&lt;span&gt;# O Objeto patches contém todos os elementos (neste caso barras) que foram plotados no gráfico&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-45"&gt;&lt;span&gt;# Então percorremos eles e fazemos os seguintes calculos:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-46"&gt;&lt;span&gt;# a coordenada x para posicionar o texto = Coordenada X do canto superior da barra + largura da barra / 2&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-47"&gt;&lt;span&gt;# a coordenada Y para posicionar o texto = Coordenada Y do canto superior da barra + 1% desta altura&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb21-48"&gt;&lt;span&gt;for&lt;/span&gt; p &lt;span&gt;in&lt;/span&gt; sx.patches:&lt;/span&gt;
&lt;span id="cb21-49"&gt; _x &lt;span&gt;=&lt;/span&gt; (p.get_x() &lt;span&gt;+&lt;/span&gt; p.get_width() &lt;span&gt;/&lt;/span&gt; &lt;span&gt;2&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb21-50"&gt; _y &lt;span&gt;=&lt;/span&gt; p.get_y() &lt;span&gt;+&lt;/span&gt; p.get_height() &lt;span&gt;+&lt;/span&gt; (p.get_height()&lt;span&gt;*&lt;/span&gt;&lt;span&gt;0.01&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb21-51"&gt; value &lt;span&gt;=&lt;/span&gt; &lt;span&gt;'&lt;/span&gt;&lt;span&gt;{:.2f}&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;.&lt;span&gt;format&lt;/span&gt;(p.get_height()&lt;span&gt;/&lt;/span&gt;&lt;span&gt;1000000000&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb21-52"&gt; sx.text(_x, _y, value, ha&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"center"&lt;/span&gt;, size&lt;span&gt;=&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;) &lt;/span&gt;
&lt;span id="cb21-53"&gt;&lt;/span&gt;
&lt;span id="cb21-54"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;/tmp/ipykernel_382990/1997790246.py:33: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
  plt.gca().set_yticklabels(['{:,.1f}'.format(x) for x in current_values/1000000000]);&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-17-output-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-17-output-2.png" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;Acertando as cores&lt;/h4&gt;

&lt;p&gt;A paleta de cores precisa ser ajustada para respeitar as cores da empresa.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb23-1"&gt;&lt;span&gt;# É aconselhavel mudar o tamanho da imagem antes de plotar&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-2"&gt;&lt;span&gt;# Para tanto, o MatPlotLib nos permite modificar entradas &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-3"&gt;&lt;span&gt;# em um dicionário de parâmetros chamado rcParams.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-4"&gt;&lt;span&gt;# A nossa modificação será da entrada figure.figsize&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-5"&gt;&lt;span&gt;# Este parâmetro recebe uma tupla com largura e altura em polegadas&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-6"&gt;&lt;span&gt;# O valor padrão é 6.4 de largura e 4.8 de altura em polegadas&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-7"&gt;plt.rcParams[&lt;span&gt;"figure.figsize"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; (&lt;span&gt;9&lt;/span&gt;,&lt;span&gt;5&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb23-8"&gt;&lt;/span&gt;
&lt;span id="cb23-9"&gt;&lt;span&gt;#Definindo a paleta de cores&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-10"&gt;cores &lt;span&gt;=&lt;/span&gt; [&lt;span&gt;"#0c4f6a"&lt;/span&gt;, &lt;span&gt;"#177498"&lt;/span&gt;, &lt;span&gt;"#0a8faa"&lt;/span&gt;, &lt;span&gt;"#bfdce5"&lt;/span&gt;, &lt;span&gt;"#82bd4a"&lt;/span&gt;, &lt;span&gt;"#b8d67a"&lt;/span&gt;, &lt;span&gt;"#b2b3b6"&lt;/span&gt;, &lt;span&gt;"#58585a"&lt;/span&gt;, &lt;span&gt;"#edb634"&lt;/span&gt;, &lt;span&gt;"#d97933"&lt;/span&gt;, &lt;span&gt;"#f1bdb1"&lt;/span&gt;, &lt;span&gt;"#eca091"&lt;/span&gt;, &lt;span&gt;"#e26c54"&lt;/span&gt;, &lt;span&gt;"#b0391e"&lt;/span&gt;]&lt;/span&gt;
&lt;span id="cb23-11"&gt;sns.set_palette(sns.color_palette(cores))&lt;/span&gt;
&lt;span id="cb23-12"&gt;&lt;/span&gt;
&lt;span id="cb23-13"&gt;&lt;span&gt;#Ajustando qualidade da imagem&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-14"&gt;plt.rcParams[&lt;span&gt;"figure.dpi"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;300&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-15"&gt;plt.rcParams[&lt;span&gt;"savefig.dpi"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;300&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-16"&gt;plt.rcParams[&lt;span&gt;"savefig.format"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;"svg"&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-17"&gt;&lt;/span&gt;
&lt;span id="cb23-18"&gt;&lt;span&gt;# Para remover parte do box da imagem, fazemos isso:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-19"&gt;plt.rcParams[&lt;span&gt;"axes.spines.left"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-20"&gt;plt.rcParams[&lt;span&gt;"axes.spines.right"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-21"&gt;plt.rcParams[&lt;span&gt;"axes.spines.top"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-22"&gt;plt.rcParams[&lt;span&gt;"axes.spines.bottom"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-23"&gt;&lt;/span&gt;
&lt;span id="cb23-24"&gt;&lt;span&gt;#Fontes&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-25"&gt;plt.rcParams[&lt;span&gt;"legend.fontsize"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-26"&gt;plt.rcParams[&lt;span&gt;"legend.title_fontsize"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;6&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-27"&gt;plt.rcParams[&lt;span&gt;"legend.frameon"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-28"&gt;&lt;/span&gt;
&lt;span id="cb23-29"&gt;plt.ticklabel_format(style&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"plain"&lt;/span&gt;, useLocale&lt;span&gt;=&lt;/span&gt;&lt;span&gt;True&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb23-30"&gt;plt.tick_params(axis&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'both'&lt;/span&gt;, which&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'major'&lt;/span&gt;, labelsize&lt;span&gt;=&lt;/span&gt;&lt;span&gt;6&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb23-31"&gt;&lt;/span&gt;
&lt;span id="cb23-32"&gt;sx &lt;span&gt;=&lt;/span&gt; sns.barplot(brics_us, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Country'&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Population'&lt;/span&gt;, hue&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Year'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb23-33"&gt;&lt;/span&gt;
&lt;span id="cb23-34"&gt;&lt;span&gt;# Aqui buscamos os valores que foram adicionados no eixo e os modificamos &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-35"&gt;&lt;span&gt;# com a formatação adequada&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-36"&gt;current_values &lt;span&gt;=&lt;/span&gt; plt.gca().get_yticks().tolist()&lt;/span&gt;
&lt;span id="cb23-37"&gt;formatted_values &lt;span&gt;=&lt;/span&gt; [&lt;span&gt;'&lt;/span&gt;&lt;span&gt;{:,.1f}&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;.&lt;span&gt;format&lt;/span&gt;(x&lt;span&gt;/&lt;/span&gt;&lt;span&gt;1000000000&lt;/span&gt;) &lt;span&gt;for&lt;/span&gt; x &lt;span&gt;in&lt;/span&gt; current_values]&lt;/span&gt;
&lt;span id="cb23-38"&gt;plt.gca().set_yticklabels(formatted_values)&lt;/span&gt;
&lt;span id="cb23-39"&gt;&lt;/span&gt;
&lt;span id="cb23-40"&gt;&lt;span&gt;# Esta função adiciona um título no gráfico&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-41"&gt;plt.title(&lt;span&gt;'Crescimento Populacional no BRICS (1970 - 2020)'&lt;/span&gt;, fontsize&lt;span&gt;=&lt;/span&gt;&lt;span&gt;8&lt;/span&gt;, loc&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'left'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb23-42"&gt;&lt;/span&gt;
&lt;span id="cb23-43"&gt;&lt;span&gt;# Estas funções nos permitem alterar o títulos nos eixos&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-44"&gt;plt.xlabel(&lt;span&gt;''&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb23-45"&gt;&lt;/span&gt;
&lt;span id="cb23-46"&gt;&lt;span&gt;# Removendo todo o eixo Y&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-47"&gt;sx.get_yaxis().set_visible(&lt;span&gt;False&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb23-48"&gt;&lt;/span&gt;
&lt;span id="cb23-49"&gt;&lt;span&gt;# O Objeto patches contém todos os elementos (neste caso barras) que foram plotados no gráfico&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-50"&gt;&lt;span&gt;# Então percorremos eles e fazemos os seguintes calculos:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-51"&gt;&lt;span&gt;# a coordenada x para posicionar o texto = Coordenada X do canto superior da barra + largura da barra / 2&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-52"&gt;&lt;span&gt;# a coordenada Y para posicionar o texto = Coordenada Y do canto superior da barra + 1% desta altura&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb23-53"&gt;&lt;span&gt;for&lt;/span&gt; p &lt;span&gt;in&lt;/span&gt; sx.patches:&lt;/span&gt;
&lt;span id="cb23-54"&gt; _x &lt;span&gt;=&lt;/span&gt; (p.get_x() &lt;span&gt;+&lt;/span&gt; p.get_width() &lt;span&gt;/&lt;/span&gt; &lt;span&gt;2&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb23-55"&gt; _y &lt;span&gt;=&lt;/span&gt; p.get_y() &lt;span&gt;+&lt;/span&gt; p.get_height() &lt;span&gt;+&lt;/span&gt; (p.get_height()&lt;span&gt;*&lt;/span&gt;&lt;span&gt;0.01&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb23-56"&gt; value &lt;span&gt;=&lt;/span&gt; &lt;span&gt;'&lt;/span&gt;&lt;span&gt;{:.2f}&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;.&lt;span&gt;format&lt;/span&gt;(p.get_height()&lt;span&gt;/&lt;/span&gt;&lt;span&gt;1000000000&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb23-57"&gt; sx.text(_x, _y, value, ha&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"center"&lt;/span&gt;, size&lt;span&gt;=&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;) &lt;/span&gt;
&lt;span id="cb23-58"&gt;&lt;/span&gt;
&lt;span id="cb23-59"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;/tmp/ipykernel_382990/620366550.py:38: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
  plt.gca().set_yticklabels(formatted_values)&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-18-output-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-18-output-2.png" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E aí está o nosso gráfico, com suas cores modificadas. Para este gráfico ficar realmente bom, faltam apenas duas correções: deixar nossas barras um pouco mais largas para que possamos aumentar a fonte dos valores.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb25-1"&gt;&lt;span&gt;# É aconselhavel mudar o tamanho da imagem antes de plotar&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-2"&gt;&lt;span&gt;# Para tanto, o MatPlotLib nos permite modificar entradas &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-3"&gt;&lt;span&gt;# em um dicionário de parâmetros chamado rcParams.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-4"&gt;&lt;span&gt;# A nossa modificação será da entrada figure.figsize&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-5"&gt;&lt;span&gt;# Este parâmetro recebe uma tupla com largura e altura em polegadas&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-6"&gt;&lt;span&gt;# O valor padrão é 6.4 de largura e 4.8 de altura em polegadas&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-7"&gt;plt.rcParams[&lt;span&gt;"figure.figsize"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; (&lt;span&gt;9&lt;/span&gt;,&lt;span&gt;5&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb25-8"&gt;&lt;/span&gt;
&lt;span id="cb25-9"&gt;&lt;span&gt;#Definindo a paleta de cores&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-10"&gt;cores &lt;span&gt;=&lt;/span&gt; [&lt;span&gt;"#0c4f6a"&lt;/span&gt;, &lt;span&gt;"#177498"&lt;/span&gt;, &lt;span&gt;"#0a8faa"&lt;/span&gt;, &lt;span&gt;"#bfdce5"&lt;/span&gt;, &lt;span&gt;"#82bd4a"&lt;/span&gt;, &lt;span&gt;"#b8d67a"&lt;/span&gt;, &lt;span&gt;"#b2b3b6"&lt;/span&gt;, &lt;span&gt;"#58585a"&lt;/span&gt;, &lt;span&gt;"#edb634"&lt;/span&gt;, &lt;span&gt;"#d97933"&lt;/span&gt;, &lt;span&gt;"#f1bdb1"&lt;/span&gt;, &lt;span&gt;"#eca091"&lt;/span&gt;, &lt;span&gt;"#e26c54"&lt;/span&gt;, &lt;span&gt;"#b0391e"&lt;/span&gt;]&lt;/span&gt;
&lt;span id="cb25-11"&gt;sns.set_palette(sns.color_palette(cores))&lt;/span&gt;
&lt;span id="cb25-12"&gt;&lt;/span&gt;
&lt;span id="cb25-13"&gt;&lt;span&gt;#Ajustando qualidade da imagem&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-14"&gt;plt.rcParams[&lt;span&gt;"figure.dpi"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;300&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-15"&gt;plt.rcParams[&lt;span&gt;"savefig.dpi"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;300&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-16"&gt;plt.rcParams[&lt;span&gt;"savefig.format"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;"svg"&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-17"&gt;&lt;/span&gt;
&lt;span id="cb25-18"&gt;&lt;span&gt;# Para remover parte do box da imagem, fazemos isso:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-19"&gt;plt.rcParams[&lt;span&gt;"axes.spines.left"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-20"&gt;plt.rcParams[&lt;span&gt;"axes.spines.right"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-21"&gt;plt.rcParams[&lt;span&gt;"axes.spines.top"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-22"&gt;plt.rcParams[&lt;span&gt;"axes.spines.bottom"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-23"&gt;&lt;/span&gt;
&lt;span id="cb25-24"&gt;&lt;span&gt;#Fontes&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-25"&gt;plt.rcParams[&lt;span&gt;"legend.fontsize"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-26"&gt;plt.rcParams[&lt;span&gt;"legend.title_fontsize"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;6&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-27"&gt;plt.rcParams[&lt;span&gt;"legend.frameon"&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-28"&gt;&lt;/span&gt;
&lt;span id="cb25-29"&gt;plt.ticklabel_format(style&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"plain"&lt;/span&gt;, useLocale&lt;span&gt;=&lt;/span&gt;&lt;span&gt;True&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb25-30"&gt;plt.tick_params(axis&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'both'&lt;/span&gt;, which&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'major'&lt;/span&gt;, labelsize&lt;span&gt;=&lt;/span&gt;&lt;span&gt;6&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb25-31"&gt;&lt;/span&gt;
&lt;span id="cb25-32"&gt;&lt;span&gt;# O padrão para tamanho das barras é 0.8. Quando colocamos 1, as barras se encostam. &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-33"&gt;&lt;span&gt;# Portanto, aumentamos para 0.95 para que não se encostem, mas fiquem mais largas.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-34"&gt;&lt;span&gt;# A nossa outra alteração foi na rotina que imprime os valores, onde pudemos ajustar&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-35"&gt;&lt;span&gt;# o tamanho da fonte de 3 para 4&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-36"&gt;sx &lt;span&gt;=&lt;/span&gt; sns.barplot(brics_us, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Country'&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Population'&lt;/span&gt;, hue&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Year'&lt;/span&gt;, width&lt;span&gt;=&lt;/span&gt;&lt;span&gt;0.95&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb25-37"&gt;&lt;/span&gt;
&lt;span id="cb25-38"&gt;&lt;span&gt;# Aqui buscamos os valores que foram adicionados no eixo e os modificamos &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-39"&gt;&lt;span&gt;# com a formatação adequada&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-40"&gt;current_values &lt;span&gt;=&lt;/span&gt; plt.gca().get_yticks().tolist()&lt;/span&gt;
&lt;span id="cb25-41"&gt;formatted_values &lt;span&gt;=&lt;/span&gt; [&lt;span&gt;'&lt;/span&gt;&lt;span&gt;{:,.1f}&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;.&lt;span&gt;format&lt;/span&gt;(x&lt;span&gt;/&lt;/span&gt;&lt;span&gt;1000000000&lt;/span&gt;) &lt;span&gt;for&lt;/span&gt; x &lt;span&gt;in&lt;/span&gt; current_values]&lt;/span&gt;
&lt;span id="cb25-42"&gt;plt.gca().set_yticklabels(formatted_values)&lt;/span&gt;
&lt;span id="cb25-43"&gt;&lt;/span&gt;
&lt;span id="cb25-44"&gt;&lt;span&gt;# Esta função adiciona um título no gráfico&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-45"&gt;plt.title(&lt;span&gt;'Crescimento Populacional no BRICS (1970 - 2020)'&lt;/span&gt;, fontsize&lt;span&gt;=&lt;/span&gt;&lt;span&gt;8&lt;/span&gt;, loc&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'left'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb25-46"&gt;&lt;/span&gt;
&lt;span id="cb25-47"&gt;&lt;span&gt;# Estas funções nos permitem alterar o títulos nos eixos&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-48"&gt;plt.xlabel(&lt;span&gt;''&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb25-49"&gt;&lt;/span&gt;
&lt;span id="cb25-50"&gt;&lt;span&gt;# Removendo todo o eixo Y&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-51"&gt;sx.get_yaxis().set_visible(&lt;span&gt;False&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb25-52"&gt;&lt;/span&gt;
&lt;span id="cb25-53"&gt;&lt;span&gt;# O Objeto patches contém todos os elementos (neste caso barras) que foram plotados no gráfico&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-54"&gt;&lt;span&gt;# Então percorremos eles e fazemos os seguintes calculos:&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-55"&gt;&lt;span&gt;# a coordenada x para posicionar o texto = Coordenada X do canto superior da barra + largura da barra / 2&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-56"&gt;&lt;span&gt;# a coordenada Y para posicionar o texto = Coordenada Y do canto superior da barra + 1% desta altura&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-57"&gt;&lt;span&gt;for&lt;/span&gt; p &lt;span&gt;in&lt;/span&gt; sx.patches:&lt;/span&gt;
&lt;span id="cb25-58"&gt; _x &lt;span&gt;=&lt;/span&gt; (p.get_x() &lt;span&gt;+&lt;/span&gt; p.get_width() &lt;span&gt;/&lt;/span&gt; &lt;span&gt;2&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb25-59"&gt; _y &lt;span&gt;=&lt;/span&gt; p.get_y() &lt;span&gt;+&lt;/span&gt; p.get_height() &lt;span&gt;+&lt;/span&gt; (p.get_height()&lt;span&gt;*&lt;/span&gt;&lt;span&gt;0.01&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb25-60"&gt; value &lt;span&gt;=&lt;/span&gt; &lt;span&gt;'&lt;/span&gt;&lt;span&gt;{:.2f}&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;.&lt;span&gt;format&lt;/span&gt;(p.get_height()&lt;span&gt;/&lt;/span&gt;&lt;span&gt;1000000000&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb25-61"&gt; sx.text(_x, _y, value, ha&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"center"&lt;/span&gt;, size&lt;span&gt;=&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;) &lt;/span&gt;
&lt;span id="cb25-62"&gt;&lt;/span&gt;
&lt;span id="cb25-63"&gt;&lt;span&gt;# Essa alteração foi no improviso, pois estava dizendo Year, ou seja,&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-64"&gt;&lt;span&gt;# uma parte do gráfico utilizava um idioma diferente.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb25-65"&gt;plt.legend(title&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Ano'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb25-66"&gt;&lt;/span&gt;
&lt;span id="cb25-67"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;/var/folders/fc/hns7cg2j2xg_05kdl6cbxkw40000gn/T/ipykernel_47418/1546591451.py:42: UserWarning: FixedFormatter should only be used together with FixedLocator
  plt.gca().set_yticklabels(formatted_values)&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-19-output-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-110%2Findex_files%2Ffigure-html%2Fcell-19-output-2.png" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Acho que agora, estamos prontos para enviar esse belo gráfico para quem vai usá-lo!&lt;/p&gt;


&lt;br&gt;


&lt;h2&gt;Conclusão&lt;/h2&gt;

&lt;p&gt;Nesta aula, aprendemos sobre como configurar nossos gráficos para que fiquem com uma aparência mais profissional e respeitem as boas práticas da área de Visualização de Dados. Vamos deixar também os links para as documentações das bibliotecas que utilizamos: - &lt;a href="https://seaborn.pydata.org/" rel="noopener noreferrer"&gt;Seaborn&lt;/a&gt; - &lt;a href="https://matplotlib.org/stable/index.html" rel="noopener noreferrer"&gt;Matplotlib&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este artigo também marca o final da nossa série Visualização de Dados com Python! Com o conhecimento aqui compartilhado, você já é capaz de criar visualizações de dados incríveis e profissionais. Esperamos que você tenha gostado e que tenha aprendido muito!&lt;/p&gt;

&lt;p&gt;Até a próxima!&lt;/p&gt;

&lt;p&gt;Walter&lt;/p&gt;



</description>
      <category>visualização</category>
      <category>seaborn</category>
      <category>matplotlib</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Parte 08 - MatplotLib - Tudo acaba em Pizza</title>
      <dc:creator>Walter R P Cortes</dc:creator>
      <pubDate>Sat, 11 Feb 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/wpcortes75/parte-08-matplotlib-tudo-acaba-em-pizza-54ca</link>
      <guid>https://dev.to/wpcortes75/parte-08-matplotlib-tudo-acaba-em-pizza-54ca</guid>
      <description>&lt;p&gt;Olá Devs!&lt;/p&gt;

&lt;p&gt;Dentro da área de Visualização de Dados existe uma grande polêmica em relação a um tipo de gráfico: o gráfico de pizza ou torta. E a polêmica não é quanto ao nome, mas a quando devemos utilizar este tipo de gráfico.&lt;/p&gt;

&lt;p&gt;Neste artigo, iremos aprender um pouco sobre essa polêmica e depois, vamos ver como podemos criar este gráfico usando as bibliotecas python seaborn, matplotlib e pandas!&lt;/p&gt;

&lt;h2&gt;Definindo Gráfico de Pizza… ou será Torta?&lt;/h2&gt;

&lt;p&gt;O gráfico de pizza (ou torta) é um gráfico que tem por objetivo representar as categorias ou dimensões como parte de um todo.&lt;/p&gt;

&lt;h3&gt;Exemplo&lt;/h3&gt;

&lt;p&gt;Considere o seguinte cenário: você realizou uma votação sobre qual sabor de pizza é o mais popular. Essa votação foi feita junto aos clientes da pizzaria onde você trabalha, durante o curso de 1 semana. Hoje haverá uma reunião com o dono da pizzaria, onde vocês discutirão quais são os sabores que entrarão na próxima grande promoção da loja. Para isso, você vai apresentar os resultados da votação. E (piada interna) você decidiu que nada melhor que usar um gráfico de pizza para esta tarefa!&lt;/p&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-109%2Fpizza.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-109%2Fpizza.jpg" width="368" height="354"&gt;&lt;/a&gt;&lt;/p&gt;
Um gráfico de pizza!



&lt;p&gt;Como vocês podem ver pela deliciosa imagem acima, o gráfico de pizza é composto por um círculo, que irá representar a totalidade dos votos que foram coletados. Então, cada sabor que foi votado irá representar uma fatia desta pizza. Se olharmos os valores representados no gráfico (que são porcentagens), conseguimos ter uma idéia do quanto cada fatia representa em relação ao todo.&lt;/p&gt;

&lt;p&gt;E, olhando essa imagem, você pode se perguntar: está tudo tão claro, onde está a polêmica? Para isso, vamos ver outra imagem:&lt;/p&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-109%2Fbadpizza001.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-109%2Fbadpizza001.jpg" width="588" height="514"&gt;&lt;/a&gt;&lt;/p&gt;
Exemplo de Gráfico Ruim



&lt;p&gt;Esse gráfico, que visa demonstrar os tweeters mais ativos, representa o principal problema dos gráficos de pizza: quanto mais categorias você tem, menos cada uma representa do todo, deixando mais díficil para o público entender essa representação. A próxima imagem ilustra o outro problema que geralmente encontramos em gráficos de pizza:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-109%2Fbadpizza002.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-109%2Fbadpizza002.jpg" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por algum motivo estranho, gráficos de pizza também tem uma perspectiva diferente. E essa mudança de perspectiva torna ainda pior a capacidade do público de perceber a diferença entre cada ‘fatia’.&lt;/p&gt;

&lt;h3&gt;Características de uma boa Pizza (Gráfico de Pizza)&lt;/h3&gt;

&lt;p&gt;Então, devemos usar gráficos de pizza ou não? A resposta mais simples é - depende. Baseado em inúmeros especialistas da área de visualização, você pode usar gráficos de pizza quando tem poucas categorias para serem representados. Outra recomendação é evitar mostrar o gráfico em perspectiva, além de utilizar rótulos informativos e bem simples para cada fatia.&lt;/p&gt;

&lt;p&gt;Então, antes de ver como montar esse tipo de gráfico, vamos ficar com uma imagem que reforça o aprendizado até aqui:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-109%2Fgoodpie-badpie.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-109%2Fgoodpie-badpie.png" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;Utilização básica&lt;/h2&gt;

&lt;p&gt;Para criar o gráfico de pizza teremos que abandonar um pouco o seaborn, e nos concentrarmos em utilizar apenas o matplotlib. Já estamos usando parte do matplotlib para colocarmos títulos no gráfico e nos eixos, acertarmos faixas de valores nos eixos e mais alguns detalhes. Agora, iremos utiliza-lo também para plotar o gráfico. Em primeiro lugar, vamos inicializar o ambiente e carregar os dados.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb1-1"&gt;&lt;span&gt;import&lt;/span&gt; pandas &lt;span&gt;as&lt;/span&gt; pd&lt;/span&gt;
&lt;span id="cb1-2"&gt;&lt;span&gt;import&lt;/span&gt; matplotlib.pyplot &lt;span&gt;as&lt;/span&gt; plt&lt;/span&gt;
&lt;span id="cb1-3"&gt;&lt;/span&gt;
&lt;span id="cb1-4"&gt;pokemons &lt;span&gt;=&lt;/span&gt; pd.read_csv(&lt;span&gt;'pokemons.csv'&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Depois, fazemos a agregação dos dados no nível da categoria que vamos plotar. Para criarmos um gráfico de pizza bom, vamos plotar o número de pokemons por geração. Isso nos dará poucas categorias (8), e faz sentido ver a distribuição do número de pokemons. Se quiséssemos plotar qualquer outro atributo, como ataque, defesa, etc…, provavelmente um gráfico de pizza não seria indicado, pois não faz sentido representar a soma dos poderes de ataque dos pokemons como um todo.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb2-1"&gt;pokemons[&lt;span&gt;'Generation Desc'&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; pokemons[&lt;span&gt;'Generation'&lt;/span&gt;].&lt;span&gt;apply&lt;/span&gt;(&lt;span&gt;lambda&lt;/span&gt; gen: &lt;span&gt;'Gen '&lt;/span&gt; &lt;span&gt;+&lt;/span&gt; &lt;span&gt;str&lt;/span&gt;(&lt;span&gt;int&lt;/span&gt;(gen)))&lt;/span&gt;
&lt;span id="cb2-2"&gt;&lt;/span&gt;
&lt;span id="cb2-3"&gt;pokemons_gen &lt;span&gt;=&lt;/span&gt; pokemons.groupby([&lt;span&gt;'Generation Desc'&lt;/span&gt;])[[&lt;span&gt;'Generation'&lt;/span&gt;,&lt;span&gt;'Number'&lt;/span&gt;]].count().reset_index()&lt;/span&gt;
&lt;span id="cb2-4"&gt;pokemons_gen.sort_values(&lt;span&gt;'Generation Desc'&lt;/span&gt;, inplace&lt;span&gt;=&lt;/span&gt;&lt;span&gt;True&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb2-5"&gt;&lt;/span&gt;
&lt;span id="cb2-6"&gt;plt.pie(pokemons_gen[&lt;span&gt;'Number'&lt;/span&gt;], labels&lt;span&gt;=&lt;/span&gt;pokemons_gen[&lt;span&gt;'Generation Desc'&lt;/span&gt;], autopct&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;%.2f%%&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;, counterclock&lt;span&gt;=&lt;/span&gt;&lt;span&gt;False&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb2-7"&gt;&lt;/span&gt;
&lt;span id="cb2-8"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-109%2Findex_files%2Ffigure-html%2Fcell-3-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-109%2Findex_files%2Ffigure-html%2Fcell-3-output-1.png" width="403" height="389"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;br&gt;


&lt;p&gt;E aí está o nosso gráfico de pizza! Importante observar que novamente, fizemos algumas transformações nos dados, incluindo ordenar os dados, porque caso contrário, as fatias ficarão fora de ordem. Vamos adicionar título e legenda, como em todos os nossos outros gráficos.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;&lt;span id="cb3-1"&gt;pokemons[&lt;span&gt;'Generation Desc'&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; pokemons[&lt;span&gt;'Generation'&lt;/span&gt;].&lt;span&gt;apply&lt;/span&gt;(&lt;span&gt;lambda&lt;/span&gt; gen: &lt;span&gt;'Gen '&lt;/span&gt; &lt;span&gt;+&lt;/span&gt; &lt;span&gt;str&lt;/span&gt;(&lt;span&gt;int&lt;/span&gt;(gen)))&lt;/span&gt;
&lt;span id="cb3-2"&gt;&lt;/span&gt;
&lt;span id="cb3-3"&gt;pokemons_gen &lt;span&gt;=&lt;/span&gt; pokemons.groupby([&lt;span&gt;'Generation Desc'&lt;/span&gt;])[[&lt;span&gt;'Generation'&lt;/span&gt;,&lt;span&gt;'Number'&lt;/span&gt;]].count().reset_index()&lt;/span&gt;
&lt;span id="cb3-4"&gt;pokemons_gen.sort_values(&lt;span&gt;'Generation Desc'&lt;/span&gt;, inplace&lt;span&gt;=&lt;/span&gt;&lt;span&gt;True&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb3-5"&gt;&lt;/span&gt;
&lt;span id="cb3-6"&gt;plt.pie(pokemons_gen[&lt;span&gt;'Number'&lt;/span&gt;], labels&lt;span&gt;=&lt;/span&gt;pokemons_gen[&lt;span&gt;'Generation Desc'&lt;/span&gt;], autopct&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;%.2f%%&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;, counterclock&lt;span&gt;=&lt;/span&gt;&lt;span&gt;False&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb3-7"&gt;&lt;/span&gt;
&lt;span id="cb3-8"&gt;plt.title(&lt;span&gt;'Pokemons por Geração'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb3-9"&gt;plt.legend(loc&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'upper right'&lt;/span&gt;, bbox_to_anchor&lt;span&gt;=&lt;/span&gt;(&lt;span&gt;1.40&lt;/span&gt;,&lt;span&gt;1.02&lt;/span&gt;))&lt;/span&gt;
&lt;span id="cb3-10"&gt;&lt;/span&gt;
&lt;span id="cb3-11"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-109%2Findex_files%2Ffigure-html%2Fcell-4-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-109%2Findex_files%2Ffigure-html%2Fcell-4-output-1.png" width="535" height="411"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;br&gt;


&lt;p&gt;Pronto, aí está o polêmico gráfico de pizza!&lt;/p&gt;

&lt;h3&gt;Conclusão&lt;/h3&gt;

&lt;p&gt;Neste artigo, aprendemos como criar gráficos que nos ajudam a entender como nossas variáveis categóricas se relacionam enquanto partes de um todo. E para isto utilizamos o tão famoso gráfico de Pizza. Também aprendemos em quais casos este tipo de gráfico faz sentido e quando sua utilização prejudica a compreensão dos dados. Se quiser saber mais sobre gráficos de pizza, &lt;a href="https://ibpad.com.br/ciencia-dados/sete-erros-classicos-em-graficos-de-pizza/" rel="noopener noreferrer"&gt;clique aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Um abraço e até a próxima,&lt;/p&gt;

&lt;p&gt;Walter.&lt;/p&gt;



</description>
      <category>visualização</category>
      <category>pandas</category>
      <category>matplotlib</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Parte 07 - Dispersão e Quadrantes</title>
      <dc:creator>Walter R P Cortes</dc:creator>
      <pubDate>Fri, 10 Feb 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/wpcortes75/parte-07-dispersao-e-quadrantes-29fe</link>
      <guid>https://dev.to/wpcortes75/parte-07-dispersao-e-quadrantes-29fe</guid>
      <description>&lt;p&gt;Olá Devs!&lt;/p&gt;

&lt;p&gt;Nos artigos anteriores aprendemos a criar gráficos que nos permitem realizar comparações entre categorias de uma dimensão, e também observar as variações de uma categoria ao longo de uma dimensão contínua (podendo ser uma dimensão numérica ou a mais popular, o tempo). Outra característica que esses gráficos possuem é que eles demonstram valores agregados no nível das categorias que estão sendo comparadas.&lt;/p&gt;

&lt;p&gt;Neste artigo, iremos explorar gráficos que nos permitirão: - analisar a distribuição dos valores ao longo de variáveis contínuas de forma individualizada - analisar a correlação entre variáveis - identificar o que chamamos de outliers, que são os pontos que fogem da distribuição observada (aquele ponto fora da curva).&lt;/p&gt;

&lt;p&gt;Para realizar esse tipo de análise, vamos trabalhar com os Gráficos de Dispersão e Pontos.&lt;/p&gt;

&lt;h2&gt;Preparação&lt;/h2&gt;

&lt;p&gt;Vamos carregar nossa bibliotecas e os dados.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb1-1"&gt;&lt;span&gt;import&lt;/span&gt; pandas &lt;span&gt;as&lt;/span&gt; pd&lt;/span&gt;
&lt;span id="cb1-2"&gt;&lt;span&gt;import&lt;/span&gt; seaborn &lt;span&gt;as&lt;/span&gt; sns&lt;/span&gt;
&lt;span id="cb1-3"&gt;&lt;span&gt;import&lt;/span&gt; matplotlib.pyplot &lt;span&gt;as&lt;/span&gt; plt&lt;/span&gt;
&lt;span id="cb1-4"&gt;&lt;/span&gt;
&lt;span id="cb1-5"&gt;pokemons &lt;span&gt;=&lt;/span&gt; pd.read_csv(&lt;span&gt;'pokemons.csv'&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Utilização Básica&lt;/h2&gt;

&lt;p&gt;Como mencionamos anteriormente, uma das características dos gráficos de dispersão e pontos é que normalmente queremos que cada linha do nosso conjunto de dados esteja representado, com seus valores individualizados, ao contrário dos gráficos de barras, onde as informações estão agregadas através de cálculos de média, soma, …&lt;/p&gt;

&lt;p&gt;Outra notada diferença é que neste tipo de gráfico, os eixos não utilizam categorias discretas. O que vemos é representação do domínio contínuo de variáveis, e os pontos correspondem a uma ocorrência.&lt;/p&gt;

&lt;p&gt;Trazendo para a realidade do nosso conjunto de dados: os gráficos de dispersão não terão em seus eixos valores como Tipo ou Geração - o que iremos colocar nos eixos serão Ataque e Defesa, e os pontos plotados no gráfico representarão cada um dos pokemons no nosso conjunto de dados.&lt;/p&gt;

&lt;p&gt;Para fazer isso, utilizaremos a função &lt;code&gt;scatterplot()&lt;/code&gt; do seaborn.&lt;/p&gt;

&lt;p&gt;Vamos ver na prática?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb2-1"&gt;sns.scatterplot(pokemons, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Att'&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Def'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb2-2"&gt;plt.title(&lt;span&gt;'Análise de Pontos de Ataque X Defesa'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb2-3"&gt;plt.xlabel(&lt;span&gt;'Pontos de Ataque'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb2-4"&gt;plt.ylabel(&lt;span&gt;'Pontos de Defesa'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb2-5"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-108%2Findex_files%2Ffigure-html%2Fcell-3-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-108%2Findex_files%2Ffigure-html%2Fcell-3-output-1.png" width="571" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É bem simples, não é mesmo? Escolhemos a variável do eixo X e a variável do eixo Y e é isso, vemos cada um dos nossos pokemons plotados no gráfico.&lt;/p&gt;

&lt;p&gt;Esse tipo de gráfico serve para mostrarmos a relação que existe entre as duas variáveis. No gráfico acima, podemos perceber que existe uma maior concentração de pokemons na faixa de 50-100 pontos de ataque e defesa. Também percebemos outras informações, tais como: - pelo menos 1 pokemon tem um alto valor de pontos de defesa, mas quase nada de pontos de ataque - pelo menos 1 pokemon tem um alto valor de pontos de ataque, mas quase nada de pontos de defesa.&lt;/p&gt;

&lt;p&gt;Isso são o que chamamos de outliers, pois fogem da distribuição que percebemos como padrão.&lt;/p&gt;

&lt;p&gt;Mas podemos melhorar um pouco nosso gráfico. Por exemplo, podemos colorir nossos pontos de acordo com a geração, assim podemos entender qual é a distribuição de cada geração.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb3-1"&gt;sns.scatterplot(pokemons, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Att'&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Def'&lt;/span&gt;, hue&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Generation'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb3-2"&gt;plt.title(&lt;span&gt;'Análise de Pontos de Ataque X Defesa'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb3-3"&gt;plt.xlabel(&lt;span&gt;'Pontos de Ataque'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb3-4"&gt;plt.ylabel(&lt;span&gt;'Pontos de Defesa'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb3-5"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-108%2Findex_files%2Ffigure-html%2Fcell-4-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-108%2Findex_files%2Ffigure-html%2Fcell-4-output-1.png" width="571" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Melhorou um pouco, agora temos noção das gerações, mas a distribuição náo é uniforme, pois como o valor é numérico ele criou faixas de valores. Se quisermos ver cada geração individualmente, teremos que trabalhar nossos dados.&lt;/p&gt;

&lt;h3&gt;Adicionando uma coluna em nossos dados&lt;/h3&gt;

&lt;p&gt;Adicionar uma nova coluna em um DataFrame pandas é bem simples:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb4-1"&gt;pokemons[&lt;span&gt;'Generation Desc'&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;""&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Isso criará uma nova coluna chamada ‘Generation Desc’ que terá cada linha populada com o valor “” (vazio). Isso é um bom início, mas precisamos atribuir um valor a esta coluna, preferencialmente baseado no valor do campo ‘Generation’ original. Para isso, iremos utilizar a função &lt;code&gt;apply()&lt;/code&gt; do DataFrame. Vamos ao comando.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb5-1"&gt;pokemons[&lt;span&gt;'Generation Desc'&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; pokemons[&lt;span&gt;'Generation'&lt;/span&gt;].&lt;span&gt;apply&lt;/span&gt;(&lt;span&gt;lambda&lt;/span&gt; gen: &lt;span&gt;'Gen '&lt;/span&gt; &lt;span&gt;+&lt;/span&gt; &lt;span&gt;str&lt;/span&gt;(&lt;span&gt;int&lt;/span&gt;(gen)))&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A função &lt;code&gt;apply()&lt;/code&gt; nos permite aplicar uma função (aqui utilizamos uma função lambda) que transforma o valor do campo Generation em um valor inteiro sem casas decimais para depois transforma-lo em texto, de forma que consigamos juntar com a string ‘Gen’. Assim, temos uma descrição textual da geração. Com isso, podemos agora, tentar novamente o plot do gráfico.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb6-1"&gt;sns.scatterplot(pokemons, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Att'&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Def'&lt;/span&gt;, hue&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Generation Desc'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb6-2"&gt;plt.title(&lt;span&gt;'Análise de Pontos de Ataque X Defesa'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb6-3"&gt;plt.xlabel(&lt;span&gt;'Pontos de Ataque'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb6-4"&gt;plt.ylabel(&lt;span&gt;'Pontos de Defesa'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb6-5"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-108%2Findex_files%2Ffigure-html%2Fcell-6-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-108%2Findex_files%2Ffigure-html%2Fcell-6-output-1.png" width="571" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As cores ficaram bem melhores, mas a posição da legenda ficou bem ruim. Vamos arrumar?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb7-1"&gt;sns.scatterplot(pokemons, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Att'&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Def'&lt;/span&gt;, hue&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Generation Desc'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb7-2"&gt;plt.title(&lt;span&gt;'Análise de Pontos de Ataque X Defesa'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb7-3"&gt;plt.xlabel(&lt;span&gt;'Pontos de Ataque'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb7-4"&gt;plt.ylabel(&lt;span&gt;'Pontos de Defesa'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb7-5"&gt;plt.legend(loc&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'upper right'&lt;/span&gt;, bbox_to_anchor&lt;span&gt;=&lt;/span&gt;(&lt;span&gt;1.21&lt;/span&gt;,&lt;span&gt;1.02&lt;/span&gt;))&lt;/span&gt;
&lt;span id="cb7-6"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-108%2Findex_files%2Ffigure-html%2Fcell-7-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-108%2Findex_files%2Ffigure-html%2Fcell-7-output-1.png" width="668" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora temos nosso gráfico de dispersão pronto. Na próxima seção, vamos discutir um caso específico de gráfico de dispersão, chamado de Gráfico de Quadrantes.&lt;/p&gt;

&lt;h3&gt;Gráfico de Quadrantes&lt;/h3&gt;

&lt;p&gt;O gráfico de quadrantes é um caso específico de um gráfico de dispersão, onde dividimos a área do gráfico em quadrantes - superior esquerdo, superior direito, inferior esquerdo e inferior direito - e a presença de um ponto nesses quadrantes tem um significado especial. O maior exemplo deste tipo de gráfico é o “Quadrante Mágico” do Grupo Gartner, que publica todos os anos neste formato quais as empresas ou produtos que se posicionam como líderes do mercado em cada setor. Veja o exemplo abaixo, que representa O Quadrante Mágico de 2022 para a área de Business Intelligence.&lt;/p&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-108%2Fgmq-2022-bi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-108%2Fgmq-2022-bi.png" width="570" height="592"&gt;&lt;/a&gt;&lt;/p&gt;
Quadrante Mágico 2022 - BI



&lt;p&gt;Neste formato do Gartner, os pontos que estiverem no quadrante superior direito são considerados os líderes do mercado, levando em conta as variáveis completude da visão e capacidade de execução, que são dois scores calculados e ficam em uma escala de 1 a 10 pontos.&lt;/p&gt;

&lt;p&gt;Então, levando em consideração que o nosso gráfico de dispersão utiliza os atributos de Ataque e Defesa, vamos imaginar como transformar esse gráfico em um ‘Quadrante Mágico’ que nos permitirá saber quais são os pokemons mais capazes e que possuem a melhor relação entre pontos de ataque e defesa.&lt;/p&gt;

&lt;p&gt;As mudanças que iremos aplicar no nosso gráfico original de dispersão são: - deixar os eixos com a mesma faixa de valores. Agora eles estão levemente desencontrados - plotar os eixos que dividem os quadrantes - plotar um texto descritivo para cada quadrante - se possível, poder nomear cada ponto no gráfico, com o nome do pokemon.&lt;/p&gt;

&lt;p&gt;Acompanhe os comentários no código para entender o que foi feito!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb8-1"&gt;&lt;span&gt;# gera o gráfico original&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-2"&gt;sns.scatterplot(pokemons, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Att'&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Def'&lt;/span&gt;, hue&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Generation Desc'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb8-3"&gt;&lt;/span&gt;
&lt;span id="cb8-4"&gt;&lt;span&gt;# adiciona os títulos&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-5"&gt;plt.title(&lt;span&gt;'Análise de Pontos de Ataque X Defesa'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb8-6"&gt;plt.xlabel(&lt;span&gt;'Pontos de Ataque'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb8-7"&gt;plt.ylabel(&lt;span&gt;'Pontos de Defesa'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb8-8"&gt;&lt;/span&gt;
&lt;span id="cb8-9"&gt;&lt;span&gt;# adiciona e posiciona a legenda&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-10"&gt;plt.legend(loc&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'upper right'&lt;/span&gt;, bbox_to_anchor&lt;span&gt;=&lt;/span&gt;(&lt;span&gt;1.21&lt;/span&gt;,&lt;span&gt;1.02&lt;/span&gt;))&lt;/span&gt;
&lt;span id="cb8-11"&gt;&lt;/span&gt;
&lt;span id="cb8-12"&gt;&lt;span&gt;# ajusta a faixa de valores para os dois eixos&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-13"&gt;&lt;span&gt;# observe que utilizamos valores fixos. O ideal seria utilizar alguma&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-14"&gt;&lt;span&gt;# fórmula ou função para dinamizar, mas vamos deixar simples&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-15"&gt;plt.xlim(&lt;span&gt;0&lt;/span&gt;, &lt;span&gt;225&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb8-16"&gt;plt.ylim(&lt;span&gt;0&lt;/span&gt;, &lt;span&gt;225&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb8-17"&gt;&lt;/span&gt;
&lt;span id="cb8-18"&gt;&lt;span&gt;# traçamos as linhas de divisão dos quadrantes&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-19"&gt;&lt;span&gt;# observe que a posição delas é na exata metade do &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-20"&gt;&lt;span&gt;# valor máximo de cada eixo&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-21"&gt;plt.axhline(y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;112.5&lt;/span&gt;, color&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'blue'&lt;/span&gt;, linestyle&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'--'&lt;/span&gt;, linewidth&lt;span&gt;=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;) &lt;/span&gt;
&lt;span id="cb8-22"&gt;plt.axvline(x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;112.5&lt;/span&gt;, color&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'blue'&lt;/span&gt;,linestyle&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'--'&lt;/span&gt;, linewidth&lt;span&gt;=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;) &lt;/span&gt;
&lt;span id="cb8-23"&gt;&lt;/span&gt;
&lt;span id="cb8-24"&gt;&lt;span&gt;# criamos o label que identifica cada quadrante e o seu significado&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-25"&gt;plt.text(x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;40&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;, s&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"Fracos"&lt;/span&gt;, color&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'blue'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb8-26"&gt;plt.text(x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;145&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;, s&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"Atacantes"&lt;/span&gt;, color&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'blue'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb8-27"&gt;plt.text(x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;155&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;210&lt;/span&gt;, s&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"Fortes"&lt;/span&gt;, color&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'blue'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb8-28"&gt;plt.text(x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;30&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;210&lt;/span&gt;, s&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"Defensivos"&lt;/span&gt;, color&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'blue'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb8-29"&gt;&lt;/span&gt;
&lt;span id="cb8-30"&gt;&lt;span&gt;# mostra o gráfico&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb8-31"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-108%2Findex_files%2Ffigure-html%2Fcell-8-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-108%2Findex_files%2Ffigure-html%2Fcell-8-output-1.png" width="668" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ficou bem bonito o nosso quadrante! A única coisa que não fizemos foi adicionar um “tooltip” a cada ponto para sabermos que pokemon é aquele. Para isso, precisamos que o gráfico seja do tipo interativo, o que requer utilizar outra biblioteca. Em um dos próximos artigos iremos explorar uma biblioteca que permite esse tipo de interação.&lt;/p&gt;



&lt;h2&gt;Conclusão&lt;/h2&gt;

&lt;p&gt;Neste artigo exercitamos ainda mais nossa capacidade de criar gráficos, expandido nosso conhecimento para a aplicação de mais uma função, chamada &lt;code&gt;scatterplot()&lt;/code&gt; que nos permite criar gráficos de dispersão e os populares quadrantes mágicos. Também aprendemos mais algumas funções que nos ajudam a melhor formatar os nossos gráficos.&lt;/p&gt;

&lt;p&gt;Um abraço e até a próxima,&lt;/p&gt;

&lt;p&gt;Walter.&lt;/p&gt;



</description>
      <category>visualização</category>
      <category>pandas</category>
      <category>seaborn</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Parte 06 - Linhas e Áreas</title>
      <dc:creator>Walter R P Cortes</dc:creator>
      <pubDate>Thu, 09 Feb 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/wpcortes75/parte-06-linhas-e-areas-4i3f</link>
      <guid>https://dev.to/wpcortes75/parte-06-linhas-e-areas-4i3f</guid>
      <description>&lt;p&gt;Olá Devs!&lt;/p&gt;

&lt;p&gt;No artigo anterior, começamos de maneira efetiva o nosso aprendizado da biblioteca seaborn, para a criação de gráficos utilizando a linguagem Python, e tecnologias interativas como o Google Colab.&lt;/p&gt;

&lt;p&gt;Mais especificamente, aprendemos a criar gráficos de barras e suas variações como o gráfico de colunas, barras agrupadas ou até mesmo empilhadas (stacked). Esses gráficos correspondem com certeza à maior parte da nossa necessidade em termos de gráficos, mas ainda temos outra categoria que é muito importante: os gráficos de Linhas e Áreas.&lt;/p&gt;

&lt;h3&gt;Gráficos de Linhas e Áreas&lt;/h3&gt;

&lt;p&gt;Os gráficos de Linhas e Áreas são utilizados quando precisamos representar a distribuição de métrica ao longo de um eixo de valores categóricos mas contínuos. O exemplo mais clássico é representar a distribuição de valores ao longo da dimensão do tempo. Mas também é possível utilizar qualquer outra dimensão numérica e contínua.&lt;/p&gt;

&lt;p&gt;Então, estão preparados para mais uma dose de conhecimento?&lt;/p&gt;

&lt;h2&gt;Preparação&lt;/h2&gt;

&lt;p&gt;A primeira coisa que iremos fazer no nosso notebook é carregar todas as bibliotecas que iremos utilizar e também o nosso conjunto de dados.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb1-1"&gt;&lt;span&gt;import&lt;/span&gt; pandas &lt;span&gt;as&lt;/span&gt; pd&lt;/span&gt;
&lt;span id="cb1-2"&gt;&lt;span&gt;import&lt;/span&gt; seaborn &lt;span&gt;as&lt;/span&gt; sns&lt;/span&gt;
&lt;span id="cb1-3"&gt;&lt;span&gt;import&lt;/span&gt; matplotlib.pyplot &lt;span&gt;as&lt;/span&gt; plt&lt;/span&gt;
&lt;span id="cb1-4"&gt;&lt;/span&gt;
&lt;span id="cb1-5"&gt;pokemons &lt;span&gt;=&lt;/span&gt; pd.read_csv(&lt;span&gt;'pokemons.csv'&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Utilização Básica&lt;/h2&gt;

&lt;p&gt;A utilização básica aqui não é muito diferente do que fizemos para os gráficos de barra: temos uma função que deve poder gerar a visualização, através da passagem de alguns parâmetros básicos: fonte de dados, eixo X, Y, …&lt;/p&gt;

&lt;p&gt;Neste caso, a função em questão é a &lt;code&gt;lineplot()&lt;/code&gt;. Vamos tentar?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb2-1"&gt;sns.lineplot(pokemons, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Generation'&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Spe'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb2-2"&gt;plt.title(&lt;span&gt;'Variação de Velocidade de acordo com as Gerações'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb2-3"&gt;plt.xlabel(&lt;span&gt;'Geração'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb2-4"&gt;plt.ylabel(&lt;span&gt;'Velocidade'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb2-5"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-107%2Findex_files%2Ffigure-html%2Fcell-3-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-107%2Findex_files%2Ffigure-html%2Fcell-3-output-1.png" width="562" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Padronização é uma maravilha, não é mesmo? Pegamos o nosso código para gráficos de barras e trocamos a função e tudo funcionou! Podemos perceber, no entanto, que a nossa linha representando está envolta por um delimitador azulado. Para resolver isso, vamos dar uma analisada nos parâmetros específicos da função &lt;code&gt;lineplot()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Por padrão, o gráfico de linhas também plota o que chamamos de error band, ou margem de erro. Se não for interessante, podemos eliminar essa error band.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb3-1"&gt;sns.lineplot(pokemons, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Generation'&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Spe'&lt;/span&gt;, errorbar&lt;span&gt;=&lt;/span&gt;&lt;span&gt;None&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb3-2"&gt;plt.title(&lt;span&gt;'Variação de Velocidade de acordo com as Gerações'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb3-3"&gt;plt.xlabel(&lt;span&gt;'Geração'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb3-4"&gt;plt.ylabel(&lt;span&gt;'Velocidade'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb3-5"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-107%2Findex_files%2Ffigure-html%2Fcell-4-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-107%2Findex_files%2Ffigure-html%2Fcell-4-output-1.png" width="563" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E, assim como no gráfico de barras, temos a necessidade de plotar mais de uma série no nosso gráfico de linhas. Como fazemos isso? É simples:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb4-1"&gt;pokemons_sb &lt;span&gt;=&lt;/span&gt; pokemons[[&lt;span&gt;'Generation'&lt;/span&gt;,&lt;span&gt;'Spa'&lt;/span&gt;,&lt;span&gt;'Spd'&lt;/span&gt;]] &lt;span&gt;# Primeiro selecionamos apenas as colunas que queremos trabalhar&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb4-2"&gt;tidy &lt;span&gt;=&lt;/span&gt; pokemons_sb.melt(id_vars&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Generation'&lt;/span&gt;).rename(columns&lt;span&gt;=&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;.title)&lt;/span&gt;
&lt;span id="cb4-3"&gt;&lt;/span&gt;
&lt;span id="cb4-4"&gt;sns.lineplot(tidy, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Generation'&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Value'&lt;/span&gt;, hue&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Variable'&lt;/span&gt;, errorbar&lt;span&gt;=&lt;/span&gt;&lt;span&gt;None&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb4-5"&gt;plt.title(&lt;span&gt;'Análise das Gerações'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb4-6"&gt;plt.xlabel(&lt;span&gt;'Geração'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb4-7"&gt;plt.ylabel(&lt;span&gt;'Atributos'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb4-8"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-107%2Findex_files%2Ffigure-html%2Fcell-5-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-107%2Findex_files%2Ffigure-html%2Fcell-5-output-1.png" width="562" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basicamente, tivemos que fazer a mesma operação que fizemos para as múltiplas barras. E o resto do código já é bem conhecido.&lt;/p&gt;

&lt;p&gt;O outro tipo de gráfico baseado em linhas é o popular gráfico de área. Mas somente conseguimos gerar esse gráfico utilizando a função &lt;code&gt;stackplot()&lt;/code&gt; do MatplotLib. Veja o exemplo abaixo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb5-1"&gt;pokemons_gb &lt;span&gt;=&lt;/span&gt; pokemons.groupby([&lt;span&gt;'Generation'&lt;/span&gt;])[[&lt;span&gt;'Spa'&lt;/span&gt;, &lt;span&gt;'Spd'&lt;/span&gt;]].mean().reset_index()&lt;/span&gt;
&lt;span id="cb5-2"&gt;&lt;/span&gt;
&lt;span id="cb5-3"&gt;plt.stackplot(pokemons_gb[&lt;span&gt;'Generation'&lt;/span&gt;], pokemons_gb[&lt;span&gt;'Spa'&lt;/span&gt;], pokemons_gb[&lt;span&gt;'Spd'&lt;/span&gt;], labels&lt;span&gt;=&lt;/span&gt;[&lt;span&gt;'Special Attack'&lt;/span&gt;, &lt;span&gt;'Special Defense'&lt;/span&gt;])&lt;/span&gt;
&lt;span id="cb5-4"&gt;plt.title(&lt;span&gt;'Análise das Gerações'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb5-5"&gt;plt.xlabel(&lt;span&gt;'Geração'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb5-6"&gt;plt.ylabel(&lt;span&gt;'Atributos'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb5-7"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-107%2Findex_files%2Ffigure-html%2Fcell-6-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-107%2Findex_files%2Ffigure-html%2Fcell-6-output-1.png" width="571" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E aí está o nosso gráfico de área! Mais uma vez, recorremos a matplotlib para concluir a plotagem.&lt;/p&gt;

&lt;h2&gt;Conclusão&lt;/h2&gt;

&lt;p&gt;Neste artigos, aprendemos a criar mais dois tipos de gráfico: linha e área, revisamos a utilização de pandas para transformar os dados e acrescentamos mais uma ferramenta no nosso cinto de utilidades.&lt;/p&gt;

&lt;p&gt;Se você quiser aprender mais sobre gráficos de linha e área em seaborn, seguem alguns links: - &lt;a href="https://seaborn.pydata.org/introduction.html#introduction" rel="noopener noreferrer"&gt;Documentação oficial do Seaborn em português&lt;/a&gt;: A documentação oficial do Seaborn tem uma versão em português que fornece uma visão geral da biblioteca, exemplos de uso, informações sobre os diferentes tipos de gráficos, e muito mais - &lt;a href="https://morioh.com/p/4eda0350366b" rel="noopener noreferrer"&gt;Gráficos de Linha em Seaborn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Um abraço e até a próxima,&lt;/p&gt;

&lt;p&gt;Walter.&lt;/p&gt;

</description>
      <category>visualização</category>
      <category>pandas</category>
      <category>seaborn</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Parte 05 - Iniciando com Seaborn</title>
      <dc:creator>Walter R P Cortes</dc:creator>
      <pubDate>Wed, 08 Feb 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/wpcortes75/parte-05-iniciando-com-seaborn-7l7</link>
      <guid>https://dev.to/wpcortes75/parte-05-iniciando-com-seaborn-7l7</guid>
      <description>&lt;p&gt;Olá Devs!&lt;/p&gt;

&lt;p&gt;Bem-vindos de volta! Na Parte 04 aprendemos como utilizar a biblioteca Pandas para carregar no notebook os dados que pretendemos trabalhar. Também aprendemos a utilizar algumas funções mais avançadas que nos permitem filtrar ou agregar informações em nosso conjunto de dados.&lt;/p&gt;

&lt;p&gt;A linguagem Python possui inúmeras bibliotecas não-nativas para gerar visualizações de dados. A biblioteca mais famosa e que muitas vezes serve de base para as outras se chama &lt;strong&gt;matplotlib&lt;/strong&gt;. Por uma questão de conveniência e facilidade de uso, utilizaremos no curso a biblioteca &lt;strong&gt;seaborn&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;As principais vantagens do seaborn são: - &lt;strong&gt;interface alto nível&lt;/strong&gt; - existe uma função para cada tipo de gráfico, e permite fazer chaining de chamadas - &lt;strong&gt;facilidade de configuração&lt;/strong&gt; - possui objetos de configuração globais e locais (em cada gráfico).&lt;/p&gt;

&lt;p&gt;Nesta aula, vamos passar pelo processo de instalação e utilização dos tipos de gráficos mais básicos no seaborn.&lt;/p&gt;

&lt;h2&gt;Instalação&lt;/h2&gt;

&lt;p&gt;Assim como no artigo de Pandas, tenho uma boa notícia: no Google Colab o seaborn já vem instalado no nosso ambiente! Mas caso você esteja também se aventurando em fazer este curso no VS Code, PyCharm, Sublime ou até mesmo Notepad, o comando para instalar a biblioteca seaborn é o seguinte:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(venv) $ pip install seaborn&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Visualizando com seaborn&lt;/h2&gt;

&lt;p&gt;Agora vamos ver na prática como o seaborn funciona. Neste artigo, veremos os tipos de gráficos mais comuns, indicando sua utilização e dando exemplos. Se você quiser mais detalhes, sempre pode consultar a documentação do seaborn em &lt;a href="https://seaborn.pydata.org/index.html" rel="noopener noreferrer"&gt;Seaborn Docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Hoje vamos gerar gráficos de barras ou colunas, baseados nas funções: &lt;code&gt;countplot()&lt;/code&gt; e &lt;code&gt;barplot()&lt;/code&gt;. Nas partes seguintes do artigo, iremos explorar outros tipos de gráficos, que são um pouco mais avançados.&lt;/p&gt;

&lt;h3&gt;Inicializando o seaborn&lt;/h3&gt;

&lt;p&gt;Como toda a biblioteca python, precisamos indicar em nosso script quando queremos utilizar a biblioteca seaborn. Fazemos isso através do comando &lt;code&gt;import&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb2-1"&gt;&lt;span&gt;import&lt;/span&gt; seaborn &lt;span&gt;as&lt;/span&gt; sns&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Da mesma forma que falamos na aula de Pandas, o import do seaborn geralmente utiliza o apelido de sns, que pode ser encontrado em muitos artigos na internet. Vamos manter essa convenção para que vocês se acostumem ao procurar material de apoio.&lt;/p&gt;

&lt;p&gt;Por falar de Pandas, precisamos carregar ele também, afinal, precisamos dos nossos dados!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb3-1"&gt;&lt;span&gt;import&lt;/span&gt; pandas &lt;span&gt;as&lt;/span&gt; pd&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Carregando os dados&lt;/h3&gt;

&lt;p&gt;E vamos continuar nossas demonstrações com o conjunto de dados de pokemons:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb4-1"&gt;pokemons &lt;span&gt;=&lt;/span&gt; pd.read_csv(&lt;span&gt;'pokemons.csv'&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Gráficos de barras ou colunas&lt;/h3&gt;

&lt;p&gt;Um gráfico de barras ou colunas é uma representação gráfica de dados em que as informações são exibidas em barras verticais ou horizontais de comprimentos variáveis. Cada barra ou coluna representa uma categoria ou conjunto de dados diferentes, e a altura ou comprimento da barra é proporcional à quantidade ou valor correspondente.&lt;/p&gt;

&lt;p&gt;Os gráficos de barras são frequentemente usados para comparar quantidades ou valores entre diferentes categorias, enquanto os gráficos de colunas são mais adequados para exibir uma série temporal de dados. Ambos os tipos de gráficos podem ser usados para exibir dados discretos ou contínuos, e podem ser personalizados para incluir rótulos, legendas e outras informações relevantes. Os gráficos de barras e colunas são comumente usados em relatórios, apresentações e em análises de dados.&lt;/p&gt;

&lt;h4&gt;&lt;code&gt;countplot()&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;A primeira função que iremos aprender a utilizar é a função &lt;code&gt;countplot()&lt;/code&gt;. Ela é indicada quando queremos realizar a contagem de uma categoria, ou seja, escolhemos um campo categórico em nossos dados e indicamos quantas ocorrências encontramos em nossos dados. Nos próximos blocos de código, veremos vários exemplos de como fazer isso.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb5-1"&gt;&lt;span&gt;# contando o número de pokemons por geração&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-2"&gt;&lt;/span&gt;
&lt;span id="cb5-3"&gt;plot &lt;span&gt;=&lt;/span&gt; sns.countplot(pokemons, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"Generation"&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb5-4"&gt;&lt;/span&gt;
&lt;span id="cb5-5"&gt;plot&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-106%2Findex_files%2Ffigure-html%2Fcell-5-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-106%2Findex_files%2Ffigure-html%2Fcell-5-output-1.png" width="571" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Olha só, parece bem fácil, não? Está ali o nosso gráfico, com o número de pokemons por geração. No entanto, temos algumas melhorias que podem ser feitas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;adicionar um título&lt;/li&gt;
&lt;li&gt;corrigir os títulos dos eixos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para realizar esses ajustes, vamos precisar de uma nova biblioteca, chamada &lt;code&gt;matplotlib&lt;/code&gt;. Na verdade, essa biblioteca é a base de muitas outras bibliotecas de visualização, tais como seaborn, plotly e por aí vai.&lt;/p&gt;

&lt;p&gt;Neste cenário, &lt;code&gt;matplotlib&lt;/code&gt; é utilizada para preparar o que chamamos de área de plotagem, que é o retângulo branco onde nosso gráfico será exibido.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb6-1"&gt;&lt;span&gt;import&lt;/span&gt; matplotlib.pyplot &lt;span&gt;as&lt;/span&gt; plt&lt;/span&gt;
&lt;span id="cb6-2"&gt;&lt;span&gt;# contando o número de pokemons por geração&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb6-3"&gt;&lt;/span&gt;
&lt;span id="cb6-4"&gt;sns.countplot(pokemons, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"Generation"&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb6-5"&gt;plt.title(&lt;span&gt;'Pokemons por Geração'&lt;/span&gt;) &lt;span&gt;# título do gráfico&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb6-6"&gt;plt.xlabel(&lt;span&gt;'Geração'&lt;/span&gt;) &lt;span&gt;# eixo X&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb6-7"&gt;plt.ylabel(&lt;span&gt;'Número de Pokemons'&lt;/span&gt;) &lt;span&gt;# eixo Y&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb6-8"&gt;&lt;/span&gt;
&lt;span id="cb6-9"&gt;plt.show() &lt;span&gt;# mostra o gráfico&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-106%2Findex_files%2Ffigure-html%2Fcell-6-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-106%2Findex_files%2Ffigure-html%2Fcell-6-output-1.png" width="571" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora sim, temos um gráfico bem desenhado!&lt;/p&gt;

&lt;p&gt;Este gráfico é um &lt;strong&gt;Gráfico de Colunas&lt;/strong&gt;, de acordo com as definições, pois as barras são verticais. Para transformar em um gráfico de barras, na função &lt;code&gt;countplot()&lt;/code&gt; precisamos apenas trocar o x pelo y no segundo parâmetro, além de trocar os títulos na funções xlabel e ylabel. Vamos ver como fica:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb7-1"&gt;sns.countplot(pokemons, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"Generation"&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb7-2"&gt;plt.title(&lt;span&gt;'Pokemons por Geração'&lt;/span&gt;) &lt;span&gt;# título do gráfico&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb7-3"&gt;plt.ylabel(&lt;span&gt;'Geração'&lt;/span&gt;) &lt;span&gt;# eixo Y&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb7-4"&gt;plt.xlabel(&lt;span&gt;'Número de Pokemons'&lt;/span&gt;) &lt;span&gt;# eixo X&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb7-5"&gt;&lt;/span&gt;
&lt;span id="cb7-6"&gt;plt.show() &lt;span&gt;# mostra o gráfico&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-106%2Findex_files%2Ffigure-html%2Fcell-7-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-106%2Findex_files%2Ffigure-html%2Fcell-7-output-1.png" width="567" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;&lt;code&gt;barplot()&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;Nos gráficos utilizando &lt;code&gt;countplot()&lt;/code&gt; podemos apenas exibir a contagem de elementos para cada valor categórico da coluna que escolhemos. Não temos como, por exemplo, apresentar a média dos pontos de vida dos pokemons. Para isso, precisamos de mais controle sobre os dados que iremos mostrar. Entra em cena a função &lt;code&gt;barplot()&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb8-1"&gt;&lt;span&gt;import&lt;/span&gt; numpy &lt;span&gt;as&lt;/span&gt; np&lt;/span&gt;
&lt;span id="cb8-2"&gt;&lt;/span&gt;
&lt;span id="cb8-3"&gt;sns.barplot(pokemons, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Generation'&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'HP'&lt;/span&gt;, estimator&lt;span&gt;=&lt;/span&gt;np.mean)&lt;/span&gt;
&lt;span id="cb8-4"&gt;plt.title(&lt;span&gt;'Média dos pontos de vida de Pokemons por Geração'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb8-5"&gt;plt.xlabel(&lt;span&gt;'Geração'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb8-6"&gt;plt.ylabel(&lt;span&gt;'Média dos pontos de vida'&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;Text(0, 0.5, 'Média dos pontos de vida')&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-106%2Findex_files%2Ffigure-html%2Fcell-8-output-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-106%2Findex_files%2Ffigure-html%2Fcell-8-output-2.png" width="563" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E aí está o nosso gráfico. Algumas observações:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Precisamos trazer mais uma biblioteca para o nosso script, a biblioteca numpy, para podermos especificar que nosso gráfico de barras iria calcular a média do campo especificado&lt;/li&gt;
&lt;li&gt;Além de definirmos o eixo X, definimos também o eixo Y e qual o tipo de cálculo a ser realizado&lt;/li&gt;
&lt;li&gt;Cada barra tem um risco preto. Esse risco se refere a margem de erro. Se você não quiser ver essa informação, apenas adicionamos mais um parâmetro a função e ela desaparece.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb10-1"&gt;sns.barplot(pokemons, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Generation'&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'HP'&lt;/span&gt;, estimator&lt;span&gt;=&lt;/span&gt;np.mean, errwidth&lt;span&gt;=&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb10-2"&gt;plt.title(&lt;span&gt;'Média dos pontos de vida de Pokemons por Geração'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb10-3"&gt;plt.xlabel(&lt;span&gt;'Geração'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb10-4"&gt;plt.ylabel(&lt;span&gt;'Média dos pontos de vida'&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;/tmp/ipykernel_227049/3891424301.py:1: FutureWarning: 

The `errwidth` parameter is deprecated. And will be removed in v0.15.0. Pass `err_kws={'linewidth': 0}` instead.

  sns.barplot(pokemons, x='Generation', y='HP', estimator=np.mean, errwidth=0)&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;Text(0, 0.5, 'Média dos pontos de vida')&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-106%2Findex_files%2Ffigure-html%2Fcell-9-output-3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-106%2Findex_files%2Ffigure-html%2Fcell-9-output-3.png" width="563" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E aí está o nosso gráfico de colunas. Outra coisa que podemos explorar é ter mais de uma métrica sendo analisada pela categoria selecionada. Por exemplo, vamos analisar a média dos pontos de ataque e defesa através das gerações.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb13-1"&gt;&lt;span&gt;# Precisamos fazer ajustes no conjunto de dados&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb13-2"&gt;pokemons_sb &lt;span&gt;=&lt;/span&gt; pokemons[[&lt;span&gt;'Generation'&lt;/span&gt;,&lt;span&gt;'Att'&lt;/span&gt;,&lt;span&gt;'Def'&lt;/span&gt;]] &lt;span&gt;# Primeiro selecionamos apenas as colunas que queremos trabalhar&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb13-3"&gt;tidy &lt;span&gt;=&lt;/span&gt; pokemons_sb.melt(id_vars&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Generation'&lt;/span&gt;).rename(columns&lt;span&gt;=&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;.title)&lt;/span&gt;
&lt;span id="cb13-4"&gt;&lt;span&gt;# A função melt() recebe como parâmetro a coluna categórica e pega todas as colunas de métricas e transformam em uma &lt;/span&gt;&lt;/span&gt;
&lt;span id="cb13-5"&gt;&lt;span&gt;# única coluna, em uma nova linha para cada coluna. Para identificar cada nova linha, outra coluna é adicionada, com&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb13-6"&gt;&lt;span&gt;# a descrição. Ou seja, realizamos uma transposição do nosso conjunto de dados.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb13-7"&gt;&lt;/span&gt;
&lt;span id="cb13-8"&gt;&lt;span&gt;# Gráfico&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb13-9"&gt;sns.barplot(tidy, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Generation'&lt;/span&gt;, y&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Value'&lt;/span&gt;, hue&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Variable'&lt;/span&gt;, estimator&lt;span&gt;=&lt;/span&gt;np.mean, err_kws&lt;span&gt;=&lt;/span&gt;{&lt;span&gt;"linewidth"&lt;/span&gt;: &lt;span&gt;0&lt;/span&gt;})&lt;/span&gt;
&lt;span id="cb13-10"&gt;plt.title(&lt;span&gt;'Média dos pontos de ataque e defesa de Pokemons por Geração'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb13-11"&gt;plt.xlabel(&lt;span&gt;'Geração'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb13-12"&gt;plt.ylabel(&lt;span&gt;'Média dos pontos de ataque e defesa'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb13-13"&gt;plt.legend()&lt;/span&gt;
&lt;span id="cb13-14"&gt;&lt;/span&gt;
&lt;span id="cb13-15"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-106%2Findex_files%2Ffigure-html%2Fcell-10-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-106%2Findex_files%2Ffigure-html%2Fcell-10-output-1.png" width="591" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No código acima, a parte que faz a plotagem do gráfico continua a mesma, mas temos as duas linhas iniciais que servem para fazer um ajuste nos dados. Quanto mais complexo os gráficos que queremos plotar, mais necessário se torna entender como formatar os dados. Então, aprenda principalmente Pandas e SQL e mantenha todos os seus gráficos fáceis de plotar!&lt;/p&gt;

&lt;p&gt;Agora, vamos ver mais um subtipo de gráfico de barras ou colunas: o gráfico de colunas “stacked” ou empilhadas.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb14-1"&gt;pokemons_gb &lt;span&gt;=&lt;/span&gt; pokemons.groupby([&lt;span&gt;'Generation'&lt;/span&gt;])[[&lt;span&gt;'Generation'&lt;/span&gt;,&lt;span&gt;'Att'&lt;/span&gt;, &lt;span&gt;'Def'&lt;/span&gt;]].mean()&lt;/span&gt;
&lt;span id="cb14-2"&gt;&lt;/span&gt;
&lt;span id="cb14-3"&gt;plt.bar(pokemons_gb[&lt;span&gt;'Generation'&lt;/span&gt;], pokemons_gb[&lt;span&gt;'Att'&lt;/span&gt;], color&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'blue'&lt;/span&gt;, edgecolor&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'white'&lt;/span&gt;, width&lt;span&gt;=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb14-4"&gt;plt.bar(pokemons_gb[&lt;span&gt;'Generation'&lt;/span&gt;], pokemons_gb[&lt;span&gt;'Def'&lt;/span&gt;], bottom&lt;span&gt;=&lt;/span&gt;pokemons_gb[&lt;span&gt;'Att'&lt;/span&gt;], color&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'red'&lt;/span&gt;, edgecolor&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'white'&lt;/span&gt;, width&lt;span&gt;=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb14-5"&gt;plt.title(&lt;span&gt;'Média dos pontos de ataque e defesa de Pokemons por Geração'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb14-6"&gt;plt.xlabel(&lt;span&gt;'Geração'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb14-7"&gt;plt.ylabel(&lt;span&gt;'Média dos pontos de ataque e defesa'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb14-8"&gt;&lt;/span&gt;
&lt;span id="cb14-9"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-106%2Findex_files%2Ffigure-html%2Fcell-11-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-106%2Findex_files%2Ffigure-html%2Fcell-11-output-1.png" width="591" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesta versão de stacked bar chart, como podemos perceber pelo código, foi necessária uma nova transformação nos dados, desta vez com as funções &lt;code&gt;groupby()&lt;/code&gt; e &lt;code&gt;mean()&lt;/code&gt;. Além disso, desenhamos as barras com o matplotlib direto, não chegamos a utilizar o seaborn.&lt;/p&gt;

&lt;p&gt;A transformação nos dados foi necessária para agruparmos os valores de ataque e defensa por geração e calcular a média. A opção de utilizar matplotlib direto produziu um gráfico com a aparência bem diferente, e sinceramente, feia se comparada aos outros gráficos que criamos. E existe uma alternativa! Podemos usar o seaborn através do próprio DataFrame, garantindo uma aparência alinhada com o que geramos anteriormente.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb15-1"&gt;pokemons_gb.plot(kind&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'bar'&lt;/span&gt;, x&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Generation'&lt;/span&gt;, stacked&lt;span&gt;=&lt;/span&gt;&lt;span&gt;True&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb15-2"&gt;plt.title(&lt;span&gt;'Média dos pontos de ataque e defesa de Pokemons por Geração'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb15-3"&gt;plt.xlabel(&lt;span&gt;'Geração'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb15-4"&gt;plt.ylabel(&lt;span&gt;'Média dos pontos de ataque e defesa'&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb15-5"&gt;plt.legend()&lt;/span&gt;
&lt;span id="cb15-6"&gt;&lt;/span&gt;
&lt;span id="cb15-7"&gt;plt.show()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-106%2Findex_files%2Ffigure-html%2Fcell-12-output-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-106%2Findex_files%2Ffigure-html%2Fcell-12-output-1.png" width="591" height="463"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;br&gt;


&lt;h2&gt;Concluindo&lt;/h2&gt;

&lt;p&gt;Conseguimos ver como gerar um dos gráficos mais utilizados na área de Visualização de Dados, o gráfico de barras e suas variações utilizando a biblioteca seaborn. Também aprendemos que para gerar certos tipos de gráficos, é necessário fazer algumas transformações nos dados, o que conecta este artigo ao de Pandas.&lt;/p&gt;

&lt;p&gt;Se você quiser aprender mais sobre seaborn, seguem alguns links: - &lt;a href="https://seaborn.pydata.org/introduction.html#introduction" rel="noopener noreferrer"&gt;Documentação oficial do Seaborn em português&lt;/a&gt;: A documentação oficial do Seaborn tem uma versão em português que fornece uma visão geral da biblioteca, exemplos de uso, informações sobre os diferentes tipos de gráficos, e muito mais - &lt;a href="https://towardsdatascience.com/data-visualization-with-python-and-seaborn-part-1-29c8d54a854f" rel="noopener noreferrer"&gt;Tutorial de visualização de dados com Python e Seaborn&lt;/a&gt;: Este tutorial do Towards Data Science fornece uma introdução prática à visualização de dados com Seaborn, incluindo exemplos de código e gráficos. O tutorial abrange tópicos como gráficos de barras, gráficos de dispersão, heatmap e muito mais.&lt;/p&gt;

&lt;p&gt;Um abraço e até mais,&lt;/p&gt;

&lt;p&gt;Walter.&lt;/p&gt;



</description>
      <category>visualização</category>
      <category>pandas</category>
      <category>seaborn</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Parte 04 - Pandas</title>
      <dc:creator>Walter R P Cortes</dc:creator>
      <pubDate>Tue, 07 Feb 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/wpcortes75/parte-04-pandas-ehd</link>
      <guid>https://dev.to/wpcortes75/parte-04-pandas-ehd</guid>
      <description>&lt;p&gt;Olá Devs!&lt;/p&gt;

&lt;p&gt;Se você chegou até aqui, significa que já deve ter aprendido como carregar os dados no Google Colab utilizando as bibliotecas padrão do python. E deve ter percebido que a tarefa não é simples, e requer muitas linhas de código (Rapadura é doce mas não é mole não, diria o Yusuke Urameshi).&lt;/p&gt;

&lt;p&gt;Justamente com a intenção de simplificar o trabalho dos cientistas e engenheiros de dados é que a biblioteca &lt;strong&gt;Pandas&lt;/strong&gt; foi criada. Com a biblioteca Pandas, todo o trabalho de manipulação dos dados fica simplificado, rápido e mais organizado.&lt;/p&gt;

&lt;h2&gt;Instalando Pandas&lt;/h2&gt;

&lt;p&gt;Tenho uma boa notícia: como estamos utilizando o Google Colab para nossas aulas, ele já vem instalado no nosso ambiente! Mas caso você esteja também se aventurando em fazer este curso no VS Code, PyCharm, Sublime ou até mesmo Notepad, o comando para instalar a biblioteca Pandas é o seguinte:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(venv) $ pip install pandas&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Este comando irá instalar a biblioteca Pandas e todos as bibliotecas dependentes. É aconselhável que você crie um ambiente virtual para instalar as bibliotecas, mas isso é assunto para um outro dia.&lt;/p&gt;

&lt;h2&gt;Utilizando Pandas&lt;/h2&gt;

&lt;p&gt;Iremos ver, passo a passo, como utilizar a biblioteca Pandas em nosso notebook Google Colab, passando pelos seus principais conceitos.&lt;/p&gt;

&lt;h3&gt;Carregando Pandas no notebook&lt;/h3&gt;

&lt;p&gt;A primeira coisa que devemos fazer é carregar a biblioteca em nosso notebook. Fazemos isso com o comando &lt;code&gt;import&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb2-1"&gt;&lt;span&gt;import&lt;/span&gt; pandas &lt;span&gt;as&lt;/span&gt; pd&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Tip&lt;/p&gt;

&lt;p&gt;É considerado uma boa prática ao carregar a biblioteca sempre utilizar o alias &lt;code&gt;pd&lt;/code&gt;. Observe que todos os artigos na internet utilizam essa mesma referência.&lt;/p&gt;

&lt;h3&gt;Carregando os dados&lt;/h3&gt;

&lt;p&gt;Na aula 3, aprendemos que uma maneira de carregar os dados em um notebook on Google Colab é a seguinte:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb3-1"&gt;&lt;span&gt;import&lt;/span&gt; csv&lt;/span&gt;
&lt;span id="cb3-2"&gt;&lt;/span&gt;
&lt;span id="cb3-3"&gt;pokemons &lt;span&gt;=&lt;/span&gt; {}&lt;/span&gt;
&lt;span id="cb3-4"&gt;&lt;span&gt;with&lt;/span&gt; &lt;span&gt;open&lt;/span&gt;(&lt;span&gt;'pokemons.csv'&lt;/span&gt;, &lt;span&gt;'r'&lt;/span&gt;, encoding&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'utf-8'&lt;/span&gt;) &lt;span&gt;as&lt;/span&gt; arquivo:&lt;/span&gt;
&lt;span id="cb3-5"&gt; dados &lt;span&gt;=&lt;/span&gt; csv.DictReader(arquivo)&lt;/span&gt;
&lt;span id="cb3-6"&gt;&lt;/span&gt;
&lt;span id="cb3-7"&gt; &lt;span&gt;for&lt;/span&gt; pokemon &lt;span&gt;in&lt;/span&gt; dados:&lt;/span&gt;
&lt;span id="cb3-8"&gt; &lt;span&gt;for&lt;/span&gt; key, value &lt;span&gt;in&lt;/span&gt; pokemon.items():&lt;/span&gt;
&lt;span id="cb3-9"&gt; pokemons.setdefault(key,[]).append(value)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Utilizando pandas, isso será substituído por uma única linha:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb4-1"&gt;pokemons &lt;span&gt;=&lt;/span&gt; pd.read_csv(&lt;span&gt;'pokemons.csv'&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ficou bem mais fácil, não é mesmo? Da mesma forma, verificar o conteúdo que foi carregado também se simplifica - vai disso aqui:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb5-1"&gt;&lt;span&gt;for&lt;/span&gt; indice &lt;span&gt;in&lt;/span&gt; &lt;span&gt;range&lt;/span&gt;(&lt;span&gt;0&lt;/span&gt;, &lt;span&gt;2&lt;/span&gt;): &lt;span&gt;# executa um loop dos dois primeiros elementos do array&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-2"&gt; &lt;span&gt;print&lt;/span&gt;(pokemons[indice]) &lt;span&gt;# imprime o elemento&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;para isso aqui:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb6-1"&gt;pokemons.head(&lt;span&gt;2&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Number&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type 1&lt;/th&gt;
&lt;th&gt;Type 2&lt;/th&gt;
&lt;th&gt;Abilities&lt;/th&gt;
&lt;th&gt;HP&lt;/th&gt;
&lt;th&gt;Att&lt;/th&gt;
&lt;th&gt;Def&lt;/th&gt;
&lt;th&gt;Spa&lt;/th&gt;
&lt;th&gt;Spd&lt;/th&gt;
&lt;th&gt;...&lt;/th&gt;
&lt;th&gt;Against Bug&lt;/th&gt;
&lt;th&gt;Against Rock&lt;/th&gt;
&lt;th&gt;Against Ghost&lt;/th&gt;
&lt;th&gt;Against Dragon&lt;/th&gt;
&lt;th&gt;Against Dark&lt;/th&gt;
&lt;th&gt;Against Steel&lt;/th&gt;
&lt;th&gt;Against Fairy&lt;/th&gt;
&lt;th&gt;Height&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;th&gt;BMI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Bulbasaur&lt;/td&gt;
&lt;td&gt;Grass&lt;/td&gt;
&lt;td&gt;Poison&lt;/td&gt;
&lt;td&gt;['Chlorophyll', 'Overgrow']&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;0.7&lt;/td&gt;
&lt;td&gt;6.9&lt;/td&gt;
&lt;td&gt;14.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Ivysaur&lt;/td&gt;
&lt;td&gt;Grass&lt;/td&gt;
&lt;td&gt;Poison&lt;/td&gt;
&lt;td&gt;['Chlorophyll', 'Overgrow']&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;13.0&lt;/td&gt;
&lt;td&gt;13.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;2 rows × 44 columns&lt;/p&gt;

&lt;h3&gt;Mas não é só isso…&lt;/h3&gt;

&lt;p&gt;Outra grande vantagem de se utilizar pandas é que temos a nossa disposição um grande número de opções para carregar dados. Além do &lt;code&gt;read_csv&lt;/code&gt;, temos readers especializados: &lt;code&gt;read_json&lt;/code&gt;, &lt;code&gt;read_excel&lt;/code&gt;, e por aí vai… Aconselho a dar uma olhada no manual do pandas &lt;a href="https://pandas.pydata.org/docs/user_guide/io.html" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Inspecionando os dados&lt;/h3&gt;

&lt;p&gt;Após termos os dados carregados, a nossa próxima atividade é inspecionar os dados. Além do comando que vimos acima &lt;code&gt;head()&lt;/code&gt;, que pode nos mostrar as primeiras linhas do DataFrame, temos outras funções, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tail()&lt;/code&gt; - mostra as últimas linhas do DataFrame&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sample()&lt;/code&gt; - mostra linhas aleatórias do DataFrame&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;describe()&lt;/code&gt; - mostra os valores de diversas medidas&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;info()&lt;/code&gt; - mostra os campos do DataFrame com seus tipos&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;shape&lt;/code&gt; - dá as dimensões (coluna, linha) do DataFrame&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos ver em detalhes cada uma destas funções.&lt;/p&gt;

&lt;h4&gt;&lt;code&gt;head()&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;Esta função lista as primeiras linhas de dados. O pârametro é opcional, o que fará com que a função liste 10 linhas de dados.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb7-1"&gt;pokemons.head(&lt;span&gt;5&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Number&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type 1&lt;/th&gt;
&lt;th&gt;Type 2&lt;/th&gt;
&lt;th&gt;Abilities&lt;/th&gt;
&lt;th&gt;HP&lt;/th&gt;
&lt;th&gt;Att&lt;/th&gt;
&lt;th&gt;Def&lt;/th&gt;
&lt;th&gt;Spa&lt;/th&gt;
&lt;th&gt;Spd&lt;/th&gt;
&lt;th&gt;...&lt;/th&gt;
&lt;th&gt;Against Bug&lt;/th&gt;
&lt;th&gt;Against Rock&lt;/th&gt;
&lt;th&gt;Against Ghost&lt;/th&gt;
&lt;th&gt;Against Dragon&lt;/th&gt;
&lt;th&gt;Against Dark&lt;/th&gt;
&lt;th&gt;Against Steel&lt;/th&gt;
&lt;th&gt;Against Fairy&lt;/th&gt;
&lt;th&gt;Height&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;th&gt;BMI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Bulbasaur&lt;/td&gt;
&lt;td&gt;Grass&lt;/td&gt;
&lt;td&gt;Poison&lt;/td&gt;
&lt;td&gt;['Chlorophyll', 'Overgrow']&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;0.7&lt;/td&gt;
&lt;td&gt;6.9&lt;/td&gt;
&lt;td&gt;14.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Ivysaur&lt;/td&gt;
&lt;td&gt;Grass&lt;/td&gt;
&lt;td&gt;Poison&lt;/td&gt;
&lt;td&gt;['Chlorophyll', 'Overgrow']&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;13.0&lt;/td&gt;
&lt;td&gt;13.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Venusaur&lt;/td&gt;
&lt;td&gt;Grass&lt;/td&gt;
&lt;td&gt;Poison&lt;/td&gt;
&lt;td&gt;['Chlorophyll', 'Overgrow']&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;82&lt;/td&gt;
&lt;td&gt;83&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;25.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Mega Venusaur&lt;/td&gt;
&lt;td&gt;Grass&lt;/td&gt;
&lt;td&gt;Poison&lt;/td&gt;
&lt;td&gt;['Thick Fat']&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;123&lt;/td&gt;
&lt;td&gt;122&lt;/td&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;2.4&lt;/td&gt;
&lt;td&gt;155.5&lt;/td&gt;
&lt;td&gt;27.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Charmander&lt;/td&gt;
&lt;td&gt;Fire&lt;/td&gt;
&lt;td&gt;NaN&lt;/td&gt;
&lt;td&gt;['Blaze', 'Solar Power']&lt;/td&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;0.6&lt;/td&gt;
&lt;td&gt;8.5&lt;/td&gt;
&lt;td&gt;23.6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;5 rows × 44 columns&lt;/p&gt;

&lt;h4&gt;&lt;code&gt;tail()&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;Esta função lista as últimas linhas de dados. O pârametro é opcional, o que fará com que a função liste 10 linhas de dados.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb8-1"&gt;pokemons.tail(&lt;span&gt;5&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Number&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type 1&lt;/th&gt;
&lt;th&gt;Type 2&lt;/th&gt;
&lt;th&gt;Abilities&lt;/th&gt;
&lt;th&gt;HP&lt;/th&gt;
&lt;th&gt;Att&lt;/th&gt;
&lt;th&gt;Def&lt;/th&gt;
&lt;th&gt;Spa&lt;/th&gt;
&lt;th&gt;Spd&lt;/th&gt;
&lt;th&gt;...&lt;/th&gt;
&lt;th&gt;Against Bug&lt;/th&gt;
&lt;th&gt;Against Rock&lt;/th&gt;
&lt;th&gt;Against Ghost&lt;/th&gt;
&lt;th&gt;Against Dragon&lt;/th&gt;
&lt;th&gt;Against Dark&lt;/th&gt;
&lt;th&gt;Against Steel&lt;/th&gt;
&lt;th&gt;Against Fairy&lt;/th&gt;
&lt;th&gt;Height&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;th&gt;BMI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1027&lt;/td&gt;
&lt;td&gt;896&lt;/td&gt;
&lt;td&gt;Glastrier&lt;/td&gt;
&lt;td&gt;Ice&lt;/td&gt;
&lt;td&gt;NaN&lt;/td&gt;
&lt;td&gt;['Chilling Neigh']&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;145&lt;/td&gt;
&lt;td&gt;130&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2.2&lt;/td&gt;
&lt;td&gt;800.0&lt;/td&gt;
&lt;td&gt;165.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1028&lt;/td&gt;
&lt;td&gt;897&lt;/td&gt;
&lt;td&gt;Spectrier&lt;/td&gt;
&lt;td&gt;Ghost&lt;/td&gt;
&lt;td&gt;NaN&lt;/td&gt;
&lt;td&gt;['Grim Neigh']&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;145&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;44.5&lt;/td&gt;
&lt;td&gt;11.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1029&lt;/td&gt;
&lt;td&gt;898&lt;/td&gt;
&lt;td&gt;Calyrex&lt;/td&gt;
&lt;td&gt;Psychic&lt;/td&gt;
&lt;td&gt;Grass&lt;/td&gt;
&lt;td&gt;['Unnerve']&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;4.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.1&lt;/td&gt;
&lt;td&gt;7.7&lt;/td&gt;
&lt;td&gt;6.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1030&lt;/td&gt;
&lt;td&gt;898&lt;/td&gt;
&lt;td&gt;Calyrex Ice Rider&lt;/td&gt;
&lt;td&gt;Psychic&lt;/td&gt;
&lt;td&gt;Ice&lt;/td&gt;
&lt;td&gt;['As One']&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;165&lt;/td&gt;
&lt;td&gt;150&lt;/td&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;td&gt;130&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2.4&lt;/td&gt;
&lt;td&gt;809.1&lt;/td&gt;
&lt;td&gt;140.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1031&lt;/td&gt;
&lt;td&gt;898&lt;/td&gt;
&lt;td&gt;Calyrex Shadow Rider&lt;/td&gt;
&lt;td&gt;Psychic&lt;/td&gt;
&lt;td&gt;Ghost&lt;/td&gt;
&lt;td&gt;['As One']&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;165&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;4.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;4.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2.4&lt;/td&gt;
&lt;td&gt;53.6&lt;/td&gt;
&lt;td&gt;9.3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;5 rows × 44 columns&lt;/p&gt;

&lt;h4&gt;&lt;code&gt;sample()&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;Enquanto &lt;code&gt;head()&lt;/code&gt; e &lt;code&gt;tail()&lt;/code&gt; mostra o início e o fim do conjunto de dados, o &lt;code&gt;sample()&lt;/code&gt; traz linhas aleatórias do conjunto, o que pode ser bem interessante.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb9-1"&gt;pokemons.sample(&lt;span&gt;5&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Number&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type 1&lt;/th&gt;
&lt;th&gt;Type 2&lt;/th&gt;
&lt;th&gt;Abilities&lt;/th&gt;
&lt;th&gt;HP&lt;/th&gt;
&lt;th&gt;Att&lt;/th&gt;
&lt;th&gt;Def&lt;/th&gt;
&lt;th&gt;Spa&lt;/th&gt;
&lt;th&gt;Spd&lt;/th&gt;
&lt;th&gt;...&lt;/th&gt;
&lt;th&gt;Against Bug&lt;/th&gt;
&lt;th&gt;Against Rock&lt;/th&gt;
&lt;th&gt;Against Ghost&lt;/th&gt;
&lt;th&gt;Against Dragon&lt;/th&gt;
&lt;th&gt;Against Dark&lt;/th&gt;
&lt;th&gt;Against Steel&lt;/th&gt;
&lt;th&gt;Against Fairy&lt;/th&gt;
&lt;th&gt;Height&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;th&gt;BMI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;519&lt;/td&gt;
&lt;td&gt;438&lt;/td&gt;
&lt;td&gt;Bonsly&lt;/td&gt;
&lt;td&gt;Rock&lt;/td&gt;
&lt;td&gt;NaN&lt;/td&gt;
&lt;td&gt;['Rattled', 'Rock Head', 'Sturdy']&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;95&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;15.0&lt;/td&gt;
&lt;td&gt;60.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;635&lt;/td&gt;
&lt;td&gt;542&lt;/td&gt;
&lt;td&gt;Leavanny&lt;/td&gt;
&lt;td&gt;Bug&lt;/td&gt;
&lt;td&gt;Grass&lt;/td&gt;
&lt;td&gt;['Chlorophyll', 'Overcoat', 'Swarm']&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.2&lt;/td&gt;
&lt;td&gt;20.5&lt;/td&gt;
&lt;td&gt;14.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;405&lt;/td&gt;
&lt;td&gt;340&lt;/td&gt;
&lt;td&gt;Whiscash&lt;/td&gt;
&lt;td&gt;Water&lt;/td&gt;
&lt;td&gt;Ground&lt;/td&gt;
&lt;td&gt;['Anticipation', 'Hydration', 'Oblivious']&lt;/td&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;td&gt;73&lt;/td&gt;
&lt;td&gt;76&lt;/td&gt;
&lt;td&gt;71&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.9&lt;/td&gt;
&lt;td&gt;23.6&lt;/td&gt;
&lt;td&gt;29.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;502&lt;/td&gt;
&lt;td&gt;422&lt;/td&gt;
&lt;td&gt;Shellos&lt;/td&gt;
&lt;td&gt;Water&lt;/td&gt;
&lt;td&gt;NaN&lt;/td&gt;
&lt;td&gt;['Sand Force', 'Sticky Hold', 'Storm Drain']&lt;/td&gt;
&lt;td&gt;76&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.3&lt;/td&gt;
&lt;td&gt;6.3&lt;/td&gt;
&lt;td&gt;70.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;976&lt;/td&gt;
&lt;td&gt;849&lt;/td&gt;
&lt;td&gt;Toxtricity&lt;/td&gt;
&lt;td&gt;Electric&lt;/td&gt;
&lt;td&gt;Poison&lt;/td&gt;
&lt;td&gt;['Plus', 'Punk Rock', 'Technician']&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;td&gt;98&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;114&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;1.6&lt;/td&gt;
&lt;td&gt;40.0&lt;/td&gt;
&lt;td&gt;15.6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;5 rows × 44 columns&lt;/p&gt;

&lt;h4&gt;&lt;code&gt;describe()&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;Esta função nos ajuda a ter uma idéia dos valores que temos em nosso conjunto de dados. A função lista todas as colunas numéricas e apresenta os resultados para os seguintes cálculos estatísticos: média, desvio padrão, valor mínimo, percentil 25%, 50%, 75% e valor máximo.&lt;/p&gt;

&lt;p&gt;Isso nos dá uma idéia da variabilidade dos nossos dados, bem como permite uma análise de correlação superficial entre os valores numéricos.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb10-1"&gt;pokemons.describe()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Number&lt;/th&gt;
&lt;th&gt;HP&lt;/th&gt;
&lt;th&gt;Att&lt;/th&gt;
&lt;th&gt;Def&lt;/th&gt;
&lt;th&gt;Spa&lt;/th&gt;
&lt;th&gt;Spd&lt;/th&gt;
&lt;th&gt;Spe&lt;/th&gt;
&lt;th&gt;BST&lt;/th&gt;
&lt;th&gt;Mean&lt;/th&gt;
&lt;th&gt;Standard Deviation&lt;/th&gt;
&lt;th&gt;...&lt;/th&gt;
&lt;th&gt;Against Bug&lt;/th&gt;
&lt;th&gt;Against Rock&lt;/th&gt;
&lt;th&gt;Against Ghost&lt;/th&gt;
&lt;th&gt;Against Dragon&lt;/th&gt;
&lt;th&gt;Against Dark&lt;/th&gt;
&lt;th&gt;Against Steel&lt;/th&gt;
&lt;th&gt;Against Fairy&lt;/th&gt;
&lt;th&gt;Height&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;th&gt;BMI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;count&lt;/td&gt;
&lt;td&gt;1032.000000&lt;/td&gt;
&lt;td&gt;1032.000000&lt;/td&gt;
&lt;td&gt;1032.000000&lt;/td&gt;
&lt;td&gt;1032.000000&lt;/td&gt;
&lt;td&gt;1032.000000&lt;/td&gt;
&lt;td&gt;1032.000000&lt;/td&gt;
&lt;td&gt;1032.000000&lt;/td&gt;
&lt;td&gt;1032.000000&lt;/td&gt;
&lt;td&gt;1032.000000&lt;/td&gt;
&lt;td&gt;1032.000000&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;1032.000000&lt;/td&gt;
&lt;td&gt;1032.000000&lt;/td&gt;
&lt;td&gt;1032.000000&lt;/td&gt;
&lt;td&gt;1032.000000&lt;/td&gt;
&lt;td&gt;1032.000000&lt;/td&gt;
&lt;td&gt;1032.000000&lt;/td&gt;
&lt;td&gt;1032.000000&lt;/td&gt;
&lt;td&gt;1032.000000&lt;/td&gt;
&lt;td&gt;1032.000000&lt;/td&gt;
&lt;td&gt;1032.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mean&lt;/td&gt;
&lt;td&gt;439.226744&lt;/td&gt;
&lt;td&gt;69.906008&lt;/td&gt;
&lt;td&gt;80.526163&lt;/td&gt;
&lt;td&gt;74.609496&lt;/td&gt;
&lt;td&gt;72.918605&lt;/td&gt;
&lt;td&gt;72.139535&lt;/td&gt;
&lt;td&gt;68.548450&lt;/td&gt;
&lt;td&gt;438.648256&lt;/td&gt;
&lt;td&gt;73.108043&lt;/td&gt;
&lt;td&gt;20.028104&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;1.002180&lt;/td&gt;
&lt;td&gt;1.239826&lt;/td&gt;
&lt;td&gt;1.025678&lt;/td&gt;
&lt;td&gt;0.974806&lt;/td&gt;
&lt;td&gt;1.074855&lt;/td&gt;
&lt;td&gt;0.992006&lt;/td&gt;
&lt;td&gt;1.094234&lt;/td&gt;
&lt;td&gt;1.286822&lt;/td&gt;
&lt;td&gt;71.879845&lt;/td&gt;
&lt;td&gt;136.735756&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;std&lt;/td&gt;
&lt;td&gt;261.871350&lt;/td&gt;
&lt;td&gt;26.189155&lt;/td&gt;
&lt;td&gt;32.542374&lt;/td&gt;
&lt;td&gt;30.905972&lt;/td&gt;
&lt;td&gt;32.773495&lt;/td&gt;
&lt;td&gt;27.625876&lt;/td&gt;
&lt;td&gt;30.219526&lt;/td&gt;
&lt;td&gt;120.675545&lt;/td&gt;
&lt;td&gt;20.112591&lt;/td&gt;
&lt;td&gt;10.830298&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;0.613111&lt;/td&gt;
&lt;td&gt;0.699361&lt;/td&gt;
&lt;td&gt;0.577269&lt;/td&gt;
&lt;td&gt;0.378040&lt;/td&gt;
&lt;td&gt;0.475292&lt;/td&gt;
&lt;td&gt;0.511859&lt;/td&gt;
&lt;td&gt;0.535159&lt;/td&gt;
&lt;td&gt;1.391501&lt;/td&gt;
&lt;td&gt;132.872741&lt;/td&gt;
&lt;td&gt;3111.666658&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;min&lt;/td&gt;
&lt;td&gt;1.000000&lt;/td&gt;
&lt;td&gt;1.000000&lt;/td&gt;
&lt;td&gt;5.000000&lt;/td&gt;
&lt;td&gt;5.000000&lt;/td&gt;
&lt;td&gt;10.000000&lt;/td&gt;
&lt;td&gt;20.000000&lt;/td&gt;
&lt;td&gt;5.000000&lt;/td&gt;
&lt;td&gt;175.000000&lt;/td&gt;
&lt;td&gt;29.166667&lt;/td&gt;
&lt;td&gt;0.000000&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;0.250000&lt;/td&gt;
&lt;td&gt;0.250000&lt;/td&gt;
&lt;td&gt;0.000000&lt;/td&gt;
&lt;td&gt;0.000000&lt;/td&gt;
&lt;td&gt;0.250000&lt;/td&gt;
&lt;td&gt;0.250000&lt;/td&gt;
&lt;td&gt;0.250000&lt;/td&gt;
&lt;td&gt;0.100000&lt;/td&gt;
&lt;td&gt;0.100000&lt;/td&gt;
&lt;td&gt;0.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;td&gt;211.750000&lt;/td&gt;
&lt;td&gt;50.000000&lt;/td&gt;
&lt;td&gt;55.000000&lt;/td&gt;
&lt;td&gt;50.000000&lt;/td&gt;
&lt;td&gt;50.000000&lt;/td&gt;
&lt;td&gt;50.000000&lt;/td&gt;
&lt;td&gt;45.000000&lt;/td&gt;
&lt;td&gt;330.000000&lt;/td&gt;
&lt;td&gt;55.000000&lt;/td&gt;
&lt;td&gt;12.801910&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;0.500000&lt;/td&gt;
&lt;td&gt;1.000000&lt;/td&gt;
&lt;td&gt;1.000000&lt;/td&gt;
&lt;td&gt;1.000000&lt;/td&gt;
&lt;td&gt;1.000000&lt;/td&gt;
&lt;td&gt;0.500000&lt;/td&gt;
&lt;td&gt;1.000000&lt;/td&gt;
&lt;td&gt;0.600000&lt;/td&gt;
&lt;td&gt;9.000000&lt;/td&gt;
&lt;td&gt;18.600000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;td&gt;434.500000&lt;/td&gt;
&lt;td&gt;67.000000&lt;/td&gt;
&lt;td&gt;78.000000&lt;/td&gt;
&lt;td&gt;70.000000&lt;/td&gt;
&lt;td&gt;65.000000&lt;/td&gt;
&lt;td&gt;70.000000&lt;/td&gt;
&lt;td&gt;65.000000&lt;/td&gt;
&lt;td&gt;459.000000&lt;/td&gt;
&lt;td&gt;76.500000&lt;/td&gt;
&lt;td&gt;18.484228&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;1.000000&lt;/td&gt;
&lt;td&gt;1.000000&lt;/td&gt;
&lt;td&gt;1.000000&lt;/td&gt;
&lt;td&gt;1.000000&lt;/td&gt;
&lt;td&gt;1.000000&lt;/td&gt;
&lt;td&gt;1.000000&lt;/td&gt;
&lt;td&gt;1.000000&lt;/td&gt;
&lt;td&gt;1.000000&lt;/td&gt;
&lt;td&gt;29.750000&lt;/td&gt;
&lt;td&gt;28.350000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;75%&lt;/td&gt;
&lt;td&gt;667.250000&lt;/td&gt;
&lt;td&gt;83.000000&lt;/td&gt;
&lt;td&gt;100.000000&lt;/td&gt;
&lt;td&gt;90.000000&lt;/td&gt;
&lt;td&gt;95.000000&lt;/td&gt;
&lt;td&gt;90.000000&lt;/td&gt;
&lt;td&gt;90.000000&lt;/td&gt;
&lt;td&gt;515.000000&lt;/td&gt;
&lt;td&gt;85.833333&lt;/td&gt;
&lt;td&gt;24.835709&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;1.000000&lt;/td&gt;
&lt;td&gt;2.000000&lt;/td&gt;
&lt;td&gt;1.000000&lt;/td&gt;
&lt;td&gt;1.000000&lt;/td&gt;
&lt;td&gt;1.000000&lt;/td&gt;
&lt;td&gt;1.000000&lt;/td&gt;
&lt;td&gt;1.000000&lt;/td&gt;
&lt;td&gt;1.600000&lt;/td&gt;
&lt;td&gt;71.275000&lt;/td&gt;
&lt;td&gt;42.200000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;max&lt;/td&gt;
&lt;td&gt;898.000000&lt;/td&gt;
&lt;td&gt;255.000000&lt;/td&gt;
&lt;td&gt;190.000000&lt;/td&gt;
&lt;td&gt;230.000000&lt;/td&gt;
&lt;td&gt;194.000000&lt;/td&gt;
&lt;td&gt;230.000000&lt;/td&gt;
&lt;td&gt;200.000000&lt;/td&gt;
&lt;td&gt;780.000000&lt;/td&gt;
&lt;td&gt;130.000000&lt;/td&gt;
&lt;td&gt;103.215659&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;4.000000&lt;/td&gt;
&lt;td&gt;4.000000&lt;/td&gt;
&lt;td&gt;4.000000&lt;/td&gt;
&lt;td&gt;2.000000&lt;/td&gt;
&lt;td&gt;4.000000&lt;/td&gt;
&lt;td&gt;4.000000&lt;/td&gt;
&lt;td&gt;4.000000&lt;/td&gt;
&lt;td&gt;20.000000&lt;/td&gt;
&lt;td&gt;999.900000&lt;/td&gt;
&lt;td&gt;99990.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;8 rows × 39 columns&lt;/p&gt;

&lt;h4&gt;&lt;code&gt;info()&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;Outra função útil é a função &lt;code&gt;info()&lt;/code&gt; que traz a descrição da estrutura do DataFrame. Com esta função, você pode verificar os seguintes dados:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lista colunas do DataFrame&lt;/li&gt;
&lt;li&gt;para cada coluna, quantos elementos não-nulos ela possui&lt;/li&gt;
&lt;li&gt;para cada coluna, seu tipo&lt;/li&gt;
&lt;li&gt;E ainda o número total de linhas e colunas no DataFrame&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb11-1"&gt;pokemons.info()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;class 'pandas.core.frame.DataFrame'&amp;gt;
RangeIndex: 1032 entries, 0 to 1031
Data columns (total 44 columns):
 # Column Non-Null Count Dtype  
--- ------ -------------- -----  
 0 Number 1032 non-null int64  
 1 Name 1032 non-null object 
 2 Type 1 1032 non-null object 
 3 Type 2 548 non-null object 
 4 Abilities 1032 non-null object 
 5 HP 1032 non-null int64  
 6 Att 1032 non-null int64  
 7 Def 1032 non-null int64  
 8 Spa 1032 non-null int64  
 9 Spd 1032 non-null int64  
 10 Spe 1032 non-null int64  
 11 BST 1032 non-null int64  
 12 Mean 1032 non-null float64
 13 Standard Deviation 1032 non-null float64
 14 Generation 1032 non-null float64
 15 Experience type 1032 non-null object 
 16 Experience to level 100 1032 non-null int64  
 17 Final Evolution 1032 non-null float64
 18 Catch Rate 1032 non-null int64  
 19 Legendary 1032 non-null float64
 20 Mega Evolution 1032 non-null float64
 21 Alolan Form 1032 non-null float64
 22 Galarian Form 1032 non-null float64
 23 Against Normal 1032 non-null float64
 24 Against Fire 1032 non-null float64
 25 Against Water 1032 non-null float64
 26 Against Electric 1032 non-null float64
 27 Against Grass 1032 non-null float64
 28 Against Ice 1032 non-null float64
 29 Against Fighting 1032 non-null float64
 30 Against Poison 1032 non-null float64
 31 Against Ground 1032 non-null float64
 32 Against Flying 1032 non-null float64
 33 Against Psychic 1032 non-null float64
 34 Against Bug 1032 non-null float64
 35 Against Rock 1032 non-null float64
 36 Against Ghost 1032 non-null float64
 37 Against Dragon 1032 non-null float64
 38 Against Dark 1032 non-null float64
 39 Against Steel 1032 non-null float64
 40 Against Fairy 1032 non-null float64
 41 Height 1032 non-null float64
 42 Weight 1032 non-null float64
 43 BMI 1032 non-null float64
dtypes: float64(29), int64(10), object(5)
memory usage: 354.9+ KB&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;&lt;code&gt;shape&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;Esta não é uma função, mas sim uma propriedade, que retorna uma tupla com as dimensões de linha e coluna do DataFrame.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb13-1"&gt;pokemons.shape&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;(1032, 44)&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;Filtrando os dados&lt;/h3&gt;

&lt;p&gt;Agora vamos aprender como executar uma das tarefas mais comuns de manipular DataFrames com o objetivo de realizar análises: filtragem dos dados. A versão atual do pandas trouxe algumas funções que nos facilitam enormemente o processo. Mas, com o objetivo de equipa-los com o máximo de informação possível, vamos também aprender os métodos mais conhecidos.&lt;/p&gt;

&lt;p&gt;Mas, antes de mostrarmos como realizar os filtros, vamos explicar alguns conceitos básicos, mas bem relevantes para a operação de filtragem dos dados.&lt;/p&gt;

&lt;h4&gt;&lt;em&gt;Acessando uma coluna do DataFrame&lt;/em&gt;&lt;/h4&gt;

&lt;p&gt;Pode parecer óbvio, mas para acessar a coluna de um DataFrame, basta fazer o seguinte:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb15-1"&gt;tipos &lt;span&gt;=&lt;/span&gt; pokemons[&lt;span&gt;"Type 1"&lt;/span&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Assim, a variável tipos conterá o que chamamos de uma Series, que é um array &lt;code&gt;numpy&lt;/code&gt; (biblioteca especializada para criação de arrays numéricos) que contém todas as linhas daquela coluna. Para comprovar isso, vamos imprimir o conteúdo.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb16-1"&gt;tipos&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;0 Grass
1 Grass
2 Grass
3 Grass
4 Fire
         ...   
1027 Ice
1028 Ghost
1029 Psychic
1030 Psychic
1031 Psychic
Name: Type 1, Length: 1032, dtype: object&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Parece interessante. Mas e se quisessemos criar um novo DataFrame apenas com as colunas Number, Name e Type 1? Parece simples, basta enviar ao DataFrame um array com o nome das colunas que quero extrair.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb18-1"&gt;sub_df &lt;span&gt;=&lt;/span&gt; pokemons[[&lt;span&gt;"Number"&lt;/span&gt;, &lt;span&gt;"Name"&lt;/span&gt;, &lt;span&gt;"Type 1"&lt;/span&gt;]]&lt;/span&gt;
&lt;span id="cb18-2"&gt;&lt;/span&gt;
&lt;span id="cb18-3"&gt;sub_df&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Number&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type 1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Bulbasaur&lt;/td&gt;
&lt;td&gt;Grass&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Ivysaur&lt;/td&gt;
&lt;td&gt;Grass&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Venusaur&lt;/td&gt;
&lt;td&gt;Grass&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Mega Venusaur&lt;/td&gt;
&lt;td&gt;Grass&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Charmander&lt;/td&gt;
&lt;td&gt;Fire&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1027&lt;/td&gt;
&lt;td&gt;896&lt;/td&gt;
&lt;td&gt;Glastrier&lt;/td&gt;
&lt;td&gt;Ice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1028&lt;/td&gt;
&lt;td&gt;897&lt;/td&gt;
&lt;td&gt;Spectrier&lt;/td&gt;
&lt;td&gt;Ghost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1029&lt;/td&gt;
&lt;td&gt;898&lt;/td&gt;
&lt;td&gt;Calyrex&lt;/td&gt;
&lt;td&gt;Psychic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1030&lt;/td&gt;
&lt;td&gt;898&lt;/td&gt;
&lt;td&gt;Calyrex Ice Rider&lt;/td&gt;
&lt;td&gt;Psychic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1031&lt;/td&gt;
&lt;td&gt;898&lt;/td&gt;
&lt;td&gt;Calyrex Shadow Rider&lt;/td&gt;
&lt;td&gt;Psychic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;1032 rows × 3 columns&lt;/p&gt;

&lt;p&gt;Tip&lt;/p&gt;

&lt;p&gt;Observe a questão da sintaxe de array: quando queremos apenas uma coluna a sintaxe de array não é necessária, ela se aplica apenas a múltiplos campos.&lt;/p&gt;

&lt;p&gt;Mas, e como podemos acessar uma linha específica de um DataFrame? Se você está seguindo a linha de raciocínio, já imaginou que não é da maneira tradicional. Na verdade, é exatamente ao contrário do que estamos acostumados. Primeiro acessamos a coluna, e depois a linha, enquanto que em conjuntos de dados em formato tabular largo, primeiro acessamos a linha e depois a coluna.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb19-1"&gt;pokemons[&lt;span&gt;"Name"&lt;/span&gt;][&lt;span&gt;0&lt;/span&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;'Bulbasaur'&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;Percorrendo um DataFrame&lt;/h4&gt;

&lt;p&gt;Interessante, certo? Mas isso levanta o seguinte questionamento: quando vou manipular os dados, como filtra-los ou fazer alguma modificação? Nos conjuntos de dados mais tradicionais, eu geralmente percorro o meu conjunto de dados linha a linha e faço os filtros e então altero as colunas. Como fazer isso em pandas?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb21-1"&gt;&lt;span&gt;for&lt;/span&gt; index, pokemon &lt;span&gt;in&lt;/span&gt; pokemons.iterrows():&lt;/span&gt;
&lt;span id="cb21-2"&gt; &lt;span&gt;if&lt;/span&gt; index &lt;span&gt;&amp;lt;=&lt;/span&gt; &lt;span&gt;2&lt;/span&gt;:&lt;/span&gt;
&lt;span id="cb21-3"&gt; &lt;span&gt;print&lt;/span&gt;(pokemon[&lt;span&gt;"Name"&lt;/span&gt;])&lt;/span&gt;
&lt;span id="cb21-4"&gt; &lt;span&gt;else&lt;/span&gt;:&lt;/span&gt;
&lt;span id="cb21-5"&gt; &lt;span&gt;break&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;Bulbasaur
Ivysaur
Venusaur&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Como pode ser visto no código acima, basta usarmos a função &lt;code&gt;iterrows()&lt;/code&gt; e iremos manipular o DataFrame como uma estrutura de dados mais tradicional, como um array de dicionário de dados. No código acima, fizemos um filtro que pega apenas as linhas com index menor ou igual 2, e mostra apenas o nome. Se DataFrames fossem estruturas de dados tradicionais, isso seria a maneira mais lógica de executar esse comando. Mas com pandas, podemos fazer isso:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb23-1"&gt;pokemons[pokemons[&lt;span&gt;"Number"&lt;/span&gt;] &lt;span&gt;&amp;lt;=&lt;/span&gt; &lt;span&gt;3&lt;/span&gt;][&lt;span&gt;"Name"&lt;/span&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;0 Bulbasaur
1 Ivysaur
2 Venusaur
3 Mega Venusaur
Name: Name, dtype: object&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Wow, em uma única linha fizemos o filtro de linha e a seleção de coluna, e a principal vantagem sendo que este comando continuou retornando um DataFrame, o que ainda nos permite continuar trabalhando de forma eficiente com os dados que eu escolhi!&lt;/p&gt;

&lt;p&gt;Warning&lt;/p&gt;

&lt;p&gt;Embora a utilização da função iterrows() pareça ser a forma mais natural e fácil de se trabalhar com Dataframes Pandas, é com a certeza a que apresenta a pior performance. Então, faça um esforço e aprenda muito bem os métodos mais “pandônicos” de manipular Dataframes, Cientista de Dados!&lt;/p&gt;

&lt;p&gt;Esta linha também nos introduz ao primeiro jeito de realizar filtros de linha: adicionando a expressão lógica nos primeiros parenteses. Parece simples, embora para referenciar ao campo que será utilizado no filtro, eu ainda precise referenciar o próprio DataFrame. E esse foi apenas um filtro simples. Como seria utilizar mais de um campo no filtro? Vamos ver agora mesmo.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb25-1"&gt;pokemons[(pokemons[&lt;span&gt;"Number"&lt;/span&gt;] &lt;span&gt;&amp;lt;&lt;/span&gt; &lt;span&gt;11&lt;/span&gt;) &lt;span&gt;&amp;amp;&lt;/span&gt; (pokemons[&lt;span&gt;"Type 1"&lt;/span&gt;] &lt;span&gt;==&lt;/span&gt; &lt;span&gt;"Bug"&lt;/span&gt;)][&lt;span&gt;"Name"&lt;/span&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;13 Caterpie
Name: Name, dtype: object&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Podemos perceber duas coisas: cada condição de filtro deve estar envolta em parenteses (vá em frente, se remover, teremos um erro), e em vez de usar o conector lógico tradicional AND ou OR, utilizamos &amp;amp; (AND) ou | (OR). E quanto mais condições, pior será para lermos com clareza nosso código.&lt;/p&gt;

&lt;p&gt;Uma variação deste tipo de filtragem é a utilização da propriedade &lt;code&gt;loc&lt;/code&gt;. Ela nos permite acessar linhas diretamente, e utilizando a notação de manipulação de arrays, filtrar rapidamente o DataFrame. Vamos a um exemplo: gostaria de extrair 10 linhas do DataFrame, iniciando na linha 10.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb27-1"&gt;pokemons.loc[&lt;span&gt;10&lt;/span&gt;:&lt;span&gt;19&lt;/span&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Number&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type 1&lt;/th&gt;
&lt;th&gt;Type 2&lt;/th&gt;
&lt;th&gt;Abilities&lt;/th&gt;
&lt;th&gt;HP&lt;/th&gt;
&lt;th&gt;Att&lt;/th&gt;
&lt;th&gt;Def&lt;/th&gt;
&lt;th&gt;Spa&lt;/th&gt;
&lt;th&gt;Spd&lt;/th&gt;
&lt;th&gt;...&lt;/th&gt;
&lt;th&gt;Against Bug&lt;/th&gt;
&lt;th&gt;Against Rock&lt;/th&gt;
&lt;th&gt;Against Ghost&lt;/th&gt;
&lt;th&gt;Against Dragon&lt;/th&gt;
&lt;th&gt;Against Dark&lt;/th&gt;
&lt;th&gt;Against Steel&lt;/th&gt;
&lt;th&gt;Against Fairy&lt;/th&gt;
&lt;th&gt;Height&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;th&gt;BMI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Wartortle&lt;/td&gt;
&lt;td&gt;Water&lt;/td&gt;
&lt;td&gt;NaN&lt;/td&gt;
&lt;td&gt;['Rain Dish', 'Torrent']&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;22.5&lt;/td&gt;
&lt;td&gt;22.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Blastoise&lt;/td&gt;
&lt;td&gt;Water&lt;/td&gt;
&lt;td&gt;NaN&lt;/td&gt;
&lt;td&gt;['Rain Dish', 'Torrent']&lt;/td&gt;
&lt;td&gt;79&lt;/td&gt;
&lt;td&gt;83&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;td&gt;105&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.6&lt;/td&gt;
&lt;td&gt;85.5&lt;/td&gt;
&lt;td&gt;33.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Mega Blastoise&lt;/td&gt;
&lt;td&gt;Water&lt;/td&gt;
&lt;td&gt;NaN&lt;/td&gt;
&lt;td&gt;['Mega Launcher']&lt;/td&gt;
&lt;td&gt;79&lt;/td&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;td&gt;135&lt;/td&gt;
&lt;td&gt;115&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.6&lt;/td&gt;
&lt;td&gt;101.1&lt;/td&gt;
&lt;td&gt;39.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Caterpie&lt;/td&gt;
&lt;td&gt;Bug&lt;/td&gt;
&lt;td&gt;NaN&lt;/td&gt;
&lt;td&gt;['Run Away', 'Shield Dust']&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.3&lt;/td&gt;
&lt;td&gt;2.9&lt;/td&gt;
&lt;td&gt;32.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Metapod&lt;/td&gt;
&lt;td&gt;Bug&lt;/td&gt;
&lt;td&gt;NaN&lt;/td&gt;
&lt;td&gt;['Shed Skin']&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.7&lt;/td&gt;
&lt;td&gt;9.9&lt;/td&gt;
&lt;td&gt;20.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Butterfree&lt;/td&gt;
&lt;td&gt;Bug&lt;/td&gt;
&lt;td&gt;Flying&lt;/td&gt;
&lt;td&gt;['Tinted Lens']&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;90&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;4.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.1&lt;/td&gt;
&lt;td&gt;32.0&lt;/td&gt;
&lt;td&gt;26.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;Weedle&lt;/td&gt;
&lt;td&gt;Bug&lt;/td&gt;
&lt;td&gt;Poison&lt;/td&gt;
&lt;td&gt;['Run Away', 'Shield Dust']&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;0.3&lt;/td&gt;
&lt;td&gt;3.2&lt;/td&gt;
&lt;td&gt;35.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;Kakuna&lt;/td&gt;
&lt;td&gt;Bug&lt;/td&gt;
&lt;td&gt;Poison&lt;/td&gt;
&lt;td&gt;['Shed Skin']&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;0.6&lt;/td&gt;
&lt;td&gt;10.0&lt;/td&gt;
&lt;td&gt;27.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;Beedrill&lt;/td&gt;
&lt;td&gt;Bug&lt;/td&gt;
&lt;td&gt;Poison&lt;/td&gt;
&lt;td&gt;['Sniper', 'Swarm']&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;90&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;29.5&lt;/td&gt;
&lt;td&gt;29.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;Mega Beedrill&lt;/td&gt;
&lt;td&gt;Bug&lt;/td&gt;
&lt;td&gt;Poison&lt;/td&gt;
&lt;td&gt;['Adaptability']&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;150&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;1.4&lt;/td&gt;
&lt;td&gt;40.5&lt;/td&gt;
&lt;td&gt;20.7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;10 rows × 44 columns&lt;/p&gt;

&lt;p&gt;Bem prático. A propriedade &lt;code&gt;loc&lt;/code&gt; também pode entender o filtro anterior.&lt;/p&gt;

&lt;p&gt;E agora, a última maneira pela qual podemos realizar filtros em nossos DataFrames e a mais recomendada devido a legibilidade do código gerado: vamos utilizar a função &lt;code&gt;query()&lt;/code&gt;. Esta função permite que escrevamos filtros para o DataFrame como se o mesmo fosse um banco de dados, deixando o código mais limpo, pois eliminamos a necessidade de referenciar o DataFrame a cada filtro, bem como parênteses redundantes. Vamos ver um exemplo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb28-1"&gt;pokemons.query(&lt;span&gt;"Number &amp;lt; 11 and `Type 1` == 'Bug'"&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Number&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type 1&lt;/th&gt;
&lt;th&gt;Type 2&lt;/th&gt;
&lt;th&gt;Abilities&lt;/th&gt;
&lt;th&gt;HP&lt;/th&gt;
&lt;th&gt;Att&lt;/th&gt;
&lt;th&gt;Def&lt;/th&gt;
&lt;th&gt;Spa&lt;/th&gt;
&lt;th&gt;Spd&lt;/th&gt;
&lt;th&gt;...&lt;/th&gt;
&lt;th&gt;Against Bug&lt;/th&gt;
&lt;th&gt;Against Rock&lt;/th&gt;
&lt;th&gt;Against Ghost&lt;/th&gt;
&lt;th&gt;Against Dragon&lt;/th&gt;
&lt;th&gt;Against Dark&lt;/th&gt;
&lt;th&gt;Against Steel&lt;/th&gt;
&lt;th&gt;Against Fairy&lt;/th&gt;
&lt;th&gt;Height&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;th&gt;BMI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Caterpie&lt;/td&gt;
&lt;td&gt;Bug&lt;/td&gt;
&lt;td&gt;NaN&lt;/td&gt;
&lt;td&gt;['Run Away', 'Shield Dust']&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;0.3&lt;/td&gt;
&lt;td&gt;2.9&lt;/td&gt;
&lt;td&gt;32.2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;1 rows × 44 columns&lt;/p&gt;

&lt;p&gt;Assim ficou bem mais limpo. Uma única observação é quanto ao uso do caracter “`” para campos com nomes compostos.&lt;/p&gt;



&lt;h3&gt;Agregando os dados&lt;/h3&gt;

&lt;p&gt;Em muitos casos, não queremos apenas filtrar os dados, mas também realizar totalizações, calcular valores médios, ou até mesmo cálculos mais complexos, de dados que devem ser agregados em um ou mais níveis.&lt;/p&gt;

&lt;p&gt;Como exemplo, vamos supor que quisessemos totalizar o número de pokemons de acordo com o seu tipo.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb29-1"&gt;pokemons.groupby([&lt;span&gt;'Type 1'&lt;/span&gt;])[&lt;span&gt;"Name"&lt;/span&gt;].count().reset_index(name&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"Pokemons"&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Type 1&lt;/th&gt;
&lt;th&gt;Pokemons&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Bug&lt;/td&gt;
&lt;td&gt;81&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Dark&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Dragon&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Electric&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Fairy&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Fighting&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Fire&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Flying&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Ghost&lt;/td&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Grass&lt;/td&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Ground&lt;/td&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Ice&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Normal&lt;/td&gt;
&lt;td&gt;114&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;Poison&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;Psychic&lt;/td&gt;
&lt;td&gt;77&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;Rock&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Steel&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;Water&lt;/td&gt;
&lt;td&gt;131&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Mas quanta coisa nova naquela linha, não é mesmo? Vamos explicar passo a passo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A primeira função é o groupby, onde especificamos por qual coluna ou colunas iremos fazer o agrupamento. No nosso exemplo, utilizamos a coluna ‘Type 1’&lt;/li&gt;
&lt;li&gt;Em seguida, especificamos que, além da coluna ‘Type 1’, queremos apenas a coluna ‘Name’ nos nossos resultados&lt;/li&gt;
&lt;li&gt;Logo após, indicamos que o valor original da coluna ‘Name’ será substituído pelo resultado da contagem de quantas linhas do DataFrame tem aquele valor específico da coluna ‘Type 1’&lt;/li&gt;
&lt;li&gt;E por último, utilizamos uma função que irá trocar o nome da coluna ‘Name’ por um nome mais significativo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ufa, e tudo isso em apenas uma linha!&lt;/p&gt;

&lt;p&gt;A fórmula para a agregação é sempre a mesma: groupby() e tipo de calculo (sum, count, mean, …). Por exemplo, no código abaixo, vamos agrupar também pela geração.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb30-1"&gt;pokemons.groupby([&lt;span&gt;'Generation'&lt;/span&gt;, &lt;span&gt;'Type 1'&lt;/span&gt;])[&lt;span&gt;'Name'&lt;/span&gt;].count().reset_index(name&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Pokemons'&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Generation&lt;/th&gt;
&lt;th&gt;Type 1&lt;/th&gt;
&lt;th&gt;Pokemons&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;Bug&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;Dragon&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;Electric&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;Fairy&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;Fighting&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;129&lt;/td&gt;
&lt;td&gt;8.0&lt;/td&gt;
&lt;td&gt;Poison&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;130&lt;/td&gt;
&lt;td&gt;8.0&lt;/td&gt;
&lt;td&gt;Psychic&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;131&lt;/td&gt;
&lt;td&gt;8.0&lt;/td&gt;
&lt;td&gt;Rock&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;132&lt;/td&gt;
&lt;td&gt;8.0&lt;/td&gt;
&lt;td&gt;Steel&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;133&lt;/td&gt;
&lt;td&gt;8.0&lt;/td&gt;
&lt;td&gt;Water&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;134 rows × 3 columns&lt;/p&gt;

&lt;p&gt;E se quisermos saber a média de pontos de vida por geração de pokemon? Parece simples…&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb31-1"&gt;pokemons.groupby([&lt;span&gt;'Generation'&lt;/span&gt;])[&lt;span&gt;'HP'&lt;/span&gt;].mean().reset_index(name&lt;span&gt;=&lt;/span&gt;&lt;span&gt;'Average HP'&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Generation&lt;/th&gt;
&lt;th&gt;Average HP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;64.211921&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;70.980000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3.0&lt;/td&gt;
&lt;td&gt;65.326087&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;4.0&lt;/td&gt;
&lt;td&gt;72.775862&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;5.0&lt;/td&gt;
&lt;td&gt;71.601227&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;6.0&lt;/td&gt;
&lt;td&gt;73.323308&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;7.0&lt;/td&gt;
&lt;td&gt;69.793103&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;8.0&lt;/td&gt;
&lt;td&gt;72.808696&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;h2&gt;Encerrando&lt;/h2&gt;

&lt;p&gt;Neste artigo, conhecemos um pouco mais a respeito da biblioteca Pandas e como ela pode nos ajudar a carregar e analisar conjuntos de dados que podem ser utilizados em nossas visualizações, de forma simplificada e eficiente.&lt;/p&gt;

&lt;p&gt;Dentro do processo de utilização de Pandas, aprendemos as executar as principais tarefas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;aprender sobre os metadados do conjunto de dados, utilizando: describe, info e shape&lt;/li&gt;
&lt;li&gt;listar conteúdo com head, tail, sample e iterrows&lt;/li&gt;
&lt;li&gt;acessar células diretamente&lt;/li&gt;
&lt;li&gt;realizar filtros em cima do DataFrame utilizando o método colunar, utilizando loc ou utilizando a função query&lt;/li&gt;
&lt;li&gt;agregar os dados para sumarizar a informação e facilitar a análise.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se você quiser saber mais sobre Pandas, eis aqui alguns links que podem ajudar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pandas.pydata.org/docs/#" rel="noopener noreferrer"&gt;Pandas - Documentação Oficial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3schools.com/python/pandas/default.asp" rel="noopener noreferrer"&gt;Tutorial Pandas - W3 Schools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kaggle.com/learn/pandas" rel="noopener noreferrer"&gt;Tutorial Pandas - Kaggle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hashtagtreinamentos.com/introducao-pandas-python?gclid=Cj0KCQjwk7ugBhDIARIsAGuvgPbJfKDsQ2lVfj8ndsjjYq81gRiEuGbzVacfpmT03P6BhDCQVFX1EYAaAo2FEALw_wcB" rel="noopener noreferrer"&gt;Vídeo sobre Pandas - Hashtag Treinamentos&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Um abraço e até a próxima,&lt;/p&gt;

&lt;p&gt;Walter.&lt;/p&gt;



</description>
      <category>visualização</category>
      <category>pandas</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Parte 03 - Formatos de Dados</title>
      <dc:creator>Walter R P Cortes</dc:creator>
      <pubDate>Sun, 05 Feb 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/wpcortes75/parte-03-formatos-de-dados-371h</link>
      <guid>https://dev.to/wpcortes75/parte-03-formatos-de-dados-371h</guid>
      <description>&lt;p&gt;Olá Devs!&lt;/p&gt;

&lt;p&gt;Neste artigo, vamos aprender um pouco mais sobre os formatos utilizados para armazenar os dados que nossas visualizações irão consumir.&lt;/p&gt;

&lt;h3&gt;Fontes de dados e seus formatos&lt;/h3&gt;

&lt;p&gt;Para realizarmos nossas tarefas como Cientistas de Dados, é necessário que acessemos aquilo que nos é mais caro, o nosso combustível: os dados.&lt;/p&gt;

&lt;p&gt;Estes dados vem das mais diversas fontes: websites, dispositivos IoT, bancos de dados, documentos, … Estas diferentes fontes significam que os dados possuem diferentes formatos, e uma de nossas tarefas é transformar este dado em um formato com o qual seja possível trabalhar e gerar os resultados esperados.&lt;/p&gt;

&lt;p&gt;Dentro da área de Ciência da Computação, o formato mais utilizado para servir como base para o processamento de informação é o formato tabular.&lt;/p&gt;

&lt;h4&gt;Formato Tabular&lt;/h4&gt;

&lt;p&gt;O formato tabular é utilizado para descrever uma estrutura de dados organizada em linhas e colunas, formando uma tabela. É um formato muito utilizado em bancos de dados relacionais e em arquivos CSV (Comma-Separated Values), onde cada linha representa um registro ou observação e cada coluna representa uma variável ou campo. Esse formato é muito útil para representar dados estruturados de forma clara e organizada, permitindo a fácil manipulação e análise dos dados.&lt;/p&gt;

&lt;p&gt;Abaixo, temos um exemplo prático de como podemos utilizar Python para carregar um arquivo CSV em nosso notebook.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb1-1"&gt;&lt;span&gt;import&lt;/span&gt; csv&lt;/span&gt;
&lt;span id="cb1-2"&gt;&lt;/span&gt;
&lt;span id="cb1-3"&gt;&lt;span&gt;# Abre o arquivo CSV em modo leitura&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb1-4"&gt;&lt;span&gt;with&lt;/span&gt; &lt;span&gt;open&lt;/span&gt;(&lt;span&gt;'exemplo.csv'&lt;/span&gt;, &lt;span&gt;'r'&lt;/span&gt;) &lt;span&gt;as&lt;/span&gt; arquivo_csv:&lt;/span&gt;
&lt;span id="cb1-5"&gt; &lt;span&gt;# Cria um objeto para ler o arquivo CSV&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb1-6"&gt; leitor_csv &lt;span&gt;=&lt;/span&gt; csv.reader(arquivo_csv, delimiter&lt;span&gt;=&lt;/span&gt;&lt;span&gt;','&lt;/span&gt;)&lt;/span&gt;
&lt;span id="cb1-7"&gt;&lt;/span&gt;
&lt;span id="cb1-8"&gt; &lt;span&gt;# Percorre as linhas do arquivo CSV&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb1-9"&gt; &lt;span&gt;for&lt;/span&gt; linha &lt;span&gt;in&lt;/span&gt; leitor_csv:&lt;/span&gt;
&lt;span id="cb1-10"&gt; &lt;span&gt;print&lt;/span&gt;(linha)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;['Nome', 'Idade', 'Cidade']
['Maria', '25', 'São Paulo']
['João', '30', 'Rio de Janeiro']
['Ana', '20', 'Belo Horizonte']
['Andre', '23', 'Porto Alegre']&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Neste exemplo, utilizamos a função open para abrir o arquivo CSV em modo leitura e, em seguida, criamos um objeto csv.reader para ler o arquivo CSV. Utilizamos o parâmetro delimiter para indicar o caractere separador utilizado no arquivo CSV (no caso, a vírgula). Em seguida, utilizamos um loop for para percorrer as linhas do arquivo CSV e imprimir cada uma delas na tela.&lt;/p&gt;

&lt;p&gt;Note que, neste exemplo, o resultado é uma lista de listas, onde cada lista interna representa uma linha do arquivo CSV. Para manipular os dados, é necessário fazer a conversão manualmente para o formato desejado.&lt;/p&gt;

&lt;p&gt;E, apesar deste formato ser adequado ao processamento dos dados para visualização, ainda precisamos fazer alguns ajustes até chegar ao formato ideal.&lt;/p&gt;



&lt;h3&gt;Otimizando o Formato Tabular&lt;/h3&gt;

&lt;p&gt;O formato tabular padrão também pode ser referenciado pelo termo ‘Formato Largo’ (Wide format em inglês), por sua característica de organização em linhas e colunas, com a linha sendo uma observação e as colunas sendo as variáveis da observação. Isto pode ser percebido pelo formato que nossos código percorrem os arquivos ou selecionam a informação de um banco de dados: sempre pensando em extrair linhas que depois são usadas em algum tipo de processamento. Isso gera o que chamamos de overhead no processamento, porque por vezes precisamos apenas fazer o processamento de uma coluna de dados, mas somos obrigados a acessar todas as colunas para depois selecionar a coluna que queremos.&lt;/p&gt;

&lt;p&gt;Para resolver essa questão, foi criado um caso especial de formato tabular, o chamado ‘Formato Longo’ (Long format em inglês), onde a orientação da organização dos dados é colunas e linhas, ou seja, podemos acessar uma coluna individualmente, com todas as suas linhas.&lt;/p&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-103%2Fdf_long_x_wide_form.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.wvcode.com.br%2Fposts%2Fdata-103%2Fdf_long_x_wide_form.png" width="633" height="436"&gt;&lt;/a&gt;&lt;/p&gt;
Formato Longo X Formato Largo



&lt;p&gt;Em Python e em muitas outras linguagens de programação que são utilizadas para Ciência de Dados, o formato tabular é representado por estruturas de dados especiais, chamadas de &lt;code&gt;DataFrames&lt;/code&gt; e &lt;code&gt;Series&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Mas antes de explicar em mais detalhes essas estruturas, vamos conhecer um pouco das suas origens.&lt;/p&gt;



&lt;h3&gt;Dicionários e Listas&lt;/h3&gt;

&lt;p&gt;Se você já conhece o básico de Python, já aprendeu que temos os tipos de dados conhecidos como listas e dicionário de dados. Com estes tipos, podemos representar dados mais complexos, como uma sequência ou um objeto, que são compostos de vários tipos simples. Se você quiser aprender mais sobre listas e dicionários, vá para o final deste notebook.&lt;/p&gt;

&lt;p&gt;Em Python, a representação de dados no formato tabular, seja longo ou largo, passa pela combinação destes dois tipos de dados.&lt;/p&gt;

&lt;h4&gt;Representação em Python do Formato Largo&lt;/h4&gt;

&lt;p&gt;Para criar um objeto em Python que represente um conjunto de dados no Formato Largo, é necessário montar uma lista de dicionários.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb3-1"&gt;dados_largos &lt;span&gt;=&lt;/span&gt; [&lt;/span&gt;
&lt;span id="cb3-2"&gt; {&lt;span&gt;"codigo"&lt;/span&gt;: &lt;span&gt;1&lt;/span&gt;, &lt;span&gt;"nome"&lt;/span&gt;: &lt;span&gt;"Jose"&lt;/span&gt;},&lt;/span&gt;
&lt;span id="cb3-3"&gt; {&lt;span&gt;"codigo"&lt;/span&gt;: &lt;span&gt;2&lt;/span&gt;, &lt;span&gt;"nome"&lt;/span&gt;: &lt;span&gt;"Maria"&lt;/span&gt;},&lt;/span&gt;
&lt;span id="cb3-4"&gt; {&lt;span&gt;"codigo"&lt;/span&gt;: &lt;span&gt;3&lt;/span&gt;, &lt;span&gt;"nome"&lt;/span&gt;: &lt;span&gt;"Fernandez"&lt;/span&gt;}&lt;/span&gt;
&lt;span id="cb3-5"&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Neste objeto, temos uma lista que contém 3 elementos. Cada elemento é um dicionário com dois campos. Conforme explicamos anteriormente, no formato largo, para acessar o nome de uma pessoa, precisamos identificar em que linha ela está. Para identificar a linha, percorremos nossa lista. Para inspecionar o nome, recuperamos todo o dicionário que está naquela posição da lista.&lt;/p&gt;

&lt;h4&gt;Representação em Python do Formato Longo&lt;/h4&gt;

&lt;p&gt;Para criar um objeto em Python que represente um conjunto de dados no Formato Longo, é necessário montar um dicionário de listas.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb4-1"&gt;dados_longos &lt;span&gt;=&lt;/span&gt; {&lt;/span&gt;
&lt;span id="cb4-2"&gt; &lt;span&gt;"codigo"&lt;/span&gt;: [&lt;span&gt;1&lt;/span&gt;,&lt;span&gt;2&lt;/span&gt;,&lt;span&gt;3&lt;/span&gt;], &lt;/span&gt;
&lt;span id="cb4-3"&gt; &lt;span&gt;"nome"&lt;/span&gt;: [&lt;span&gt;"Jose"&lt;/span&gt;,&lt;span&gt;"Maria"&lt;/span&gt;,&lt;span&gt;"Fernandez"&lt;/span&gt;]&lt;/span&gt;
&lt;span id="cb4-4"&gt; }&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Neste objeto, temos o dicionário com seus campos, e cada campo é uma lista com os valores para cada linha.&lt;/p&gt;

&lt;h4&gt;Entendendo a diferença&lt;/h4&gt;

&lt;p&gt;Vamos ver um exemplo prático para entender a diferença entre os dois. Acompanhe no código abaixo e leia os comentários.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb5-1"&gt;&lt;span&gt;# Queremos saber o nome do usuário que está na segunda linha do nosso conjunto de dados.&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-2"&gt;&lt;/span&gt;
&lt;span id="cb5-3"&gt;&lt;span&gt;# Formato largo&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-4"&gt;&lt;span&gt;print&lt;/span&gt;(dados_largos[&lt;span&gt;1&lt;/span&gt;][&lt;span&gt;"nome"&lt;/span&gt;]) &lt;span&gt;# utilizamos o indice 1 porque em Python listas começam no indice 0&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-5"&gt;&lt;/span&gt;
&lt;span id="cb5-6"&gt;&lt;span&gt;# Formato longo&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb5-7"&gt;&lt;span&gt;print&lt;/span&gt;(dados_longos[&lt;span&gt;"nome"&lt;/span&gt;][&lt;span&gt;1&lt;/span&gt;]) &lt;span&gt;# apenas invertemos a referência - primeiro a coluna, depois a linha&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;Maria
Maria&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A diferença parece pouca, certo? Apenas invertemos como os indices são acessados, onde está a tal otimização?&lt;/p&gt;

&lt;p&gt;A otimização está no fato de que, ao acessar a linha de um dado no formato largo, estamos acessando todas as colunas de informação daquela linha.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb7-1"&gt;&lt;span&gt;print&lt;/span&gt;(dados_largos[&lt;span&gt;1&lt;/span&gt;])&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;{'codigo': 2, 'nome': 'Maria'}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Já no formato longo, antes de especificar a linha, eu preciso referenciar a coluna, portanto, sempre terei apenas um valor.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb9-1"&gt;&lt;span&gt;print&lt;/span&gt;(dados_longos[&lt;span&gt;"nome"&lt;/span&gt;][&lt;span&gt;1&lt;/span&gt;])&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;Maria&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;DataFrames e Series&lt;/h3&gt;

&lt;p&gt;O DataFrame e as Series são dois dos principais conceitos utilizados para trabalhar com dados em Python. Ambos estão presentes na biblioteca Pandas, que é uma das ferramentas mais usadas para análise de dados.&lt;/p&gt;

&lt;p&gt;O DataFrame é um objeto que tem como base o conceito de dicionário de listas, onde as listas são representadas por Series. O DataFrame adiciona uma série de funcionalidades ao dicionário de listas, simplificando a manipulação dos mesmos.&lt;/p&gt;

&lt;p&gt;Exemplo de código:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb11-1"&gt;&lt;span&gt;import&lt;/span&gt; pandas &lt;span&gt;as&lt;/span&gt; pd &lt;/span&gt;
&lt;span id="cb11-2"&gt;df &lt;span&gt;=&lt;/span&gt; pd.DataFrame([[&lt;span&gt;1&lt;/span&gt;, &lt;span&gt;2&lt;/span&gt;, &lt;span&gt;3&lt;/span&gt;], [&lt;span&gt;4&lt;/span&gt;, &lt;span&gt;5&lt;/span&gt;, &lt;span&gt;6&lt;/span&gt;], [&lt;span&gt;7&lt;/span&gt;, &lt;span&gt;8&lt;/span&gt;, &lt;span&gt;9&lt;/span&gt;]]) &lt;/span&gt;
&lt;span id="cb11-3"&gt;&lt;span&gt;print&lt;/span&gt;(df[&lt;span&gt;2&lt;/span&gt;][&lt;span&gt;2&lt;/span&gt;])&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;9&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;A Series é uma lista com superpoderes. Assim como o DataFrame, a Series acrescenta muitas facilidades para manipular a lista. Exemplo de código:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span id="cb13-1"&gt;&lt;span&gt;import&lt;/span&gt; pandas &lt;span&gt;as&lt;/span&gt; pd &lt;/span&gt;
&lt;span id="cb13-2"&gt;s &lt;span&gt;=&lt;/span&gt; pd.Series([&lt;span&gt;1&lt;/span&gt;, &lt;span&gt;2&lt;/span&gt;, &lt;span&gt;3&lt;/span&gt;]) &lt;/span&gt;
&lt;span id="cb13-3"&gt;&lt;span&gt;print&lt;/span&gt;(s[&lt;span&gt;2&lt;/span&gt;])&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;3&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Além do Pandas existem outras bibliotecas que utilizam esses conceitos para trabalhar com dados como NumPy (Numerical Python), SciPy (Scientific Python) e Scikit-learn (Machine Learning).&lt;/p&gt;



&lt;h3&gt;Finalizando&lt;/h3&gt;

&lt;p&gt;Neste artigo, aprendemos sobre os formatos de dados que podemos utilizar em nossas visualizações e conhecemos mais detalhes dos DataFrames e Series.&lt;/p&gt;

&lt;p&gt;Aqui temos alguns links sobre o assunto: - &lt;a href="https://docs.python.org/3/library/stdtypes.html#list" rel="noopener noreferrer"&gt;Listas&lt;/a&gt; - &lt;a href="https://docs.python.org/3/library/stdtypes.html#mapping-types-dict" rel="noopener noreferrer"&gt;Dicionários&lt;/a&gt;&lt;/p&gt;



</description>
      <category>visualização</category>
      <category>python</category>
      <category>dados</category>
      <category>ptbr</category>
    </item>
  </channel>
</rss>
