<?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: Lis Barreto</title>
    <description>The latest articles on DEV Community by Lis Barreto (@lisrbarreto).</description>
    <link>https://dev.to/lisrbarreto</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%2F624477%2F42f3fd30-44dc-4cba-9386-bffd9021f9fa.jpeg</url>
      <title>DEV Community: Lis Barreto</title>
      <link>https://dev.to/lisrbarreto</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lisrbarreto"/>
    <language>en</language>
    <item>
      <title>Jovyans Just Wanna Have Fun: Trabalhando com Jupyter Notebooks, Optuna e MLFlow em Ambiente Conteinerizado</title>
      <dc:creator>Lis Barreto</dc:creator>
      <pubDate>Mon, 09 Jun 2025 12:31:06 +0000</pubDate>
      <link>https://dev.to/lisrbarreto/jovyans-just-wanna-have-fun-trabalhando-com-jupyter-notebooks-optuna-e-mlflow-em-ambiente-p1c</link>
      <guid>https://dev.to/lisrbarreto/jovyans-just-wanna-have-fun-trabalhando-com-jupyter-notebooks-optuna-e-mlflow-em-ambiente-p1c</guid>
      <description>&lt;p&gt;No melhor dos mundos, sempre estamos gerenciando nossos projetos pessoais em ambientes virtuais (salve o bom e velho venv rs), com gerenciadores como Poetry e UV. No entanto, de vez em quando, precisamos ir além.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Funf7t1se3jouiic7odi1.gif" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Funf7t1se3jouiic7odi1.gif" alt="Futurama" width="498" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O Desafio
&lt;/h2&gt;

&lt;p&gt;Quando queremos expor diferentes serviços em algumas portas, pode ficar difícil gerenciar tantas abas no terminal Linux. Como resolver essa situação? A resposta é simples e direta: &lt;strong&gt;com Docker!&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Imagens Docker para Jupyter
&lt;/h3&gt;

&lt;p&gt;Hoje é dia é possível encontrar imagens Docker oficiais para o Jupyter, que podem ser encontradas &lt;a href="https://jupyter-docker-stacks.readthedocs.io/en/latest/using/selecting.html" rel="noopener noreferrer"&gt;através desse link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neste tutorial, usaremos a versão da imagem para SciPy, adicionando alguns ingredientes extras como Optuna e MLFlow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Estrutura do Diretório
&lt;/h2&gt;

&lt;p&gt;Antes de começarmos, vamos criar a estrutura de diretório necessária. Abaixo está como ficará a árvore de diretórios:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;projeto/
├── notebooks/
├── requirements.txt
├── start.sh
└── Dockerfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configurações Extra do Contêiner
&lt;/h2&gt;

&lt;p&gt;Para temperar o contêiner ao seu gosto, você precisará dos seguintes arquivos:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;requirements.txt&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Este arquivo contém as bibliotecas que você deseja instalar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;xgboost&lt;/span&gt;
&lt;span class="n"&gt;lightgbm&lt;/span&gt;
&lt;span class="n"&gt;catboost&lt;/span&gt;
&lt;span class="n"&gt;optuna&lt;/span&gt;
&lt;span class="n"&gt;mlflow&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;code&gt;start.sh&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Um script para iniciar os serviços necessários:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

mlflow ui &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt; 5000 &amp;amp;

jupyter lab &lt;span class="nt"&gt;--ip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8888 &lt;span class="nt"&gt;--no-browser&lt;/span&gt; &lt;span class="nt"&gt;--allow-root&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. &lt;code&gt;Dockerfile&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;O arquivo Dockerfile que define como construir a imagem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;FROM jupyter/scipy-notebook:latest

COPY start.sh /home/jovyan/start.sh
COPY requirements.txt &lt;span class="nb"&gt;.&lt;/span&gt;
COPY ./notebooks /home/jovyan/work/notebooks

USER root
RUN &lt;span class="nb"&gt;chmod&lt;/span&gt; +x /home/jovyan/start.sh
USER jovyan

RUN pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; pip &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

WORKDIR /home/jovyan/work

EXPOSE 8888
EXPOSE 5000

CMD &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/home/jovyan/start.sh"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Passo a Passo para Configuração
&lt;/h2&gt;

&lt;p&gt;Agora que você tem todos os arquivos, siga os passos abaixo para configurar seu ambiente:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Crie a pasta local&lt;/strong&gt; &lt;code&gt;notebooks/&lt;/code&gt;.
Aqui você pode desenvolver seus notebooks no VS Code e já subí-los pro Jupyter ou criar no Jupyter mesmo e salvar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Construa a imagem Docker:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   docker build &lt;span class="nt"&gt;-t&lt;/span&gt; ml-jupyter &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Rode o container montando a pasta:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 8888:8888 &lt;span class="nt"&gt;-p&lt;/span&gt; 5000:5000 &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/notebooks"&lt;/span&gt;:/home/jovyan/work ml-jupyter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Acesse o Jupyter pelo navegador&lt;/strong&gt; (link no terminal).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Lembre-se que tudo que for salvo no Jupyter estará disponível na sua pasta local, inclusive arquivos com os artefatos do modelo gerados pelo MLFlow.&lt;/p&gt;

&lt;p&gt;Agora sim, podemos dar vida aos projetinhos pessoais sem perder nenhum detalhe!&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2lq1y5bv8jxp0c8380c.gif" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2lq1y5bv8jxp0c8380c.gif" alt="Futurama" width="287" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://jupyter-docker-stacks.readthedocs.io/en/latest/using/selecting.html" rel="noopener noreferrer"&gt;Imagens Docker Disponíveis no Jupyter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mlflow.org/docs/latest/traditional-ml/hyperparameter-tuning-with-child-runs/notebooks/hyperparameter-tuning-with-child-runs" rel="noopener noreferrer"&gt;MLflow with Optuna: Hyperparameter Optimization and Tracking&lt;/a&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>mlops</category>
      <category>docker</category>
      <category>mlflow</category>
    </item>
    <item>
      <title>Boas Práticas em Criptografia de Dados 🔐</title>
      <dc:creator>Lis Barreto</dc:creator>
      <pubDate>Fri, 02 Jun 2023 15:13:46 +0000</pubDate>
      <link>https://dev.to/lisrbarreto/boas-praticas-em-criptografia-de-dados-45p7</link>
      <guid>https://dev.to/lisrbarreto/boas-praticas-em-criptografia-de-dados-45p7</guid>
      <description>&lt;p&gt;No &lt;a href="https://dev.to/lisrbarreto/criptografia-de-dados-em-uma-casca-de-noz-2p2e"&gt;artigo anterior&lt;/a&gt;, exploramos a importância crucial da criptografia de dados na segurança da informação. Reconhecendo a sua importância e compreendendo os desafios e avanços nessa área em constante evolução, podemos garantir a efetiva proteção dos dados sensíveis.&lt;/p&gt;

&lt;p&gt;Neste artigo, daremos continuidade ao nosso mergulho no mundo da proteção de dados, explorando as boas práticas que podem ser aplicadas no dia a dia. Discutiremos orientações e recomendações para a implementação de uma criptografia segura em projetos, incluindo a escolha de algoritmos adequados, o gerenciamento de chaves, o armazenamento seguro de dados criptografados e a proteção contra ataques comuns.&lt;/p&gt;

&lt;p&gt;Vem comigo!&lt;/p&gt;

&lt;h2&gt;
  
  
  Decifrando o Enigma: Qual é o Algoritmo Criptográfico Mais Adequado para o Meu Projeto?
&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd9jjmcrrun0wemj5be04.gif" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd9jjmcrrun0wemj5be04.gif" alt="John Travolta na Matrix" width="550" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao selecionar algoritmos criptográficos, é essencial levar em consideração diversos critérios para garantir a segurança, eficiência e compatibilidade das técnicas de criptografia utilizadas. Esses critérios desempenham um papel fundamental na escolha dos algoritmos apropriados para proteger os dados de forma robusta e confiável. &lt;/p&gt;

&lt;h3&gt;
  
  
  Segurança
&lt;/h3&gt;

&lt;p&gt;Segurança é o critério primordial a ser considerado. Os algoritmos criptográficos devem ser resistentes a ataques conhecidos e possuir propriedades matemáticas sólidas que dificultem a quebra das chaves ou a recuperação dos dados originais sem autorização. Algoritmos amplamente testados e aprovados por especialistas em segurança são preferíveis, como &lt;strong&gt;AES (Advanced Encryption Standard)&lt;/strong&gt;, &lt;strong&gt;RSA (Rivest-Shamir-Adleman)&lt;/strong&gt; e &lt;strong&gt;ECC (Elliptic Curve Cryptography)&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Eficiência
&lt;/h3&gt;

&lt;p&gt;A eficiência é outro fator importante a ser avaliado. Os algoritmos criptográficos devem ser capazes de lidar com grandes volumes de dados de forma rápida e eficiente, sem comprometer a segurança. Isso é especialmente relevante em cenários onde a criptografia é aplicada em tempo real ou em sistemas com recursos limitados. Algoritmos como &lt;strong&gt;AES&lt;/strong&gt; são conhecidos por sua eficiência e desempenho otimizado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Compatibilidade
&lt;/h3&gt;

&lt;p&gt;A compatibilidade também desempenha um papel crucial na seleção de algoritmos criptográficos. É importante considerar a interoperabilidade com outros sistemas e protocolos, garantindo que os dados criptografados possam ser compartilhados e processados por diferentes plataformas e aplicativos. Algoritmos padronizados e amplamente adotados, como os recomendados pelo &lt;strong&gt;NIST (National Institute of Standards and Technology)&lt;/strong&gt;, tendem a ser mais compatíveis e interoperáveis.&lt;/p&gt;

&lt;h3&gt;
  
  
  Outros Fatores a Serem Considerados
&lt;/h3&gt;

&lt;p&gt;Além desses critérios principais, outros fatores podem ser levados em consideração, dependendo do contexto específico. Isso inclui:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Facilidade de implementação e manutenção;&lt;/li&gt;
&lt;li&gt;Disponibilidade de bibliotecas e ferramentas de suporte;&lt;/li&gt;
&lt;li&gt;Escalabilidade;&lt;/li&gt;
&lt;li&gt;Capacidade de resistir a ataques futuros e aprimorados.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ao considerar cuidadosamente esses critérios, é possível selecionar algoritmos criptográficos que atendam aos requisitos de segurança, eficiência e compatibilidade, garantindo a proteção confiável dos dados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gerenciamento adequado de chaves
&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa6jc7dzibj2431n555ee.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa6jc7dzibj2431n555ee.png" alt="Serviços de gerenciamento de chaves" width="800" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O gerenciamento adequado de chaves criptográficas é fundamental para garantir a segurança dos dados. Isso envolve a geração de chaves de alta qualidade e aleatórias, utilizando algoritmos confiáveis. Além disso, é crucial proteger o armazenamento das chaves, seja por meio de hardware criptográfico ou soluções de software seguras. &lt;/p&gt;

&lt;p&gt;A distribuição segura das chaves é necessária para garantir a confidencialidade e autenticidade da transmissão. A rotação periódica das chaves fortalece a segurança, enquanto a revogação rápida em caso de comprometimento é essencial. &lt;/p&gt;

&lt;p&gt;Em resumo, um gerenciamento adequado de chaves criptográficas segue as melhores práticas de geração, armazenamento, distribuição, rotação e revogação, fortalecendo a proteção dos dados e reduzindo riscos de comprometimento.&lt;/p&gt;

