Skip to content

O Desafio Python tem como objetivo reflitir alguns desafios que um Engenheiro de Dados possa enfrentar na Sauter.

License

Notifications You must be signed in to change notification settings

cicerooficial/desafio-case-python-sauter

Repository files navigation

Logo Sauter

Desafio Sauter: Capturar dados de Loja de Aplicativo - Google Play


📌 Tópicos:


📝 Descrição do projeto

O Desafio Python tem como objetivo refletir alguns desafios que um Engenheiro de Dados possa enfrentar na Sauter.

⚠ É importante saber que há múltiplos formatos para a resolução do desafio e será necessário consultar documentações (algumas das quais estão identificadas abaixo).


🎯 Objetivos

✅ Tarefa 1:

Sua primeira tarefa é utilizar a library google-play-scrape para capturar dados de apps. O app selecionado é o Alexa, da Amazon.

  1. Utilizando as informações de avaliação do aplicativo, você deve chegar em um Data Frame de review parecido com o demonstrado abaixo:

DataFrame_Example

A partir desse Data Frame, seguem as atividades propostas na tarefa:

  1. Criar 3 arquivos .csv a partir do dataframe, com a seguinte classificação:

    1. aval_positiva.csv para score maior ou igual a 4;
    2. aval_neutra.csv para score igual a 3;
    3. aval_negativa.csv para score inferior a 3.
  2. Criar um report simples para essas variáveis utilizando a library pandas-profiling para cada uma das separações (aval_neutra, aval_positiva, aval_negativa).
    ⚠ É importante notar os principais pontos de cada análise para sua apresentação.
    Finalmente, salvar o resultado do profile em formato .html.

✅ Tarefa 2:

  1. A partir dos dados criados, subir as tabelas para um banco de dados. Aqui é completamente opcional qual banco de dados utilizar, mas considerar utilizar o BigQuery da Google, pois é totalmente gratuito (para o tamanho do dataset) e em cloud.

    ⚠ Caso prefira utilizar outro banco de dados de seu domínio também vale como problema resolvido.

✅ Tarefa 3:

  1. Criar objeto com operações de captura de dados, com atualização da tabela. O objetivo aqui é criar um pipeline simplificado de dados para o banco, de forma que a tabela seja sempre atualizada com as últimas informações de reviews.

Design de pipeline proposto com Airflow:

Design Pipeline Airflow


❗ Pré-requisitos

Tarefa 1

Para realização da Tarefa 1 utilize alguma plataforma notebook de sua preferência.

Exemplo: Google Colab Jupiter Notebook

Entre outros...

Tarefa 2

Para realização da Tarefa 2 é possível realizar de forma manual pela plataforma do Google CLoud Platform ou através de comandos no próprio Google Colab ou Jupiter Notebook.

Tarefa 3

Para a Tarefa 3, configure o docker em sua máquina (no caso utilizei Windows) seguindo os passos abaixo:

Configurando o Docker em sua máquina:

Download Docker: Docker

Download Docker Compose: Docker Compose

Instalação Docker - Windows

  1. Verificar se o Windows está atualizado. Caso seja inferiro a 18362, clique no link ao lado para atualizar o Windows 10. Atualizar o Windows;
  2. Pesquise por Ativar ou desativar recursos do Windows e siga os passos abaixo:
    • Desativar Hyper-V;
    • Desativar Plataforma do Hipervisor do Windows;
    • Habilitar a Plataforma de Máquina Virtual;
    • Habilitar o Subsistema do Windows para Linux (WSL).
  3. Faça o Download do WSL 2 clicando no link ao lado: Download WSL 2;
  4. Acesse a Microsoft Store, e faça download e instale a distribuição Linux Ubuntu 20.04 LTS (recomendado);
  5. Instale o Docker Desktop no Windows: Docker Desktop;
    • Obs: Abra o Docker Desktop e verifique se estão habilitados o "Enable integration with my default WSL distro" e "Ubuntu-20.04" em Settings->Resource->WSL Integration.

Instalação do Apache Airflow no Docker

  • Documentação - Executando o Airflow no Docker
  • Abra o terminal do WSL2 e crie um diretório para o projeto no home/<seu-diretório> com o comando: mkdir apache-airflow;
  • Acesse o diretório cd apache-airflow;
  • No diretório apache-airflow, baixe o arquivo docker-compose.yaml disponibilizado na documentação oficial através do comando: curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.2.3/docker-compose.yaml';
  • Confirme se o arquivo foi baixado com o comando de listar: ls;
  • No Linux , o início rápido precisa saber a id do usuário do host e precisa ter a id do grupo definida como 0. Caso contrário, os arquivos criados no dags, logs e plugins serão criados com usuário root. Você deve certificar-se de configurá-los para o docker-compose: mkdir -p ./dags ./logs ./plugins | echo -e "AIRFLOW_UID=$(id -u)" > .env;
  • Em todos os sistemas operacionais, você precisa executar migrações de banco de dados e criar a primeira conta de usuário. Para fazer isso, execute: docker-compose up airflow-init;
  • Inicie todos os serviços através do comando: docker-compose up -d; Instalação Airflow Terminal
  • Acesse o servidor web do Apache Airflow disponível em: http://localhost:8080. A conta padrão possui o login airflow e a senha airflow. Acesso ao Apache Airflow