&lt;p&gt;Existem várias serviços gerenciados de criação e controle de chaves criptográficas. Aqui estão alguns exemplos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://aws.amazon.com/pt/kms/" rel="noopener noreferrer"&gt;AWS Key Management Service (KMS)&lt;/a&gt;: Oferece um serviço gerenciado para criação e controle de chaves criptográficas na nuvem da Amazon Web Services (AWS). O KMS permite gerar, armazenar e gerenciar chaves criptográficas para uso em serviços e aplicativos da AWS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://cloud.google.com/security-key-management?hl=pt-br" rel="noopener noreferrer"&gt;Google Cloud Key Management Service (KMS)&lt;/a&gt;: É um serviço de gerenciamento de chaves oferecido pela plataforma Google Cloud. Permite criar e gerenciar chaves criptográficas para proteger dados em aplicativos e serviços hospedados na infraestrutura do Google Cloud.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://azure.microsoft.com/pt-br/products/key-vault/" rel="noopener noreferrer"&gt;Azure Key Vault&lt;/a&gt;: É um serviço de gerenciamento de chaves da Microsoft Azure. Permite armazenar e gerenciar chaves criptográficas, certificados e segredos usados em aplicativos e serviços em nuvem. O Azure Key Vault também oferece recursos avançados, como rotação automática de chaves e monitoramento de acesso.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.hashicorp.com/products/vault" rel="noopener noreferrer"&gt;Hashicorp Vault&lt;/a&gt;: É uma ferramenta open-source para gerenciamento seguro de segredos, como chaves criptográficas, senhas e tokens de acesso. O Vault oferece recursos avançados, como controle de acesso granular e auditoria, e pode ser implantado em nuvens públicas, privadas ou híbridas.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essas são apenas algumas opções populares disponíveis no mercado, e cada provedor de nuvem geralmente oferece seu próprio serviço de gerenciamento de chaves. É importante avaliar os recursos e as funcionalidades oferecidas por cada solução para escolher aquela que melhor atenda às necessidades de segurança da sua aplicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proteção dos dados em diferentes estados
&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fraj16h8yl2zw0l8iw7y4.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fraj16h8yl2zw0l8iw7y4.png" alt="Estados do dado" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Proteção de dados em trânsito
&lt;/h2&gt;

&lt;p&gt;A segurança dos dados durante a transmissão é crucial para proteger as informações contra interceptação e acesso não autorizado. Protocolos como SSL/TLS, a criptografia de dados em redes e o uso de VPNs são técnicas eficazes para fortalecer a segurança durante o trânsito dos dados. &lt;/p&gt;

&lt;p&gt;Além disso, é importante adotar boas práticas, como o uso de algoritmos criptográficos robustos e certificados digitais confiáveis, para garantir a autenticidade e integridade dos dados. Com essas medidas, é possível estabelecer uma comunicação segura e proteger as informações contra possíveis ameaças.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proteção de dados em repouso
&lt;/h2&gt;

&lt;p&gt;A proteção de dados armazenados é fundamental para garantir a segurança das informações, especialmente em caso de comprometimento do armazenamento. A criptografia de discos, a criptografia de banco de dados e a criptografia de arquivos são práticas eficazes para fortalecer a proteção dos dados em repouso. Essas medidas envolvem a aplicação de algoritmos criptográficos robustos e o gerenciamento adequado das chaves de criptografia. &lt;/p&gt;

&lt;p&gt;Além da criptografia, é importante implementar medidas de autenticação e controle de acesso para limitar o acesso aos dados apenas a usuários autorizados. Com a aplicação dessas boas práticas, é possível assegurar a confidencialidade e integridade dos dados armazenados, protegendo informações valiosas e sensíveis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Autenticação e controle de acesso
&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F04libunkzw0lblpc7s6e.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F04libunkzw0lblpc7s6e.png" alt="Mulher fazendo uma autenticação ao fazer login no computador" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A autenticação de usuários e o controle de acesso desempenham um papel essencial na segurança e integridade das informações criptografadas. A utilização de senhas fortes e a implementação da autenticação multifator são práticas fundamentais para garantir que apenas pessoas autorizadas possam acessar os dados protegidos. &lt;/p&gt;

&lt;p&gt;Além disso, políticas claras de acesso e o uso de sistemas de gerenciamento de identidade e acesso (IAM) são importantes para estabelecer níveis apropriados de acesso e facilitar a administração das chaves criptográficas. Ao adotar essas medidas, é possível reduzir os riscos de acesso não autorizado e preservar a confidencialidade das informações sensíveis.&lt;/p&gt;

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

&lt;p&gt;Ao longo deste artigo, aprendemos um pouco sobre boas práticas em criptografia, ressaltando a importância de garantir a segurança da informação em um mundo cada vez mais digital e ameaçador. Vimos  também a importância do gerenciamento adequado de chaves e algumas ferramentas que podem nos auxiliar durante esse processo, a proteção dos dados durante a transmissão e o armazenamento, a autenticação de usuários e o controle de acesso. Essas práticas são fundamentais para fortalecer a proteção dos dados e mitigar os riscos de acesso não autorizado.&lt;/p&gt;

&lt;p&gt;No próximo artigo, daremos início à nossa jornada mão na massa no primeiro tutorial de implementação dos algoritmos criptográficos. Vamos explorar passo a passo a implementação de algoritmos fundamentais para a criptografia, permitindo que você aprofunde seus conhecimentos e coloque em prática os conceitos aprendidos. &lt;/p&gt;

&lt;p&gt;Qual será o primeiro algoritmo a ser implementado? Será o AES, um dos algoritmos de criptografia simétrica mais amplamente adotados? Ou será o RSA, um dos algoritmos de criptografia assimétrica mais populares? Fique atente e descubra em breve qual será o primeiro algoritmo escolhido!&lt;/p&gt;

&lt;h2&gt;
  
  
  Ao Infinito e Além!
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/pt_br/wellarchitected/latest/security-pillar/protecting-data-at-rest.html" rel="noopener noreferrer"&gt;Documentação AWS "Proteção de dados em repouso"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/pt_br/wellarchitected/latest/security-pillar/protecting-data-in-transit.html" rel="noopener noreferrer"&gt;Documentação AWS "Proteção de dados em trânsito"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=k5CeZoHLXqo&amp;amp;list=PLWjMI9CAmVU4--SmpzgswTvxLkZqC9QWn" rel="noopener noreferrer"&gt;Curso no YouTube "Fundamental Cryptography in Theory and Python", por
Cyrill Gössi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>security</category>
      <category>data</category>
    </item>
    <item>
      <title>Criptografia de Dados em uma Casca De Noz 🔐</title>
      <dc:creator>Lis Barreto</dc:creator>
      <pubDate>Thu, 25 May 2023 15:08:40 +0000</pubDate>
      <link>https://dev.to/lisrbarreto/criptografia-de-dados-em-uma-casca-de-noz-2p2e</link>
      <guid>https://dev.to/lisrbarreto/criptografia-de-dados-em-uma-casca-de-noz-2p2e</guid>
      <description>&lt;h1&gt;
  
  
  Boas-vindas ao fascinante universo da criptografia de dados!
&lt;/h1&gt;

&lt;p&gt;A criptografia é essencial na segurança da informação, protegendo comunicações, dados confidenciais, transações financeiras e autenticação de usuários. É fundamental para garantir a confidencialidade, integridade e autenticidade dos dados num mundo tão conectado e dependente da tecnologia.&lt;/p&gt;

&lt;p&gt;Nesta série de artigos, vamos explorar de forma prática as técnicas e algoritmos amplamente utilizados na criptografia de dados, pois com a chegada da LGPD, proteger informações sensíveis tornou-se uma prioridade incontestável.&lt;/p&gt;

&lt;p&gt;Hoje mergulharemos no mundo da criptografia, explorando sua importância na segurança da informação e desvendando os segredos por trás das técnicas essenciais na proteção de dados.&lt;/p&gt;

&lt;p&gt;Vamos lá?&lt;/p&gt;

&lt;h2&gt;
  
  
  Afinal, o que é Criptografia?
&lt;/h2&gt;

&lt;p&gt;Imagine que você tem uma mensagem super secreta que não quer que ninguém entenda, exceto a pessoa para quem você está enviando. Você poderia simplesmente escrever a mensagem em um papel e entregá-lo a essa pessoa, mas e se alguém interceptar o papel pelo caminho? É aí que entra a criptografia!&lt;/p&gt;

&lt;p&gt;Podemos pensar na criptografia como um disfarce para suas palavras, ou seja, palavras cifradas. Nesse processo podemos transformar sua mensagem original em algo que só pode ser entendido por alguém se essa pessoa possuir a "chave" certa. É como usar uma língua secreta ou um código que só você e seu destinatário conhecem.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv6eip13tlvuiu2wzffwz.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv6eip13tlvuiu2wzffwz.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em outras palavras, podemos definir criptografia de dados como sendo:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;O processo de transformar informações em um formato ilegível, conhecido como texto cifrado, para que apenas pessoas autorizadas possam acessá-lo por meio da aplicação de uma chave.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Um Breve Histórico da Criptografia
&lt;/h2&gt;

&lt;p&gt;A história da criptografia de dados remonta a milhares de anos. Desde as civilizações antigas, como os egípcios e romanos, métodos rudimentares de criptografia eram usados para proteger mensagens importantes durante a comunicação. Um exemplo famoso é o cifra de César, em que cada letra da mensagem original é substituída por uma letra a certa quantidade de posições à frente no alfabeto.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fii8xns1kaz0bhj7bndw7.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fii8xns1kaz0bhj7bndw7.jpg" alt="Cifra de César" width="359" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao longo dos séculos, a criptografia evoluiu com avanços significativos. Durante a Segunda Guerra Mundial, máquinas de criptografia como a Enigma, desenvolvida por Alan Turing, foram criadas e usadas por militares para codificar e decodificar mensagens secretas.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffm7iqamgzk8imws1bpd4.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffm7iqamgzk8imws1bpd4.png" alt="Enigma - Alan Turing" width="752" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se você tiver mais interesse sobre essa história, assista o filme &lt;em&gt;The Imitation Game&lt;/em&gt;, onde o Alan Turing é interpretado por Benedict Cumberbatch.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl1dxiyviapl93f0y7bom.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl1dxiyviapl93f0y7bom.png" alt="Benedict Cumberbatch em The Imitation Game" width="620" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nos anos 1970, o algoritmo de criptografia simétrica DES (Data Encryption Standard) foi adotado como um padrão de criptografia pelo governo dos EUA. No entanto, com o avanço da tecnologia e a necessidade de algoritmos mais robustos, surgiu o AES (Advanced Encryption Standard), amplamente utilizado atualmente.&lt;/p&gt;

&lt;p&gt;Além da criptografia simétrica, a criptografia assimétrica também se tornou essencial. O algoritmo RSA (Rivest-Shamir-Adleman), desenvolvido na década de 1970, revolucionou a criptografia assimétrica ao permitir a troca de chaves públicas de forma segura.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F25ex8svy8fypt6kkpsoh.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F25ex8svy8fypt6kkpsoh.png" alt="Rivest-Shamir-Adleman" width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com o aumento das preocupações com a privacidade e a segurança de dados, a criptografia continua a se desenvolver. Algoritmos modernos, como a criptografia de curva elíptica (ECC) e a criptografia homomórfica, abrem caminho para novas aplicações e desafios emocionantes na proteção dos dados na era digital.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principais desafios
&lt;/h2&gt;

&lt;p&gt;Os desafios na criptografia de dados estão relacionados às necessidades de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estar um passo à frente dos ataques;&lt;/li&gt;
&lt;li&gt;Manter algoritmos atualizados;&lt;/li&gt;
&lt;li&gt;Encontrar o equilíbrio entre segurança e eficiência.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ao superar esses desafios, podemos garantir a proteção efetiva das informações em um mundo digital cada vez mais complexo e interconectado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aplicações da criptografia
&lt;/h2&gt;

&lt;p&gt;Alguns exemplos de casos de uso com aplicativos reais e os algoritmos de criptografia associados podem ser encontrados em aplicações de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uso de criptografia em transações financeiras, como caixas eletrônicos e compras online&lt;/li&gt;
&lt;li&gt;Criptografia em dispositivos, como notebooks&lt;/li&gt;
&lt;li&gt;Uso de SSL em sites para proteger dados durante a transmissão&lt;/li&gt;
&lt;li&gt;Criptografia em mensagens de aplicativos, como WhatsApp&lt;/li&gt;
&lt;li&gt;Possibilidade de ter pastas criptografadas no telefone&lt;/li&gt;
&lt;li&gt;Criptografia em e-mails com protocolos como o OpenPGP&lt;/li&gt;
&lt;li&gt;Uso de criptografia em VPNs e armazenamento em nuvem&lt;/li&gt;
&lt;li&gt;Criptografia para garantir integridade e autenticidade de informações, incluindo assinaturas digitais&lt;/li&gt;
&lt;li&gt;Uso de criptografia para apagar dados de forma segura, evitando recuperação de informações originais.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esses são apenas alguns exemplos de casos de uso reais da criptografia e os algoritmos associados a eles. É importante destacar que a escolha dos algoritmos pode variar dependendo da implementação e das especificidades de cada caso de uso.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Criptografia simétrica
&lt;/h3&gt;

&lt;p&gt;A criptografia simétrica utiliza a mesma chave para criptografar e descriptografar dados, oferecendo rapidez e eficiência. Porém, é fundamental garantir a segurança da chave compartilhada para evitar acesso não autorizado aos dados. É preciso estabelecer um canal seguro para compartilhar a chave simétrica.&lt;/p&gt;

&lt;h3&gt;
  
  
  Criptografia assimétrica
&lt;/h3&gt;

&lt;p&gt;A criptografia assimétrica, também chamada de criptografia de chave pública, utiliza pares de chaves: uma pública e uma privada. A chave pública é compartilhada, permitindo que qualquer pessoa criptografe os dados, mas apenas o detentor da chave privada correspondente pode descriptografá-los. Essa abordagem garante a segurança da comunicação, eliminando a necessidade de compartilhar uma chave secreta. A criptografia assimétrica é amplamente usada em diversas aplicações de segurança de dados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Algoritmos criptográficos
&lt;/h2&gt;

&lt;p&gt;Existem diversos algoritmos criptográficos disponíveis, cada um com características e usos específicos. Alguns exemplos populares incluem o AES (Advanced Encryption Standard), o RSA (Rivest-Shamir-Adleman) e o ECC (Elliptic Curve Cryptography). Esses algoritmos são amplamente adotados na segurança da informação, proporcionando níveis avançados de criptografia em diferentes cenários.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Deixando a formalidade de lado... E se os algoritmos criptográficos fossem Divas Pop? Quem eles seriam na fila do pão?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Saindo um pouco das formalidades de conceitos e definições, resolvi apostar no meu modo BuzzFeed pra escolher uma Diva Pop pra representar cada algoritmo criptográfico. Elas irão nos acompanhar com seus gifs icônicos nos próximos artigos onde veremos a implementação de cada um deles na prática.&lt;/p&gt;

&lt;h3&gt;
  
  
  Algoritmos Simétricos:
&lt;/h3&gt;

&lt;h4&gt;
  
  
  DES (Data Encryption Standard)
&lt;/h4&gt;

&lt;p&gt;Se o DES fosse uma diva pop, seria a Whitney Houston. Assim como Whitney Houston foi uma das maiores vozes da música pop, o DES foi um dos primeiros algoritmos de criptografia amplamente adotados. Ambos têm um legado significativo e foram líderes em suas épocas.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi64ratk95tmb5l5d1gbt.gif" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi64ratk95tmb5l5d1gbt.gif" alt="Whitney Houston" width="540" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  O AES (Advanced Encryption Standard)
&lt;/h4&gt;

&lt;p&gt;Se o AES fosse uma diva pop, ele seria a Beyoncé. Assim como Queen B, o AES é poderoso, confiável e uma referência no mundo da criptografia. Ambos têm uma presença impactante e são verdadeiros líderes, com uma reputação impecável. Assim como Beyoncé protege seu reinado na música, o AES protege informações valiosas com eficiência e resistência contra ataques.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0o4nia0y3zvc1sl11862.gif" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0o4nia0y3zvc1sl11862.gif" alt="Beyoncé" width="480" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Algoritmos Assimétricos:
&lt;/h3&gt;

&lt;h4&gt;
  
  
  RSA (Rivest-Shamir-Adleman)
&lt;/h4&gt;

&lt;p&gt;Se o RSA fosse uma diva pop, seria a Rihanna. Assim como a Riri é icônica na música, o RSA é um dos algoritmos mais populares da criptografia. Ambos são conhecidos por sua originalidade e estilo único. O RSA é inteligente e meticuloso, assim como alguém que faz cálculos complexos de números primos. Ele leva a segurança a sério, assim como a Rihanna leva a sua carreira.&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%2Fgifs.eco.br%2Fwp-content%2Fuploads%2F2022%2F09%2Fgifs-da-rihanna-0.gif" 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%2Fgifs.eco.br%2Fwp-content%2Fuploads%2F2022%2F09%2Fgifs-da-rihanna-0.gif" alt="Rihanna" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  ECC (Elliptic Curve Cryptography)
&lt;/h4&gt;

&lt;p&gt;Se o ECC fosse uma diva pop, seria a Shakira. Assim como a Shakira com seus quadris, o ECC usa curvas elípticas para criar uma dança matemática que protege nossos dados. Essas curvas são como os movimentos elegantes e sofisticados da diva.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frbbe6cw1rp60mkju39ek.gif" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frbbe6cw1rp60mkju39ek.gif" alt="Shakira" width="640" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Funções de Hash
&lt;/h2&gt;

&lt;p&gt;As funções de hash são algoritmos que recebem um conjunto de dados de entrada e geram um valor de saída, chamado de "hash" ou "resumo". Esses valores são únicos e representam o conjunto de dados original. &lt;/p&gt;

&lt;p&gt;A principal diferença entre as funções de hash e os algoritmos criptográficos é que as funções de hash são unidirecionais, ou seja, é fácil calcular o hash de um dado, mas é extremamente difícil ou praticamente impossível obter os dados originais a partir do hash. Além disso, é muito improvável que dois conjuntos de dados diferentes produzam o mesmo hash. Já os algoritmos criptográficos envolvem operações de criptografia e descriptografia, usando chaves para proteger e acessar os dados.&lt;/p&gt;

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

&lt;p&gt;Neste artigo, exploramos a importância fundamental da criptografia de dados na segurança da informação. Destacamos também que além de desempenhar um papel vital na segurança da informação, é uma área em constante evolução. Ao compreender sua importância, estar atualizado com os avanços e enfrentar os desafios, podemos garantir a proteção efetiva das informações em um mundo digital cada vez mais complexo e ameaçador.&lt;/p&gt;

&lt;p&gt;No próximo artigo, veremos como as boas práticas de proteção de dados podem ser aplicadas no dia a dia. Veremos orientações e recomendações para implementar uma criptografia segura em projetos, incluindo o uso de algoritmos adequados, gerenciamento de chaves, armazenamento seguro de dados criptografados e proteção contra ataques comuns.&lt;/p&gt;

&lt;p&gt;Então até o próximo capítulo dessa saga! &lt;/p&gt;

&lt;h2&gt;
  
  
  Ao Infinito e Além!
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.kaspersky.com.br/resource-center/definitions/encryption" rel="noopener noreferrer"&gt;Artigo no blog da Kaspersky "O que é criptografia de dados? Definição e explicação"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tecnoblog.net/responde/o-que-e-um-hash/#:~:text=Ao%20contr%C3%A1rio%20de%20uma%20criptografia,que%20os%20dados%20sejam%20lidos." rel="noopener noreferrer"&gt;Artigo no Tecnoblog "O que é um hash?", por Ricardo Syozi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=k5CeZoHLXqo&amp;amp;list=PLWjMI9CAmVU4--SmpzgswTvxLkZqC9QWn" rel="noopener noreferrer"&gt;Curso no YouTube "Fundamental Cryptography in Theory and Python", por
Cyrill Gössi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>security</category>
      <category>data</category>
    </item>
    <item>
      <title>Construindo uma Carreira como Data Engineer</title>
      <dc:creator>Lis Barreto</dc:creator>
      <pubDate>Wed, 09 Mar 2022 15:01:48 +0000</pubDate>
      <link>https://dev.to/lisrbarreto/opiniao-construindo-uma-carreira-como-data-engineer-2pnj</link>
      <guid>https://dev.to/lisrbarreto/opiniao-construindo-uma-carreira-como-data-engineer-2pnj</guid>
      <description>&lt;p&gt;Hoje trago mais um dos artigos do livro &lt;a href="https://www.oreilly.com/library/view/97-things-every/9781492062400/" rel="noopener noreferrer"&gt;&lt;em&gt;97 Things Every Data Engineer Should Know&lt;/em&gt;&lt;/a&gt; publicado pela O'Reilly, a editora queridinha da área de Dados. O livro foi organizado por Tobias Macey, host do popular &lt;a href="https://www.dataengineeringpodcast.com/" rel="noopener noreferrer"&gt;&lt;em&gt;Data Engineering Podcast&lt;/em&gt;&lt;/a&gt;.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flh29gq4v3cjei71rb3mi.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flh29gq4v3cjei71rb3mi.jpg" alt="97 Things Every Data Engineer Should Know" width="333" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em uma das publicações deste livro, o autor Vijay Kiran nos traz diversas dicas de como construir uma carreira de sucesso em Engenharia de Dados.&lt;/p&gt;

&lt;p&gt;Um fato inegável é que a Engenharia de Dados abrange muitas disciplinas sobrepostas, portanto é difícil traçar um único caminho para se tornar um engenheiro de dados. Uma das primeiras dicas que Kiran traz aqui é &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tenha experiência básica em escrever pequenos scripts e desenvolva projetos de limpeza de dados, dessa maneira você deve estar pronto para dar seus primeiros passos no mundo de Engenharia de Dados.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Além disso, o autor cita em seu artigo 3 habilidades essenciais para que um aspirante a Data Engineer tenha sucesso em sua carreira. São elas:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Ter conhecimento sólido em ciclo de vida do Software
&lt;/h2&gt;

&lt;p&gt;Lembre-se sempre de que ter conhecimento do ciclo de vida do desenvolvimento de software é inestimável ​​no mundo da Engenharia de Dados!&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Ter conhecimento em linguagem de programação estática e  dinâmica
&lt;/h2&gt;

&lt;p&gt;O uso correto do SQL aliado a uma boa compreensão de pelo menos uma outra linguagem de programação estática e uma dinâmica (um exemplo disso são linguagens como Python e Rust) te dará a importante visão de como um software de qualidade é construído e em como ele pode ser aplicado ao mundo dos dados.&lt;/p&gt;

&lt;h2&gt;
  
  
  3.  Decidir antecipadamente em qual área deseja se concentrar e desenvolver suas habilidades para complementar essa função
&lt;/h2&gt;