🔄 Como rodar a aplicação

  • Tarefa 1 - Capturar dados de Loja de Aplicativo - Google Play

    1. Acessar o Google Colab: https://colab.research.google.com/drive/1ak9TAlvzWBj5Hh39swM8iG-uF1dVaDe6?usp=sharing;
    2. Acessar diretamente o arquivo no diretório: Google Colab - Capturando dados com Google-Play-Scraper
  • Tarefa 2 - Subir as tabelas para um BD

    1. Acesse o arquivo com o passo a passo manual: Armazenar dados no BigQuery;
    2. Siga os passos dentro do Google Colab Google Colab - Capturando dados com Google-Play-Scraper no tópico Enviar dados CSV para bucket no Cloud Storage e Big Query.
  • Tarefa 3 - Criar Pipeline de dados

    1. Transfira os arquivos do pipeline da Pasta dags para a pasta dags do Airflow (esta pasta foi criada no momento da instalação juntamente com as pastas logs e plugins no último passo do tópico Instalação do Apache Airflow no Docker). Utilize o comando cp /mnt/c/Users/<caminho onde até a pasta desafio-case-python-sauter>/dags /home/<seu diretório>/apache airflow/;
    2. Acesso o arquivo etl_with_gcp_and_airflow.py dentro da pasta dags/etl_with_gcp_and_airflow. Dentro do arquivo, na funçao def __init__(self) comente as linhas com o caminho para teste WINDOWS e descomente as linhas de teste para LINUX.
    3. A fim de evitar conflitos por falta de dependências, execute o arquivo shell dentro da pasta \dags\etl_with_gcp_and_airflow:
      • Dentro da pasta mencionada, acesso o arquivo através do de um editor de texto de sua oreferência (no caso utilizei o NANO). Através do comando nano pip_install_requirements.sh desabilite os comentários de acordo com seu sistema operacional. Salve com o comando CTRL + O e depois feche o editor de texto com o comando CTRL + X; Instalação pip e requirements.txt
      • Agora (no WSL/Linux) execute o script através do comando sh pip_install_requirements.sh.
    4. Crie uma conta se serviço para autenticação de acesso ao Google Cloud seguindo os passos através do link: Como criar uma conta de serviço e salve o arquivo dentro da pasta \dags\etl_with_gcp_and_airflow;
    5. Com as configurações necessárias realizadas, (caso não esteja com o Apache Airflow iniciado) execute o comando docker-compose up -d dentro do diretório onde o arquivo se encontra: /home/<seu diretório>/apache airflow;
    6. Acesse o servidor web do Apache Airflow disponível em: http://localhost:8080. A conta padrão possui o login airflow e a senha airflow;
    7. Dentro do Apache Airflow, na aba DAGs, procure pelo DAG pipeline_etl_with_gcp_and_airflow e execute para certificar que tudo está funcionando corretamente. Por padrão as sinalizações de execução devem conter o status com a cor verde, indicando sucess na execução.
      • Abaixo segue os prints de demonstração das Dags com status de Sucess:
      • Pipeline completo no Airflow: Painel Pipeline OK 1 Painel Pipeline OK 2
        Obs.: O arquivo script_etl_with_gcp_and_airflow.py realizará todas as funções de ETL. Obs.: Atentar em realizar o passo 2, antes da execução.

🗃 Linguagens, dependencias e libs utilizadas

Lang/Lib/Framwork Version
Python 3.10
google-play-scraper 1.0.2
pandas 1.3.5
pandas-profiling 3.1.0
pandas_gbq 0.15.0
Docker 4.3.2
Docker Compose 1.29.2
Apache Airflow 2.0.2
google-cloud-storage 1.43.0
pip 21.3.1
Google Cloud Storage (GCS)
Google BigQuery (GBQ)
Google Colab
Visual Studio Code

📚 Referências


📎 Conclusão

Com o desenvolvido do projeto foi possível obter maiores conhecimentos de libs que facilitam o trabalho de ETL (Extração, Transformação e Carregamento) para o dia a dia de um Engenheiro de Dados, como:

  1. Utilizar a lib google-plat-scraper em vez da comumente usada beautifulsoup;
  2. um diferencial foi conhecer a lib pandas-profiling, com acesso a funções de análise de dados de forma rápida e bem completa para usos mais comuns, encurtando o processo de construção de scripts para cada tipo de análise;
  3. Utilizar o Google Coud Storage em formato de comandos, já que através do qwiklabs é demonstrado em formato manual em sua forma normal;
  4. Um dos maiores desafios dentre os 3 foi buscar informações sobre como construir as DAGs no Apache Airflow. Sua documentação principal é mais limitada, mas após encontrar a documentação com exemplos de Pipeline, foi possível ter uma maior clareza e rapidez em montar as Tasks e DAGs.

Por fim, o desafio foi uma ótima oportunidade de auto desafio, confiança em desenvolver um projeto "real" utilizando tantas stacks diferentes e construção de um projeto que servirá também como portifólio.

Aprendizados:

A maior dificuldade foi em tentar resolver o erro de módulo google-play-scraper não identificado no Apache Airflow.

Busquei desenvolver o pipeline completo seguindo o script etl_with_gcp_and_airflow.py, mas, devido o Apache Airflow ainda não possuir dentro de seu repositório de providers do Google suporte ao módulo do google-play-scrapper (conforme a documentação Módulos de providers do google disponíveis), não foi possível realizar o pipeline com a função de capturar os dados, somente as funções de download dos CSVs do Cloud Storage e envio ao Big Query foi possível realizar (Conforme solicitado no objetivo de tarefa 3).

Caso deseje executar o script completo, descomente as últimas linhas do arquivo da função main, execute os comandos para evitar erros de dependências ao executar o script.