&lt;p&gt;A terceira habilidade fundamental depende da subfunção da Engenharia de Dados você deseja se especializar. Para aqueles que desejam se especializar em processamento de dados, desenvolver sua compreensão das tecnologias de armazenamento de dados, bem como continuar a aprimorar suas habilidades com SQL, é fundamental. Para quem quer descer uma rota de Engenharia de Software mais tradicional, aprimorando suas habilidades analíticas será crucial, pois seu foco principal será em projetos de Big Data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conselho Final: Entrar de cabeça no universo Open-Source!
&lt;/h2&gt;

&lt;p&gt;O conselho final se aplica a todos os níveis, desde aspirantes a engenheiros de dados até engenheiros de software estabelecidos que desejam dar o próximo passo: entrar em código aberto! Se você está aprendendo a construir e se divertindo com Engenharia de Dados de código aberto, você está adicionando ao seu repertório essas habilidades.&lt;/p&gt;




&lt;p&gt;E aí? O que você achou dos conselhos do Vijay Kiran? Você concorda com todos eles? Acrescentaria outras dicas pra quem tá começando na área?&lt;/p&gt;

&lt;p&gt;Comenta aí embaixo o que você achou e não esqueça de curtir, salvar e compartilhar esse post. (:&lt;/p&gt;

</description>
      <category>bigdata</category>
      <category>dataengineering</category>
      <category>tips</category>
    </item>
    <item>
      <title>Analisando Posts do Hacker News</title>
      <dc:creator>Lis Barreto</dc:creator>
      <pubDate>Fri, 04 Mar 2022 19:50:12 +0000</pubDate>
      <link>https://dev.to/lisrbarreto/projeto-analisando-posts-do-hacker-news-2m42</link>
      <guid>https://dev.to/lisrbarreto/projeto-analisando-posts-do-hacker-news-2m42</guid>
      <description>&lt;p&gt;Todo o conteúdo deste projeto pode ser encontrado no meu repositório do GitHub. Para mais detalhes, &lt;a href="https://github.com/lis-r-barreto/Data-Engineering-Portfolio" rel="noopener noreferrer"&gt;acesse o link&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Introdução&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;O Hacker News é um site iniciado pela incubadora de startups &lt;a href="https://www.ycombinator.com/" rel="noopener noreferrer"&gt;Y Combinator&lt;/a&gt;, onde as histórias enviadas por usuários (conhecidas como "posts") são votadas e comentadas, semelhante ao reddit. O Hacker News é extremamente popular nos círculos de tecnologia e startups, e as postagens que chegam ao topo das listagens do Hacker News podem receber centenas de milhares de visitantes como resultado.&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%2Fmiro.medium.com%2Fmax%2F700%2F1%2ACVOGx9ckrpWyTvtQgauYpw.jpeg" 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%2Fmiro.medium.com%2Fmax%2F700%2F1%2ACVOGx9ckrpWyTvtQgauYpw.jpeg" width="700" height="250"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Objetivo&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Estamos especificamente interessados ​​em postagens cujos títulos começam com Ask HN ou Show HN. Os usuários enviam postagens Ask HN para fazer uma pergunta específica à comunidade Hacker News. Abaixo segue um exemplo:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ask HN: Como melhorar meu site pessoal?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Da mesma forma, os usuários enviam postagens do Show HN para mostrar à comunidade do Hacker News um projeto, produto ou apenas algo interessante. Abaixo segue um exemplo:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Show HN: Plataforma de desenvolvimento de hardware baseada em Wio Link ESP8266 Web of Things'&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Compararemos esses dois tipos de postagens para determinar o seguinte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Em média, quais postagens recebem mais comentários? Os posts cujos títulos começam com Ask HN ou Show HN?&lt;/li&gt;
&lt;li&gt;Em média, qual horário recebe uma quantidade maior de comentários?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Abrindo e explorando os dados&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Você pode encontrar o conjunto de dados &lt;a href="https://www.kaggle.com/hacker-news/hacker-news-posts" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;, mas observe que ele foi reduzido de quase 300.000 linhas para aproximadamente 20.000 linhas removendo todos os envios que não recebeu nenhum comentário e, em seguida, amostragem aleatória das submissões restantes.&lt;/p&gt;

&lt;p&gt;Abaixo estão as descrições das colunas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;id: O identificador exclusivo do Hacker News para a postagem&lt;/li&gt;
&lt;li&gt;título: O título do post&lt;/li&gt;
&lt;li&gt;url: o URL para o qual as postagens são vinculadas, se a postagem tiver uma URL&lt;/li&gt;
&lt;li&gt;num_points: o número de pontos que o post adquiriu, calculado como o número total de votos positivos menos o número total de votos negativos&lt;/li&gt;
&lt;li&gt;num_comments: O número de comentários que foram feitos no post&lt;/li&gt;
&lt;li&gt;autor: o nome de usuário da pessoa que enviou a postagem&lt;/li&gt;
&lt;li&gt;created_at: A data e hora em que a postagem foi enviada&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos começar importando as bibliotecas que precisamos e lendo o conjunto de dados em uma lista de listas e explorando as primeiras 5 linhas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;

&lt;span class="n"&gt;opened_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;hacker_news.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;encoding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;read_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;reader &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opened_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;hn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;read_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;hn&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="nf"&gt;print &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observe que a primeira lista nas listas internas contém os cabeçalhos das colunas e as listas posteriores contêm os dados de uma linha. Para analisar nossos dados, precisamos primeiro remover a linha que contém os cabeçalhos das colunas. Vamos remover essa primeira linha.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hn&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;#Não execute esta célula mais de uma vez
&lt;/span&gt;&lt;span class="n"&gt;hn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hn&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;

&lt;span class="nf"&gt;print &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;hn&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="nf"&gt;print &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora que removemos os cabeçalhos de hn, estamos prontos para filtrar nossos dados. Como estamos preocupados apenas com títulos de postagem que começam com &lt;strong&gt;Ask HN&lt;/strong&gt; ou &lt;strong&gt;Show HN&lt;/strong&gt;, criaremos novas listas de listas contendo apenas os dados desses títulos.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Classificando os dados&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Para encontrar as postagens que começam com Ask HN ou Show HN (e variações de maiúsculas e minúsculas), usaremos o método string &lt;code&gt;startswith&lt;/code&gt; e verificaremos os dados imprimindo cinco linhas de cada lista.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;ask_posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="n"&gt;show_posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="n"&gt;other_posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;hn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;title_lower&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;title_lower&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ask hn&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;ask_posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;title_lower&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;show hn&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;show_posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;other_posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ask_posts&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="nf"&gt;print &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;show_posts&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="nf"&gt;print &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;other_posts&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="nf"&gt;print &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Número de posts Ask HN:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ask_posts&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Número de posts Show HN:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;show_posts&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Número de outros posts:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;other_posts&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seguida, vamos determinar se as postagens de perguntas ou de exibição recebem mais comentários em média.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;total_ask_comments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ask_posts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;total_ask_comments&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt;  &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;avg_ask_comments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;total_ask_comments&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nf"&gt;len &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ask_posts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;total_show_comments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;show_posts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;total_show_comments&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt;  &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;avg_show_comments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;total_show_comments&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nf"&gt;len &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;show_posts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Número médio de comentários Ask HN:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;avg_ask_comments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Número médio de comentários Show HN:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;avg_show_comments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Reformatando e analisando os dados&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Fica claro que, em média, os posts de pergunta recebem mais comentários do que os posts de exibição. Como as postagens de perguntas são mais propensas a receber comentários, focaremos nossa análise restante apenas nessas postagens.&lt;/p&gt;

&lt;p&gt;Em seguida, determinaremos se as postagens de perguntas criadas em um determinado momento são mais propensas a atrair comentários. Usaremos as seguintes etapas para realizar essa análise:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Calcular a quantidade de posts Ask HN criados em cada hora do dia, juntamente com o número de comentários recebidos.&lt;/li&gt;
&lt;li&gt;Calcular o número médio de comentários que as postagens de solicitação recebem por hora de criação.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Usaremos o módulo &lt;code&gt;datetime&lt;/code&gt; para trabalhar com os dados na coluna &lt;code&gt;created_at&lt;/code&gt; para calcular a quantidade de postagens e comentários de perguntas por hora criados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;

&lt;span class="n"&gt;result_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ask_posts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;result_list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;counts_by_hour&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="n"&gt;comments_by_hour&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;result_list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;time_created&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strptime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;%m/%d/%Y %H:%M&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;hour&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time_created&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;hour&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;counts_by_hour&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;counts_by_hour&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="n"&gt;comments_by_hour&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;counts_by_hour&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="n"&gt;comments_by_hour&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;O número de postagens de perguntas criadas durante cada hora do dia:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;counts_by_hour&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;O número correspondente de comentários criados a cada hora recebida:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;comments_by_hour&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seguida, usaremos esses dois dicionários para calcular o número médio de comentários para postagens criadas durante cada hora do dia, criando uma lista de listas contendo as horas em que as postagens foram criadas e o número médio de comentários que essas postagens receberam.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;avg_by_hour&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;hour&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;counts_by_hour&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;no_of_posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;counts_by_hour&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;no_of_comments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;comments_by_hour&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;avg_no_comments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;comments_by_hour&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;counts_by_hour&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; 
    &lt;span class="n"&gt;avg_by_hour&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;avg_no_comments&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;avg_by_hour&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos classificar os dados acima em ordem decrescente do número médio de comentários para facilitar a análise.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;swap_avg_by_hour&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;avg_by_hour&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;swap_avg_by_hour&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;

&lt;span class="n"&gt;sorted_swap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;swap_avg_by_hour&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;reverse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Os 5 horários com maior numéro médio de comentários por postagens do Ask HN&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sorted_swap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;template&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;{time}:00: {num:.2f} média de comentários por post.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusões&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;As postagens de perguntas têm um número médio de comentários mais alto do que as postagens de exibição.&lt;/li&gt;
&lt;li&gt;O horário de 15:00 GMT tem o maior número médio de comentários.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Referências&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Este projeto guiado faz parte do &lt;a href="https://www.dataquest.io/path/data-engineer/" rel="noopener noreferrer"&gt;&lt;em&gt;Data Enginnering Carreer Path&lt;/em&gt;&lt;/a&gt; proposto pela&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq6iq3cl7ceknfm116uch.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq6iq3cl7ceknfm116uch.png" alt=" " width="182" height="50"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>analytics</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Adentre o universo da Engenharia de Dados com profissionais brasileiros que se tornaram referência na área!</title>
      <dc:creator>Lis Barreto</dc:creator>
      <pubDate>Thu, 24 Feb 2022 14:49:57 +0000</pubDate>
      <link>https://dev.to/lisrbarreto/dica-adentre-o-universo-da-engenharia-de-dados-com-profissionais-brasileiros-que-se-tornaram-referencia-na-area-3o3p</link>
      <guid>https://dev.to/lisrbarreto/dica-adentre-o-universo-da-engenharia-de-dados-com-profissionais-brasileiros-que-se-tornaram-referencia-na-area-3o3p</guid>
      <description>&lt;p&gt;Desde que eu passei a me interessar por temas relacionados à dados, decidi buscar referências nacionais que me ajudassem a desbravar esse universo. A vida era mais simples quando eu queria acompanhar tópicos relacionados à Análise de Dados e algoritmos de Machine Learning, mas depois que passei a querer entender mais sobre temas relacionados à Engenharia de Dados passou a ser difícil encontrar conteúdo de qualidade, gratuito e em português. &lt;/p&gt;

&lt;p&gt;Por isso decidi compartilhar com vocês essa playlist que eu criei no YouTube. Aqui você vai mergulhar em tópicos de carreira, ferramentas essenciais no dia a dia da área como Apache Spark, Apache Airflow e Apache Kafka. Como um bônus você ainda leva uma seção de inteligência de negócios e tópicos mais avançados.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que você vai encontrar por aqui
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Carreira
&lt;/h3&gt;

&lt;p&gt;Nossa playlist já começa com um banho de loja sobre a área e ninguém melhor pra falar sobre carreira do que a super Carina Sucupira. Seguindo o fluxo a Pamela Santos e o Allan Sene também enriquecem essa nossa seção sobre carreira.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Ferramentas
&lt;/h3&gt;

&lt;p&gt;O Data Hackers não podia ficar fora dessa, né? Então o Rodrigo Teoria vem aí pra puxar o Supletivo DH. Se você não conhece o Hadoop, o Spark, o Airflow e o Kafka, não pode deixar de passar por essa seção. Além de trazer uma introdução dessas ferramentas, a galera da comunidade não deixou a desejar nas dicas pra quem quer se aprofundar nos estudos.&lt;/p&gt;

&lt;p&gt;Recentemente me deparei também com o canal do Luan Moreno M. Maciel e ele tem me ajudado bastante a ter um panorama geral sobre como as ferramentas são utilizadas por engenheiros de dados.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Business Intelligence e Analytics
&lt;/h3&gt;

&lt;p&gt;Quem puxa essa conversa é a Dani Monteiro, uma gigante da área de Dados. A Dani traz pra aqui pra gente algo que não pode ficar de fora da trilha de um bom profissional da área, o braço de inteligência de negócios.&lt;/p&gt;

&lt;p&gt;Na sequência o André Araújo traz um aulão de análise de dados com PySpark, excelente pra quem curte um bom e velho mão na massa.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Tópicos Avançados
&lt;/h3&gt;

&lt;p&gt;Pra quem quer descobrir como perder o medo do Git e até mesmo estruturar um data lake, o André Sionek traz na medida certa uma abordagem sobre esses tópicos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/playlist?list=PL4-2nytFDoSe_TicGN3KDFt1lz2IvjYoX" rel="noopener noreferrer"&gt;Acesse a playlist Engenharia de Dados no YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Siga os profissionais que contribuíram pra que esse conteúdo chegasse até você.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/carina-sucupira/" rel="noopener noreferrer"&gt;Carina Sucupira&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/pamela-santos/" rel="noopener noreferrer"&gt;Pamela Santos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/allansene/" rel="noopener noreferrer"&gt;Allan Sene&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/ACoAAAWkfs8BgYvwwpuhAgNikA2IlWUJ4KmbFqo/" rel="noopener noreferrer"&gt;Rodrigo Teoria&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/luanmoreno/" rel="noopener noreferrer"&gt;Luan Moreno M. Maciel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/danimonteirodba/" rel="noopener noreferrer"&gt;Dani Monteiro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/dedeco/" rel="noopener noreferrer"&gt;André Araújo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/andresionek/" rel="noopener noreferrer"&gt;André Sionek&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E as comunidades:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://womakerscode.org/" rel="noopener noreferrer"&gt;WoMakersCode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aigirlsbr.github.io/" rel="noopener noreferrer"&gt;AI Girls&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://datahackers.com.br/" rel="noopener noreferrer"&gt;Data Hackers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>bigdata</category>
      <category>dados</category>
      <category>dataengineering</category>
      <category>career</category>
    </item>
    <item>
      <title>Data Warehouse, Data Lake e Data Lakehouse: Conceitos e Diferenças</title>
      <dc:creator>Lis Barreto</dc:creator>
      <pubDate>Fri, 18 Feb 2022 14:12:58 +0000</pubDate>
      <link>https://dev.to/lisrbarreto/artigo-data-warehouse-data-lake-e-data-lakehouse-conceitos-e-diferencas-2800</link>
      <guid>https://dev.to/lisrbarreto/artigo-data-warehouse-data-lake-e-data-lakehouse-conceitos-e-diferencas-2800</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Data Warehouses&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Os &lt;strong&gt;data warehouses&lt;/strong&gt; têm alimentado as decisões de Business Intelligence (BI) por cerca de 30 anos. Ao longo da história, as tecnologias de data warehouse evoluíram em resposta às mudanças na escala e na natureza dos dados relevantes para os tomadores de decisão e ao surgimento da internet e outras inovações tecnológicas.&lt;/p&gt;

&lt;p&gt;Os data warehouses geralmente seguem um conjunto de diretrizes para projetar sistemas que controlam o fluxo de dados usados ​​na tomada de decisões. Eles são projetados para otimizar as consultas de dados, evitar conflitos entre consultas em execução simultânea, oferecer suporte a dados estruturados e fazer a suposição de que os dados inseridos provavelmente não serão alterados frequentemente.&lt;/p&gt;

&lt;p&gt;Como os data warehouses foram originalmente desenvolvidos usando tecnologia local para orientar as decisões de BI, eles tiveram alguns pontos fracos na adaptação à atmosfera de dados moderna. A proliferação de dispositivos inteligentes e comércio baseado na web aumentou o volume e a variedade de dados. Os armazéns de dados tradicionalmente dependem de formatos de dados proprietários, que não oferecem suporte a arquivos de vídeo, imagem ou texto livre. Isso leva a um suporte limitado para cargas de trabalho de aprendizado de máquina.&lt;/p&gt;

&lt;p&gt;As tecnologias tradicionais de data warehouse forçam os usuários a investir em capacidade de computação e armazenamento suficientes para lidar com o pico de tráfego de usuários. Com o crescimento exponencial que muitas empresas observaram em seus dados nos últimos anos, esse design pode se tornar extremamente caro.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwrkv9rw6fkvfnaows5qz.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwrkv9rw6fkvfnaows5qz.jpg" alt=" " width="338" height="382"&gt;&lt;/a&gt;&lt;br&gt;
Figura 1.1. Diagrama de um data warehouse&lt;br&gt;
Fonte: Databricks Academy &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Data Lakes&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Os &lt;strong&gt;data lakes&lt;/strong&gt; só passaram a ser amplamente utilizados na última década, impulsionados por enormes aumentos na variedade e no volume de dados e impulsionados por avanços tecnológicos para armazenar e processar dados de maneira econômica e eficiente. Data lakes são frequentemente definidos em oposição a data warehouses: enquanto um data warehouse fornece dados limpos e estruturados para análises de BI, um data lake permite que uma organização armazene dados de qualquer natureza de forma permanente e econômica em qualquer formato - na verdade, os data lakes permitem ambos dados estruturados e semiestruturados a serem armazenados junto com dados não estruturados, como vídeo, imagens, texto livre e arquivos de log.&lt;/p&gt;

&lt;p&gt;Ao contrário dos data warehouses, o armazenamento de dados e a computação não são acoplados no design do data lake. Isso levou a várias tecnologias que evoluíram em torno do trabalho com dados armazenados em data lakes. O Apache Spark, por exemplo, o mecanismo de computação usado pelo Databricks, pode executar consultas analíticas, extrair-transformar-carregar e cargas de trabalho de aprendizado de máquina sobre enormes quantidades de dados armazenados em data lakes.&lt;/p&gt;

&lt;p&gt;Apesar de todos os seus pontos fortes, os data lakes não eliminaram a necessidade de data warehouses. Para análises de BI, a maioria das empresas continua a carregar os dados relevantes de seu data lake em um data warehouse, e é aqui que a maioria dos analistas executa consultas e gera relatórios. Além disso, como todos os dados de uma organização chegam a um lago de dados, eles podem rapidamente se tornar o que é conhecido como um pântano de dados - um lago de dados mal mantido que é difícil de navegar e consultar.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn1zwtl54lyya0f6zgo69.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn1zwtl54lyya0f6zgo69.jpg" alt=" " width="312" height="318"&gt;&lt;/a&gt;&lt;br&gt;
Figura 1.2. Diagrama de um data lake&lt;br&gt;
Fonte: Databricks Academy &lt;/p&gt;

&lt;h2&gt;
  
  
  Data Lakehouse
&lt;/h2&gt;

&lt;p&gt;Um data lakehouse é um novo paradigma de gerenciamento de dados aberto que combina os recursos mais populares de data lakes e data warehouses. De acordo com seu projeto, eles implementam estruturas de dados e recursos de gerenciamento de dados semelhantes aos de um data warehouse, diretamente no tipo de armazenamento de baixo custo usado para data lakes. Mesclar essas ideias em um único sistema significa que as equipes de dados podem se mover mais rapidamente, pois podem usar os dados sem acessar vários sistemas. Data lakehouses também garantem que as equipes tenham os dados mais completos e atualizados disponíveis para projetos de ciência de dados, aprendizado de máquina e análise de negócios.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0yxf14bm2pys89rq9pq.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0yxf14bm2pys89rq9pq.png" alt=" " width="800" height="419"&gt;&lt;/a&gt;&lt;br&gt;
Figura 1.3. Diagrama de um data lakehouse&lt;br&gt;
Fonte: Databricks Academy &lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://academy.databricks.com/elearning/INT-FODBLP-v1-SP" rel="noopener noreferrer"&gt;Fundamentals of the Databricks Lakehouse Platform&lt;/a&gt;&lt;/p&gt;

</description>
      <category>bigdata</category>
      <category>data</category>
      <category>dataengineering</category>
    </item>
    <item>
      <title>Os 3 R's da Engenharia de Dados</title>
      <dc:creator>Lis Barreto</dc:creator>
      <pubDate>Wed, 02 Feb 2022 17:28:12 +0000</pubDate>
      <link>https://dev.to/lisrbarreto/opiniao-os-3-rs-da-engenharia-de-dados-pj8</link>
      <guid>https://dev.to/lisrbarreto/opiniao-os-3-rs-da-engenharia-de-dados-pj8</guid>
      <description>&lt;p&gt;Tobias Macey é host do popular &lt;a href="https://www.dataengineeringpodcast.com/" rel="noopener noreferrer"&gt;&lt;em&gt;Data Engineering Podcast&lt;/em&gt;&lt;/a&gt; e organizador do livro &lt;a href="https://www.oreilly.com/library/view/97-things-every/9781492062400/" rel="noopener noreferrer"&gt;&lt;em&gt;97 Things Every Data Engineer Should Know&lt;/em&gt;&lt;/a&gt; publicado pela O'Reilly, a editora queridinha da área de Dados.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flh29gq4v3cjei71rb3mi.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flh29gq4v3cjei71rb3mi.jpg" alt="97 Things Every Data Engineer Should Know" width="333" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em um dos artigos publicados por Macey ele enfatiza 3 competências que ele considera imprescindíveis no dia a dia da Engenharia de Dados.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;em&gt;Reliability&lt;/em&gt; (Confiabilidade)
&lt;/h2&gt;

&lt;p&gt;A confiabilidade está relacionada às características dos dados que contribuem para um alto grau de confiança das análises que você está realizando, ou seja, dessas análises serem consideradas corretas. Da mesma maneira, a confiabilidade está atrelada ao fato de que os algoritmos sofisticados de Machine Learning necessitam de consistência dos dados.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;em&gt;Reproducibility&lt;/em&gt; (Reprodutibilidade)
&lt;/h2&gt;

&lt;p&gt;A reprodutibilidade é uma competência crítica ao trabalhar com&lt;br&gt;
sistemas. Se não existir a possibilidade de outro membro do time ou unidade de negócios verificar e recriar independentemente seus conjuntos de dados e análises, não há maneira de ter certeza que os resultados originais eram válidos. Isso tem um impacto direto no conceito de confiabilidade, pois se você é capaz de reproduzir consistentemente um determinado conjunto de dados, você pode ter a certeza de que é confiável.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;em&gt;Repeatability&lt;/em&gt; (Repetibilidade)
&lt;/h2&gt;

&lt;p&gt;Se todos os seus servidores morrerem ou o datacenter em que seus sistemas estão sendo executados estiver destruído ou incapacitado por um desastre natural, você precisa de um plano de recuperação. É aqui que entra em jogo o terceiro R, repetibilidade. Está tudo bem em construir um cluster Spark ou instalar um banco de dados PostgreSQL, mas pode você conseguiria fazer isso rapidamente e repetidamente? &lt;/p&gt;




&lt;p&gt;E aí? O que você achou dos 3 R's propostos por Macey? Você concorda com todos eles? Acrescentaria outros pontos que você considera mais que necessários no cotidiano da área de Engenharia de Dados?&lt;/p&gt;

&lt;p&gt;Comenta aí embaixo o que você achou e não esqueça de curtir, salvar e compartilhar esse post. (:&lt;/p&gt;

</description>
      <category>bigdata</category>
      <category>dataengineering</category>
      <category>tips</category>
    </item>
    <item>
      <title>Analisando Dados da App Store e Google Play - Parte II</title>
      <dc:creator>Lis Barreto</dc:creator>
      <pubDate>Fri, 28 Jan 2022 14:27:01 +0000</pubDate>
      <link>https://dev.to/lisrbarreto/projeto-analisando-dados-da-app-store-e-google-play-parte-ii-1f5g</link>
      <guid>https://dev.to/lisrbarreto/projeto-analisando-dados-da-app-store-e-google-play-parte-ii-1f5g</guid>
      <description>&lt;p&gt;Todo o conteúdo deste projeto pode ser encontrado no meu repositório do GitHub. Para mais detalhes, &lt;a href="https://github.com/lis-r-barreto/Data-Engineering-Portfolio" rel="noopener noreferrer"&gt;acesse o link&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Aplicativos mais comuns por gênero&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Parte I&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Como mencionamos na introdução, nosso objetivo é determinar os tipos de aplicativos que provavelmente atrairão mais usuários, pois nossa receita é altamente influenciada pelo número de pessoas que usam nossos aplicativos.&lt;/p&gt;

&lt;p&gt;Para minimizar riscos e sobrecarga, nossa estratégia de validação para uma ideia de aplicativo é composta de três etapas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crie uma versão Android mínima do aplicativo e adicione-a ao Google Play.&lt;/li&gt;
&lt;li&gt;Se o aplicativo tiver uma boa resposta dos usuários, nós o desenvolveremos ainda mais.&lt;/li&gt;
&lt;li&gt;Se o aplicativo for lucrativo após seis meses, também criamos uma versão iOS do aplicativo e a adicionamos à App Store.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Como nosso objetivo final é adicionar o aplicativo na App Store e no Google Play, precisamos encontrar perfis de aplicativos que tenham sucesso em ambos os mercados. Por exemplo, um perfil que pode funcionar bem para os dois mercados pode ser um aplicativo de produtividade que faz uso de gamificação.&lt;/p&gt;

&lt;p&gt;Vamos começar a análise obtendo uma noção dos gêneros mais comuns para cada mercado. Para isso, construiremos uma tabela de frequência para a coluna &lt;code&gt;prime_genre&lt;/code&gt; do conjunto de dados da App Store e as colunas&lt;code&gt;Genres&lt;/code&gt; e &lt;code&gt;Category&lt;/code&gt; do conjunto de dados do Google Play.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Parte II&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Vamos construir duas funções que podemos usar para analisar as tabelas de frequência:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uma função para gerar tabelas de frequência que mostram percentagens&lt;/li&gt;
&lt;li&gt;Outra função que podemos usar para exibir as porcentagens em ordem decrescente
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;freq_table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

    &lt;span class="n"&gt;table_percentages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;percentage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="n"&gt;table_percentages&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;percentage&lt;/span&gt; 

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;table_percentages&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;display_table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;freq_table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;table_display&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;key_val_as_tuple&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;table_display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key_val_as_tuple&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;table_sorted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;table_display&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;table_sorted&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Parte III&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Começamos examinando a tabela de frequência para a coluna &lt;code&gt;prime_genre&lt;/code&gt; do conjunto de dados da App Store.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;display_table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ios_final&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos verificar que entre os aplicativos gratuitos em inglês, mais da metade (58,16%) são jogos. Os aplicativos de entretenimento estão perto de 8%, seguidos pelos aplicativos de foto e vídeo, que estão perto de 5%. Apenas 3,66% dos aplicativos são projetados para a educação, seguidos por aplicativos de redes sociais que somam 3,29% dos aplicativos em nosso conjunto de dados.&lt;/p&gt;

&lt;p&gt;A impressão geral é que a App Store (pelo menos a parte que contém aplicativos em inglês gratuitos) é dominada por aplicativos que são projetados para se divertir (jogos, entretenimento, foto e vídeo, redes sociais, esportes, música, etc.), enquanto aplicativos com práticas propósitos (educação, compras, serviços públicos, produtividade, estilo de vida, etc.) são mais raros. No entanto, o fato de os aplicativos divertidos serem os mais numerosos também não significa que eles também tenham o maior número de usuários - a demanda pode não ser a mesma que a oferta.&lt;/p&gt;

&lt;p&gt;Vamos continuar examinando as colunas &lt;code&gt;Genres&lt;/code&gt; e&lt;code&gt;Category&lt;/code&gt; do conjunto de dados do Google Play (duas colunas que parecem estar relacionadas).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;display_table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;android_final&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Category
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O cenário parece significativamente diferente no Google Play: não existem muitos aplicativos projetados para se divertir, e parece que um bom número de aplicativos são projetados para fins práticos (família, ferramentas, negócios, estilo de vida, produtividade, etc.). No entanto, se investigarmos isso mais a fundo, podemos ver que a categoria família (que responde por quase 19% dos aplicativos) significa principalmente jogos para crianças.&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%2Fs3.amazonaws.com%2Fdq-content%2F350%2Fpy1m8_family.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%2Fs3.amazonaws.com%2Fdq-content%2F350%2Fpy1m8_family.png" width="800" height="435"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Mesmo assim, os aplicativos práticos parecem ter uma melhor representação no Google Play em comparação com a App Store. Esta imagem também é confirmada pela tabela de frequência que vemos na coluna &lt;code&gt;Genres&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;display_table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;android_final&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A diferença entre as colunas &lt;code&gt;Genres&lt;/code&gt; e&lt;code&gt;Category&lt;/code&gt; não é muito clara, mas uma coisa que podemos notar é que a coluna &lt;code&gt;Genres&lt;/code&gt; é muito mais granular (tem mais categorias). No momento, estamos apenas procurando o panorama geral, então trabalharemos apenas com a coluna &lt;code&gt;Category&lt;/code&gt; daqui para frente.&lt;/p&gt;

&lt;p&gt;Até este ponto, descobrimos que a App Store é dominada por aplicativos projetados para diversão, enquanto o Google Play mostra um cenário mais equilibrado de aplicativos práticos e divertidos. Agora, gostaríamos de ter uma ideia sobre o tipo de aplicativo que tem a maioria dos usuários.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Aplicativos mais populares por gênero na App Store&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Uma maneira de descobrir quais gêneros são os mais populares (têm mais usuários) é calcular o número médio de instalações para cada gênero de aplicativo. Para o conjunto de dados do Google Play, podemos encontrar essas informações na coluna &lt;code&gt;Installs&lt;/code&gt;, mas para o conjunto de dados da App Store, essas informações estão ausentes. Como solução alternativa, tomaremos o número total de classificações do usuário como um proxy, que podemos encontrar no aplicativo &lt;code&gt;rating_count_tot&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Abaixo, calculamos o número médio de classificações de usuários por gênero de aplicativo na App Store:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;genres_ios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;freq_table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ios_final&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;genre&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;genres_ios&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;len_genre&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ios_final&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;genre_app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;genre_app&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;genre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;            
            &lt;span class="n"&gt;n_ratings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;n_ratings&lt;/span&gt;
            &lt;span class="n"&gt;len_genre&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;avg_n_ratings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;len_genre&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;genre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;avg_n_ratings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em média, os aplicativos de navegação têm o maior número de avaliações de usuários, mas esse número é fortemente influenciado pelo Waze e pelo Google Maps, que têm quase meio milhão de avaliações de usuários juntas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ios_final&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Navigation&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;# Imprime nome e número de avaliações
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O mesmo padrão se aplica a aplicativos de redes sociais, onde o número médio é fortemente influenciado por alguns gigantes como Facebook, Pinterest, Skype, etc. O mesmo se aplica a aplicativos de música, onde alguns grandes jogadores como Pandora, Spotify e Shazam influenciam fortemente o número médio.&lt;/p&gt;

&lt;p&gt;Nosso objetivo é encontrar gêneros populares, mas aplicativos de navegação, redes sociais ou música podem parecer mais populares do que realmente são. O número médio de classificações parece ser distorcido por muito poucos aplicativos que têm centenas de milhares de classificações de usuários, enquanto os outros aplicativos podem ter dificuldade em passar do limite de 10.000. Poderíamos ter uma imagem melhor removendo esses aplicativos extremamente populares para cada gênero e, em seguida, refazer as médias, mas deixaremos esse nível de detalhe para mais tarde.&lt;/p&gt;

&lt;p&gt;Os aplicativos de referência têm 74.942 avaliações de usuários em média, mas na verdade são a Bíblia e o Dictionary.com que elevam a avaliação média:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ios_final&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Reference&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No entanto, esse nicho parece apresentar algum potencial. Uma coisa que poderíamos fazer é pegar outro livro popular e transformá-lo em um aplicativo onde poderíamos adicionar diferentes recursos além da versão bruta do livro. Isso pode incluir citações diárias do livro, uma versão em áudio do livro, questionários sobre o livro, etc. Além disso, também podemos incorporar um dicionário dentro do aplicativo, para que os usuários não precisem sair de nosso aplicativo para olhar palavras em um aplicativo externo.&lt;/p&gt;

&lt;p&gt;Essa ideia parece se encaixar bem com o fato de que a App Store é dominada por aplicativos para diversão. Isso sugere que o mercado pode estar um pouco saturado com aplicativos divertidos, o que significa que um aplicativo prático pode ter mais chance de se destacar entre o grande número de aplicativos na App Store.&lt;/p&gt;

&lt;p&gt;Outros gêneros que parecem populares incluem clima, livro, comida e bebida ou finanças. O gênero do livro parece se sobrepor um pouco à ideia do aplicativo que descrevemos acima, mas os outros gêneros não nos parecem muito interessantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Aplicativos de clima - as pessoas geralmente não passam muito tempo no aplicativo e as chances de lucrar com adições no aplicativo são baixas. Além disso, obter dados meteorológicos confiáveis ​​ao vivo pode exigir que conectemos nossos aplicativos a APIs não livres.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Alimentos e bebidas - os exemplos aqui incluem Starbucks, Dunkin 'Donuts, McDonald's, etc. Portanto, fazer um aplicativo popular de comida e bebida requer uma cozinha real e um serviço de entrega, o que está fora do escopo de nossa empresa.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Aplicativos de finanças - esses aplicativos envolvem serviços bancários, pagamento de contas, transferência de dinheiro, etc. Construir um aplicativo de finanças requer conhecimento de domínio e não queremos contratar um especialista em finanças apenas para construir um aplicativo.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora vamos analisar um pouco o mercado do Google Play.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Aplicativos mais populares por gênero no Google Play&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Para o mercado do Google Play, temos dados sobre o número de instalações, então devemos ser capazes de ter uma ideia mais clara sobre a popularidade do gênero. No entanto, os números de instalação não parecem precisos o suficiente - podemos ver que a maioria dos valores é aberta (100+, 1.000+, 5.000+, etc.):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;display_table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;android_final&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# A coluna 'Installs'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um problema com esses dados é que não são precisos. Por exemplo, não sabemos se um aplicativo com mais de 100.000 instalações possui 100.000 instalações, 200.000 ou 350.000. No entanto, não precisamos de dados muito precisos para nossos propósitos - queremos apenas ter uma ideia de quais gêneros de aplicativos atraem mais usuários e não precisamos de precisão perfeita com relação ao número de usuários.&lt;/p&gt;

&lt;p&gt;Vamos deixar os números como estão, o que significa que consideraremos que um aplicativo com mais de 100.000 instalações tem 100.000 instalações e um aplicativo com mais de 1.000.000 de instalações tem 1.000.000 de instalações e assim por diante.&lt;/p&gt;

&lt;p&gt;Para realizar cálculos, no entanto, precisaremos converter cada número de instalação em &lt;code&gt;float&lt;/code&gt; - isso significa que precisamos remover as vírgulas e os caracteres de adição, caso contrário, a conversão falhará e gerará um erro. Faremos isso diretamente no loop abaixo, onde também calculamos o número médio de instalações para cada gênero (categoria).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;categories_android&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;freq_table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;android_final&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;categories_android&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;len_category&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;android_final&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;category_app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;category_app&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;            
            &lt;span class="n"&gt;n_installs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;n_installs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;n_installs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;n_installs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;n_installs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;+&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n_installs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;len_category&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;avg_n_installs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;len_category&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;avg_n_installs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em média, os aplicativos de comunicação têm o maior número de instalações: 38.456.119. Este número é fortemente distorcido por alguns aplicativos que têm mais de um bilhão de instalações (WhatsApp, Facebook Messenger, Skype, Google Chrome, Gmail e Hangouts) e alguns outros com mais de 100 e 500 milhões de instalações:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;android_final&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;COMMUNICATION&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1,000,000,000+&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
                                      &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;500,000,000+&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
                                      &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;100,000,000+&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se removêssemos todos os aplicativos de comunicação com mais de 100 milhões de instalações, a média seria reduzida cerca de dez vezes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;under_100_m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;android_final&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;n_installs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;n_installs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;n_installs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;n_installs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;n_installs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;+&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;COMMUNICATION&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n_installs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;100000000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;under_100_m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n_installs&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;under_100_m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;under_100_m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vemos o mesmo padrão para a categoria de players de vídeo, que é a segunda colocada com 24.727.872 instalações. O mercado é dominado por aplicativos como Youtube, Google Play Filmes e TV ou MX Player. O padrão é repetido para aplicativos sociais (onde temos gigantes como Facebook, Instagram, Google+, etc.), aplicativos de fotografia (Google Fotos e outros editores de fotos populares) ou aplicativos de produtividade (Microsoft Word, Dropbox, Google Calendar, Evernote, etc. .).&lt;/p&gt;

&lt;p&gt;Novamente, a principal preocupação é que esses gêneros de aplicativos possam parecer mais populares do que realmente são. Além disso, esses nichos parecem ser dominados por alguns gigantes contra os quais é difícil competir.&lt;/p&gt;

&lt;p&gt;O gênero de jogo parece bastante popular, mas antes descobrimos que essa parte do mercado parece um pouco saturada, então gostaríamos de sugerir um aplicativo diferente, se possível.&lt;/p&gt;

&lt;p&gt;Os livros e o gênero de referência também parecem bastante populares, com um número médio de instalações de 8.767.811. É interessante explorar isso com mais profundidade, pois descobrimos que esse gênero tem algum potencial para funcionar bem na App Store, e nosso objetivo é recomendar um gênero de aplicativo que mostra potencial para ser lucrativo tanto na App Store quanto no Google Play.&lt;/p&gt;

&lt;p&gt;Vamos dar uma olhada em alguns dos aplicativos desse gênero e seu número de instalações:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;android_final&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;BOOKS_AND_REFERENCE&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O livro e o gênero de referência incluem uma variedade de aplicativos: software para processar e ler e-books, várias coleções de bibliotecas, dicionários, tutoriais sobre programação ou linguagens, etc. Parece que ainda há um pequeno número de aplicativos extremamente populares que distorcem a média:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;android_final&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;BOOKS_AND_REFERENCE&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1,000,000,000+&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
                                            &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;500,000,000+&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
                                            &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;100,000,000+&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No entanto, parece que existem apenas alguns aplicativos muito populares, então este mercado ainda mostra potencial. Vamos tentar obter algumas ideias de aplicativos com base no tipo de aplicativo que está em algum lugar no meio em termos de popularidade (entre 1.000.000 e 100.000.000 de downloads):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;android_final&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;BOOKS_AND_REFERENCE&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1,000,000+&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
                                            &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;5,000,000+&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
                                            &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;10,000,000+&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
                                            &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;50,000,000+&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este nicho parece ser dominado por software para processamento e leitura de e-books, bem como várias coleções de bibliotecas e dicionários, então provavelmente não é uma boa ideia construir aplicativos semelhantes, pois haverá uma concorrência significativa.&lt;/p&gt;

&lt;p&gt;Também notamos que existem alguns aplicativos desenvolvidos em torno do livro Alcorão, o que sugere que construir um aplicativo em torno de um livro popular pode ser lucrativo. Parece que pegar um livro popular (talvez um livro mais recente) e transformá-lo em um aplicativo pode ser lucrativo para os mercados do Google Play e da App Store.&lt;/p&gt;

&lt;p&gt;No entanto, parece que o mercado já está cheio de bibliotecas, então precisamos adicionar alguns recursos especiais além da versão bruta do livro. Isso pode incluir citações diárias do livro, uma versão em áudio do livro, questionários sobre o livro, um fórum onde as pessoas podem discutir o livro, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusões&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Neste projeto, analisamos dados sobre aplicativos móveis da App Store e Google Play com o objetivo de recomendar um perfil de aplicativo que possa ser lucrativo para ambos os mercados.&lt;/p&gt;

&lt;p&gt;Concluímos que pegar um livro popular (talvez um livro mais recente) e transformá-lo em um aplicativo pode ser lucrativo para os mercados do Google Play e da App Store. Os mercados já estão cheios de bibliotecas, então precisamos adicionar alguns recursos especiais além da versão bruta do livro. Isso pode incluir citações diárias do livro, uma versão em áudio do livro, questionários sobre o livro, um fórum onde as pessoas possam discutir o livro, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Referências&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Este projeto guiado faz parte do &lt;a href="https://www.dataquest.io/path/data-engineer/" rel="noopener noreferrer"&gt;&lt;em&gt;Data Enginnering Carreer Path&lt;/em&gt;&lt;/a&gt; proposto pela&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq6iq3cl7ceknfm116uch.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq6iq3cl7ceknfm116uch.png" alt=" " width="182" height="50"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>analytics</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Analisando Dados da App Store e Google Play - Parte I</title>
      <dc:creator>Lis Barreto</dc:creator>
      <pubDate>Fri, 28 Jan 2022 14:26:02 +0000</pubDate>
      <link>https://dev.to/lisrbarreto/projeto-analisando-dados-da-app-store-e-google-play-parte-i-2dl6</link>
      <guid>https://dev.to/lisrbarreto/projeto-analisando-dados-da-app-store-e-google-play-parte-i-2dl6</guid>
      <description>&lt;p&gt;Todo o conteúdo deste projeto pode ser encontrado no meu repositório do GitHub. Para mais detalhes, &lt;a href="https://github.com/lis-r-barreto/Data-Engineering-Portfolio" rel="noopener noreferrer"&gt;acesse o link&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Objetivo&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Nosso objetivo neste projeto é encontrar perfis de aplicativos móveis que sejam lucrativos para os mercados da App Store e Google Play. Estamos trabalhando como analistas de dados para uma empresa que desenvolve aplicativos para dispositivos móveis Android e iOS, e nosso trabalho é permitir que nossa equipe de desenvolvedores tome decisões baseadas em dados com relação ao tipo de aplicativo que constroem.&lt;/p&gt;

&lt;p&gt;Em nossa empresa, só criamos aplicativos de download e instalação gratuitos, e nossa principal fonte de receita consiste em anúncios no aplicativo. Isso significa que nossa receita para qualquer aplicativo é influenciada principalmente pelo número de usuários que usam nosso aplicativo. Nosso objetivo para este projeto é analisar dados para ajudar nossos desenvolvedores a entender quais tipos de aplicativos podem atrair mais usuários.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Explorando os Dados&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Em setembro de 2018, havia aproximadamente 2 milhões de aplicativos iOS disponíveis na App Store e 2,1 milhões de aplicativos Android no Google Play.&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%2Fs3.amazonaws.com%2Fdq-content%2F350%2Fpy1m8_statista.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%2Fs3.amazonaws.com%2Fdq-content%2F350%2Fpy1m8_statista.png" width="800" height="574"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Fonte: &lt;a href="https://www.statista.com/statistics/276623/number-of-apps-available-in-leading-app-stores/" rel="noopener noreferrer"&gt;Statista&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Coletar dados para mais de quatro milhões de aplicativos requer uma quantidade significativa de tempo e dinheiro, então, tentaremos analisar uma amostra de dados. Para evitar o gasto de recursos com a coleta de novos dados por conta própria, devemos primeiro tentar ver se podemos encontrar quaisquer dados existentes relevantes sem nenhum custo. Felizmente, esses são dois conjuntos de dados que parecem adequados para o nosso propósito:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.kaggle.com/lava18/google-play-store-apps" rel="noopener noreferrer"&gt;Um conjunto de dados&lt;/a&gt; contendo dados sobre aproximadamente dez mil aplicativos Android do Google Play. Você pode baixar o conjunto de dados através &lt;a href="https://dq-content.s3.amazonaws.com/350/googleplaystore.csv" rel="noopener noreferrer"&gt;desse link&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.kaggle.com/ramamet4/app-store-apple-data-set-10k-apps" rel="noopener noreferrer"&gt;Um conjunto de dados&lt;/a&gt; contendo dados sobre aproximadamente sete mil aplicativos iOS da App Store. Você pode baixar o conjunto de dados através &lt;a href="https://dq-content.s3.amazonaws.com/350/AppleStore.csv" rel="noopener noreferrer"&gt;desse link&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos começar abrindo os dois conjuntos de dados e, em seguida, continuar explorando os dados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;

&lt;span class="c1"&gt;### Dataset do Google Play
&lt;/span&gt;&lt;span class="n"&gt;opened_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;googleplaystore.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;read_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opened_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;android&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;read_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;android_header&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;android&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;android&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;android&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;

&lt;span class="c1"&gt;### Dataset da App Store
&lt;/span&gt;&lt;span class="n"&gt;opened_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;AppleStore.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;read_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opened_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;read_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ios_header&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ios&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;ios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ios&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para tornar mais fácil explorar os dois conjuntos de dados, primeiro escreveremos uma função chamada &lt;code&gt;explore_data ()&lt;/code&gt; que podemos usar repetidamente para explorar as linhas de uma forma mais legível. Também adicionaremos uma opção para nossa função para mostrar o número de linhas e colunas para qualquer conjunto de dados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;explore_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rows_and_columns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;dataset_slice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;    
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dataset_slice&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Adiciona uma nova linha vazia entre as outras linhas
&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;rows_and_columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Número de linhas:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Número de colunas:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;android_header&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;explore_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;android&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vemos que o conjunto de dados do Google Play tem 10841 aplicativos e 13 colunas. Em uma rápida olhada, as colunas que podem ser úteis para o propósito de nossa análise são &lt;code&gt;'App'&lt;/code&gt;, &lt;code&gt;'Category'&lt;/code&gt;, &lt;code&gt;'Reviews'&lt;/code&gt;, &lt;code&gt;'Installs'&lt;/code&gt;, &lt;code&gt;'Type'&lt;/code&gt;, &lt;code&gt;'Price'&lt;/code&gt;, e &lt;code&gt;'Genres'&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Agora vamos dar uma olhada no conjunto de dados da App Store.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ios_header&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;explore_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ios&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Temos 7197 aplicativos iOS neste conjunto de dados e as colunas que parecem interessantes são: &lt;code&gt;'track_name'&lt;/code&gt;, &lt;code&gt;'currency'&lt;/code&gt;, &lt;code&gt;'price'&lt;/code&gt;, &lt;code&gt;'rating_count_tot'&lt;/code&gt;, &lt;code&gt;'rating_count_ver'&lt;/code&gt; e &lt;code&gt;'prime_genre'&lt;/code&gt;. Nem todos os nomes de coluna são autoexplicativos neste caso, mas os detalhes sobre cada coluna podem ser encontrados na &lt;a href="https://www.kaggle.com/ramamet4/app-store-apple-data-set-10k-apps/home" rel="noopener noreferrer"&gt;documentação do conjunto de dados&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Deletando Dados Errados&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;O conjunto de dados do Google Play tem uma &lt;a href="https://www.kaggle.com/lava18/google-play-store-apps/discussion" rel="noopener noreferrer"&gt;seção de discussão&lt;/a&gt; dedicada e podemos ver que &lt;a href="https://www.kaggle.com/lava18/google-play-store-apps/discussion/66015" rel="noopener noreferrer"&gt;uma das discussões&lt;/a&gt; descreve um erro para a linha 10472. Vamos imprimir esta linha e compará-la com o cabeçalho e outra linha que está correta.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;android&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10472&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# linha incorreta
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;android_header&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# cabeçalho
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;android&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;      &lt;span class="c1"&gt;# linha correta
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A linha 10472 corresponde ao aplicativo &lt;em&gt;Life Made WI-Fi Touchscreen Photo Frame&lt;/em&gt;, e podemos ver que a classificação é 19. Isso está claramente desativado porque a classificação máxima para um aplicativo do Google Play é 5 (conforme mencionado na &lt;a href="https://www.kaggle.com/lava18/google-play-store-apps/discussion/66015" rel="noopener noreferrer"&gt;seção de discussões&lt;/a&gt;, este problema é causado por um valor ausente na coluna &lt;code&gt;'Categoria'&lt;/code&gt;). Como consequência, vamos deletar esta linha.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;android&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;android&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10472&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# não execute essa linha de código mais de uma vez
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;android&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Removendo Entradas Duplicadas&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Parte I&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Se explorarmos o conjunto de dados do Google Play por tempo suficiente, descobriremos que alguns aplicativos têm mais de uma entrada. Por exemplo, o aplicativo Instagram possui quatro entradas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;android&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Instagram&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No total, existem 1.181 casos em que um aplicativo ocorre mais de uma vez:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;duplicate_apps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="n"&gt;unique_apps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;android&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;unique_apps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;duplicate_apps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;unique_apps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Número de aplicativos duplicados:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;duplicate_apps&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Examplos de aplicativos duplicados:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;duplicate_apps&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Não queremos contar determinados aplicativos mais de uma vez quando analisamos os dados, então precisamos remover as entradas duplicadas e manter apenas uma entrada por aplicativo. Uma coisa que poderíamos fazer é remover as linhas duplicadas aleatoriamente, mas provavelmente poderíamos encontrar uma maneira melhor.&lt;/p&gt;

&lt;p&gt;Se você examinar as linhas que imprimimos nas duas células acima para o aplicativo Instagram, a principal diferença acontece na quarta posição de cada linha, que corresponde ao número de comentários. Os diferentes números mostram que os dados foram coletados em momentos diferentes. Podemos usar isso para construir um critério para manter as linhas. Não removeremos as linhas aleatoriamente, mas manteremos as linhas com o maior número de revisões, pois quanto maior o número de revisões, mais confiáveis ​​serão as avaliações.&lt;/p&gt;

&lt;p&gt;Para fazer isso, vamos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Criar um dicionário em que cada chave seja um nome de aplicativo exclusivo e o valor seja o maior número de avaliações desse aplicativo;&lt;/li&gt;
&lt;li&gt;Usar o dicionário para criar um novo conjunto de dados, que terá apenas uma entrada por aplicativo (e apenas selecionamos os aplicativos com o maior número de avaliações)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Parte II&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Vamos começar construindo o dicionário.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;reviews_max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;android&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;n_reviews&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;reviews_max&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;reviews_max&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;n_reviews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;reviews_max&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;n_reviews&lt;/span&gt;

    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;reviews_max&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;reviews_max&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;n_reviews&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em uma célula de código anterior, descobrimos que existem 1.181 casos em que um aplicativo ocorre mais de uma vez, portanto, o comprimento do nosso dicionário (de aplicativos exclusivos) deve ser igual à diferença entre o comprimento do nosso conjunto de dados e 1.181.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Tamanho esperado:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;android&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1181&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Tamanho atual:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reviews_max&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, vamos usar o dicionário &lt;code&gt;reviews_max&lt;/code&gt; para remover as duplicatas. Para os casos duplicados, manteremos apenas as entradas com o maior número de revisões. Na célula de código abaixo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Começamos inicializando duas listas vazias, &lt;code&gt;android_clean&lt;/code&gt; e&lt;code&gt;already_added&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Fazemos loop através do conjunto de dados &lt;code&gt;android&lt;/code&gt; e para cada iteração:

&lt;ul&gt;
&lt;li&gt;Isolamos o nome do aplicativo e o número de avaliações.&lt;/li&gt;
&lt;li&gt;Adicionamos a linha atual (&lt;code&gt;app&lt;/code&gt;) à lista&lt;code&gt;android_clean&lt;/code&gt;, e o nome do aplicativo (&lt;code&gt;name&lt;/code&gt;) à lista&lt;code&gt;already_added&lt;/code&gt; se:

&lt;ul&gt;
&lt;li&gt;O número de comentários do aplicativo atual corresponde ao número de comentários desse aplicativo, conforme descrito no dicionário &lt;code&gt;reviews_max&lt;/code&gt;; e&lt;/li&gt;
&lt;li&gt;O nome do aplicativo ainda não está na lista &lt;code&gt;already_added&lt;/code&gt;. Precisamos adicionar essa condição suplementar para contabilizar os casos em que o maior número de avaliações de um aplicativo duplicado é o mesmo para mais de uma entrada (por exemplo, o aplicativo Box tem três entradas e o número de avaliações é o mesmo) . Se apenas verificarmos por &lt;code&gt;reviews_max [name] == n_reviews&lt;/code&gt;, ainda acabaremos com entradas duplicadas para alguns aplicativos.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;android_clean&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="n"&gt;already_added&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;android&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;n_reviews&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="nf"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reviews_max&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;n_reviews&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;already_added&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;android_clean&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;already_added&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# certifique-se de estar dentro do bloco
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos explorar rapidamente o novo conjunto de dados e confirmar se o número de linhas é 9.659.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;explore_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;android_clean&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Temos 9659 linhas, exatamente como o esperado.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Removendo aplicativos que não sejam em inglês&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Parte I&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Se você explorar os conjuntos de dados o suficiente, notará que os nomes de alguns dos aplicativos sugerem que eles não são direcionados a um público que fala inglês. Abaixo, vemos alguns exemplos de ambos os conjuntos de dados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ios&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;813&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ios&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6731&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;android_clean&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4412&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;android_clean&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7940&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Não estamos interessados em manter esse tipo de aplicativo, então vamos removê-lo. Uma maneira de fazer isso é remover cada aplicativo cujo nome contém um símbolo que não é comumente usado no texto em inglês - o texto em inglês geralmente inclui letras do alfabeto inglês, números compostos por dígitos de 0 a 9, sinais de pontuação (.,! ,?,;, etc.) e outros símbolos (+, *, /, etc.).&lt;/p&gt;

&lt;p&gt;Todos esses caracteres que são específicos para textos em inglês são codificados usando o padrão ASCII. Cada caractere ASCII tem um número correspondente entre 0 e 127 associado a ele, e podemos aproveitar isso para construir uma função que verifica o nome de um aplicativo e nos diz se ele contém caracteres não ASCII.&lt;/p&gt;

&lt;p&gt;Construímos esta função abaixo e usamos a função incorporada &lt;code&gt;ord ()&lt;/code&gt; para descobrir o número de codificação correspondente de cada caractere.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_english&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;character&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;character&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;is_english&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Instagram&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;is_english&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;爱奇艺PPS -《欢乐颂2》电视剧热播&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A função parece funcionar bem, mas alguns nomes de aplicativos em inglês usam emojis ou outros símbolos (™, - (traço), - (traço), etc.) que estão fora da faixa ASCII. Por causa disso, removeremos aplicativos úteis se usarmos a função em sua forma atual.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;is_english&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Docs To Go™ Free Office Suite&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;is_english&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Instachat 😜&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;™&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;😜&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Parte II&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Para minimizar o impacto da perda de dados, removeremos um aplicativo apenas se seu nome tiver mais de três caracteres não ASCII:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_english&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;non_ascii&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;character&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;character&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;non_ascii&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;non_ascii&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;is_english&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Docs To Go™ Free Office Suite&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;is_english&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Instachat 😜&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A função ainda não é perfeita e muito poucos aplicativos que não sejam em inglês podem passar por nosso filtro, mas isso parece bom o suficiente neste ponto de nossa análise - não devemos gastar muito tempo com otimização neste ponto.&lt;/p&gt;

&lt;p&gt;Abaixo, usamos a função &lt;code&gt;is_english ()&lt;/code&gt; para filtrar os aplicativos em outros idiomas para ambos os conjuntos de dados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;android_english&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="n"&gt;ios_english&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;android_clean&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;is_english&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;android_english&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ios&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;is_english&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;ios_english&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;explore_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;android_english&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;explore_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ios_english&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos ver que ficamos com 9.614 aplicativos para Android e 6.183 aplicativos para iOS.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Isolando os aplicativos gratuitos&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Como mencionamos na introdução, apenas criamos aplicativos cujo download e instalação são gratuitos, e nossa principal fonte de receita consiste em anúncios no aplicativo. Nossos conjuntos de dados contêm aplicativos gratuitos e não livres, e precisaremos isolar apenas os aplicativos gratuitos para nossa análise. Abaixo, isolamos os aplicativos gratuitos para ambos os nossos conjuntos de dados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;android_final&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="n"&gt;ios_final&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;android_english&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;android_final&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ios_english&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0.0&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;ios_final&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;android_final&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ios_final&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ficamos com 8864 aplicativos para Android e 3222 aplicativos para iOS, o que deve ser suficiente para nossa análise.&lt;/p&gt;

</description>
      <category>python</category>
      <category>analytics</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
