image

Bootcamps ilimitados e +650 cursos pra sempre

60
%OFF
Article image
Cainã Pinto
Cainã Pinto25/09/2025 00:15
Compartilhe

Python além da ciência de dados: construindo APIs, insights e testes robustos

    Quando se fala em Python, muitos associam imediatamente à ciência de dados. Mas será que o Python se limita apenas a essa área? A resposta é não. A linguagem alcança diversos campos, como backend, frontend, automação de testes e até mesmo inteligência artificial.

    Este artigo aprofunda-se em três bibliotecas que representam bem essa versatilidade:

    • Pandas, para manipulação e análise de dados.
    • Flask, para criação de APIs e servidores leves.
    • Pytest, para garantir qualidade com testes simples e poderosos.

    Essas três ferramentas ajudam a quebrar a visão de que Python se restringe a dados. Tudo depende do contexto, e em inúmeras aplicações o Python demonstra ser altamente eficiente.

    Python e sua versatilidade além da análise de dados

    Python foi criado por Guido van Rossum no final da década de 1980 e lançado em 1991. Desde o início, não foi projetado apenas para ser uma potência em dados, mas sim como uma linguagem simples, com foco em legibilidade de código.

    A proposta original era ser uma linguagem de script fácil de aprender, com sintaxe limpa, voltada à automação de tarefas.

    O grande crescimento do uso de Python em ciência de dados ocorreu após o surgimento de bibliotecas poderosas como NumPy, Pandas e Matplotlib, no início dos anos 2000.

    Essas ferramentas transformaram a análise em algo prático, possibilitando visualização e processamento de grandes volumes de dados de forma acessível.

    Embora hoje Python seja um símbolo de Data Science e Machine Learning, essa é apenas uma das muitas capacidades da linguagem.

    Manipulando e explorando dados com Pandas

    O que é um DataFrame?

    A analogia mais simples para entender um DataFrame é compará-lo a uma planilha do Excel ou a uma tabela de banco de dados.

    Um DataFrame do Pandas é uma estrutura de dados bidimensional (linhas e colunas):

    • Cada coluna pode armazenar um tipo de dado diferente (texto, números, datas etc.).
    • Cada linha representa um registro.
    • Tanto linhas quanto colunas possuem rótulos (índices), o que facilita a manipulação.

    O objetivo principal da biblioteca Pandas é a manipulação e o tratamento de dados de forma simples e eficiente.

    Leitura de dados

    Uma das maiores vantagens do Pandas está na facilidade em carregar e tratar dados de diferentes fontes.

    Exemplo:

    import pandas as pd
    
     
    
    # Lendo um arquivo CSV (Comma-Separated Values)
    
    df_csv = pd.read_csv('caminho/para/seu/arquivo.csv')
    
    print("Dados carregados de um CSV:"
    
    print(df_csv.head()) # .head() mostra as 5 primeiras linhas
    
    #  Lendo de um banco de dados SQL
    
    from sqlalchemy import create_engine
    
    engine = create_engine('sqlite:///meu_banco.db')
    
    query = "SELECT * FROM tabela_de_vendas"
    
    df_sql = pd.read_sql(query, engine)
    
    print("\nDados carregados de um banco SQL:")
    
    print(df_sql.head())
    

    Essa manipulação de dados tem importância fundamental. A possibilidade de trabalhar com qualquer tipo de dado ajudou a consolidar o Python como símbolo do Data Science.

    Exemplo prático:

    #Podemos analisar no momento uma aplicação de tabela

     import pandas as pd
    
     
    
    # Criando um DataFrame de exemplo
    
    dados = {
    
      'Produto': ['Notebook', 'Mouse', 'Teclado', 'Monitor', 'Notebook', 'Webcam'],
    
      'Categoria': ['Eletrônicos', 'Acessórios', 'Acessórios', 'Eletrônicos', 'Eletrônicos', 'Acessórios'],
    
      'Valor': [3500, 150, 200, 1800, 3200, 400],
    
      'Quantidade': [1, 3, 2, 1, 2, 1]
    
    }
    
    df_vendas = pd.DataFrame(dados)
    

    A saida do DataFrame sera:

    image

    O que é uma API? A ponte entre aplicações

    Uma API (Interface de Programação de Aplicações) funciona como um garçom em um restaurante. O usuário não vai à cozinha pegar a própria comida; solicita ao garçom, que traz o pedido.

    A API atua como intermediária, permitindo que diferentes sistemas se comuniquem e troquem informações de forma organizada e segura.

    Por que Flask? Por que utilizá-lo?

    O Flask é um microframework que oferece desempenho poderoso mesmo sendo "micro". Permite construir aplicações web sem impor estruturas rígidas ou ferramentas desnecessárias.

    Ele fornece o básico: rotas e tratamento de requisições. Se necessário, permite integração de funcionalidades adicionais. Assim, torna-se:

    • Leve e rápido: inicia rapidamente e consome poucos recursos.
    • Flexível: o desenvolvedor tem controle total sobre a estrutura do projeto e bibliotecas.
    • Prótipagem: ideal para iniciar projetos, fácil de aprender e construir APIs.
    Exemplo prático: Servindo dados de vendas

    A seguir, apresenta-se um código demonstrando a integração entre Flask e Pandas para criar uma API simples.

    # Primeiro, certifique-se de instalar o Flask: pip install Flask
    
    import pandas as pd
    
    from flask import Flask, jsonify
    
     
    
    # 1. Crie a aplicação Flask
    
    app = Flask(__name__)
    
     
    
    # 2. Recrie o mesmo DataFrame da seção anterior
    
    dados = {
    
      'Produto': ['Notebook', 'Mouse', 'Teclado', 'Monitor', 'Notebook', 'Webcam'],
    
      'Categoria': ['Eletrônicos', 'Acessórios', 'Acessórios', 'Eletrônicos', 'Eletrônicos', 'Acessórios'],
    
      'Valor': [3500, 150, 200, 1800, 3200, 400]
    
    }
    
    df_vendas = pd.DataFrame(dados)
    
     
    
     
    
    # 3. Defina a rota da API
    
    @app.route('/vendas', methods=['GET'])
    
    def get_vendas():
    
      # Converte o DataFrame para um dicionário e depois para JSON
    
      vendas_json = df_vendas.to_dict(orient='records')
    
      return jsonify(vendas_json)
    
     
    
    # 4. Rode a aplicação (isso é geralmente feito no terminal)
    
    if __name__ == '__main__':
    
              # O comando no terminal seria "flask run"
    
    # Mas para rodar como um script Python, usamos app.run()
    
      app.run(debug=True)
    

    O código cria um servidor web com Flask e carrega os dados de vendas em um DataFrame do Pandas.

    Em seguida, define-se uma rota chamada /vendas. Ao acessar o endereço do servidor seguido de /vendas, a função get_vendas é executada.

    A função converte o DataFrame para o formato JSON, padrão de comunicação web, e retorna os dados, permitindo que outros sistemas ou interfaces consumam essas informações.

    image

    image

    Com poucas linhas, foi criado um microserviço. Ele permite que dados de vendas sejam disponibilizados em tempo real, mesmo em bancos de dados grandes com muitas linhas e colunas.

    Possíveis aplicações incluem:

    • Uma equipe de front-end pode construir dashboards interativos que consomem a API e exibem os dados em gráficos.
    • Aplicativos móveis podem acessar a API e mostrar informações de vendas na palma da mão.
    • Sistemas internos podem usar a API para controle de estoque, identificando produtos mais vendidos.
    Garantindo Qualidade com Pytest

    Construir um software sem testes é comparável a construir uma ponte e só verificar sua segurança quando o primeiro carro passar por cima. Um código sem testes pode funcionar no desenvolvimento, mas falhar em produção.

    Existem técnicas para testar aplicações antes da entrega, como BDD (Behavior Driven Development), TDD (Test Driven Development) e testes unitários.

    Essa prática cria um código confiável, seguindo o conceito conhecido como Pirâmide de Testes.

    image

    • Base forte em testes unitários
    • Menos testes de integração
    • Poucos testes end-to-end (E2E)

    Essa pirâmide organiza os testes em três níveis principais.

    Na base, os Testes Unitários são os mais numerosos; eles verificam a menor parte do código de forma isolada, como uma única função, garantindo que a lógica interna dela está correta.

    No meio, os Testes de Integração verificam se diferentes partes do sistema conversam corretamente entre si por exemplo, se a nossa API Flask consegue se conectar e buscar dados de um banco de dados real.

    No topo, os Testes End-to-End (E2E) são os menos numerosos, mas simulam a jornada completa de um usuário, garantindo que o fluxo completo da aplicação funciona como esperado, desde o clique em um botão na tela até a resposta da API.

    A ausência desses testes pode acarretar falhas em produção, como:Bugs inesperados

    • Perda de dados
    • Queda de credibilidade
    • Custos mais altos

    Testes automatizados funcionam como uma rede de segurança para desenvolvedores, garantindo confiabilidade nas aplicações.

    Testes usando Pytest

    O Pytest é um framework que torna a escrita de testes em Python simples e legível. Ele segue uma convenção básica: criar um arquivo chamado test_*.py e, dentro dele, funções que comecem com test_*.

    Um exemplo simples é a simulação de uma função de soma:

    Arquivo calculadora.py

    def somar(a, b):
    
      """Esta função retorna a soma de dois números."""
    
      return a + b
    

    Arquivo test_calculadora.py:

    from calculadora import somar
    
    def test_soma_positiva():
    
      """Testa a soma de dois números positivos."""
    
      assert somar(2, 3) == 5
    
    def test_soma_negativa():
    
      """Testa a soma de dois números negativos."""
    
      assert somar(-1, -1) == -2
    

    Note-se como é simples: utiliza-se apenas assert para verificar se o resultado de somar(2, 3) é 5. Não é necessário conteúdo complexo, pois o Pytest gerencia todo o processo.

    Foram criadas e verificadas funções simples; entretanto, o verdadeiro poder de verificação ocorre quando ele é utilizado em uma aplicação.

    Analisando a aplicação do projeto, é possível simular uma ação em que se verifica se a rota /vendas:

    • Responde com sucesso (código de status 200)
    • Retorna os dados no formato JSON
    • Contém a quantidade correta de registros

    Arquivo test_app.py:

    import pytest
    
    from app import app # Importamos nossa aplicação Flask do arquivo app.py
    
     
    
    @pytest.fixture
    
    def client():
    
      """Cria um cliente de teste para nossa aplicação Flask."""
    
      with app.test_client() as client:
    
          yield client
    
     
    
    def test_get_vendas_sucesso(client):
    
      """Testa se a rota /vendas responde corretamente."""
    
      # 1. Faz uma requisição GET para a rota /vendas
    
      response = client.get('/vendas')
    
     
    
      # 2. Verifica se a resposta foi bem-sucedida (status code 200)
    
      assert response.status_code == 200
    
     
    
      # 3. Verifica se o conteúdo da resposta é JSON
    
      assert response.is_json
    
     
    
      # 4. Pega os dados JSON da resposta
    
      dados = response.get_json()
    
     
    
      # 5. Verifica se os dados são uma lista e se contêm 6 itens
    
      assert isinstance(dados, list)
    
      assert len(dados) == 6
    
     
    
      # 6. Verifica um dado específico para garantir a integridade
    
      assert dados[0]['Produto'] == 'Notebook'
    

    Analisando o código, a função decorada com @pytest.fixture, chamada client, é uma das funcionalidades mais poderosas do Pytest.

    Ela prepara o ambiente para execução dos testes, garantindo que cada função tenha os recursos necessários de forma automatizada. Neste caso, client inicializa um “cliente de teste” da aplicação Flask, simulando o comportamento de um navegador que interage com a API.

    O comando yield client fornece o cliente pronto para a função de teste e, ao final, realiza a limpeza do ambiente, evitando efeitos colaterais entre testes. Dessa forma, a função test_get_vendas_sucesso recebe client como argumento.

    O Pytest injeta automaticamente essa preparação, tornando os testes limpos, reutilizáveis e consistentes.

    A função utiliza o cliente para acessar a rota /vendas e aplica asserts para verificar status, formato JSON e integridade dos dados, garantindo robustez da aplicação.

    image

    A saída verde e a mensagem “3 passed” indicam que todos os testes, tanto da função somar quanto da API, foram executados com sucesso. Isso proporciona benefícios como:

    • Confiança no código: a execução de testes após melhorias garante que nenhuma alteração quebrou funcionalidades existentes.
    • Automação: com um simples comando, é possível realizar centenas de testes em segundos, economizando tempo e prevenindo erros humanos.
    • Aprendizado facilitado: a utilização correta cria uma linha de desenvolvimento mais clara, facilitando a curva de aprendizado.
    Desafios comuns e soluções práticas

    Construir o fluxo inicial com Pandas, Flask e Pytest é rápido e poderoso. No entanto, à medida que um projeto evolui do protótipo para a produção, surgem novos desafios. Serão abordados três dos mais comuns, explorando soluções robustas que o ecossistema Python oferece.

    Desempenho do Pandas com grandes volumes de dados

    Pandas é excelente para manipulação de dados, mas pode apresentar limitações com datasets muito grandes (milhões de linhas). Algumas soluções incluem:

    • Utilizar chunks (pd.read_csv(..., chunksize=10000)) para processar lotes de dados.
    • Migrar para bibliotecas escaláveis, como Dask (processamento distribuído) ou Polars (colunar, mais rápido).
    • Em cenários corporativos, considerar integração com bancos SQL para consultas otimizadas.

    Estruturação de APIs em Flask conforme o projeto cresce

    Projetos Flask pequenos funcionam bem em um único arquivo, mas à medida que o código cresce, a manutenção pode se tornar complicada. Algumas soluções incluem:

    • Utilizar Blueprints, que permitem organizar rotas em módulos separados.
    • Adotar padrões como Service Layer e Repository Pattern para separar a lógica de negócios da camada web.
    • Para aplicações maiores, considerar migração para FastAPI, que oferece tipagem forte e documentação automática.

    Manutenção de testes automatizados

    Em equipes grandes ou projetos longos, manter os testes atualizados pode ser desafiador. Testes quebrados ou mal escritos acabam sendo ignorados. Algumas soluções incluem:

    • Integrar o Pytest ao CI/CD (ex.: GitHub Actions, GitLab CI, Azure DevOps), garantindo que cada commit execute os testes automaticamente.
    • Utilizar marcadores do Pytest (@pytest.mark.slow, @pytest.mark.integration) para separar tipos de testes.
    • Adotar a filosofia “testar o que importa”, priorizando testes de regras de negócio críticas em vez de tentar cobrir tudo.

    Aplicações práticas e próximos passos

    Após percorrer o ciclo completo, da manipulação de dados com Pandas à criação de APIs robustas com Flask e testes com Pytest, surge a questão: onde aplicar esse conhecimento? A combinação dessas ferramentas abre diversas possibilidades, desde projetos simples até a base de aplicações complexas.

     Alguns exemplos práticos incluem:

    • Sistemas internos (Dashboards e relatórios):

    Equipes podem usar Pandas para processar dados de campanhas, Flask para expor métricas (CPC, taxa de conversão) e dashboards simples para visualização. Em poucos dias, surge uma solução interna barata e personalizada.

    • Protótipos rápidos para startups (MVP):

    Com Pandas e Flask, é possível validar ideias de negócio de forma ágil. O Pytest garante estabilidade, permitindo entregar um produto funcional rapidamente a investidores ou usuários iniciais.

    • Projetos acadêmicos e científicos:

    Pesquisadores podem usar Pandas para análise de dados e Flask para criar APIs, permitindo que outros cientistas reproduzam experimentos e explorem novos parâmetros, em vez de publicar apenas resultados estáticos.

    • Backend de aplicações reais:

    O Flask é utilizado em larga escala por empresas como Netflix e Reddit. Em produção, deve ser executado com servidores como Gunicorn atrás de um Nginx, garantindo escalabilidade e segurança.

    Possibilidades de expansão

    • Evoluindo com FastAPI: APIs mais rápidas, tipadas e com documentação automática.
    • Empacotando com Docker: garante que a aplicação funcione de forma consistente em qualquer máquina ou servidor.
    • Automatizando com CI/CD: GitHub Actions executa os testes a cada push, proporcionando confiança contínua.
    • Integrando Machine Learning: Pandas com Scikit-learn permite treinar modelos e expô-los em rotas Flask, como /predict, levando inteligência em tempo real para produção.

    Conclusão

    Limitar o Python ao universo dos dados é subestimar sua versatilidade e potência. A jornada apresentada neste artigo demonstra que Python permite criar fluxos de trabalho completos e profissionais.

    Partindo do Pandas, foram extraídos insights valiosos de dados brutos, estruturando informações essenciais para o projeto.

    Em seguida, Flask foi usado para construir um backend ágil, transformando os dados em um serviço funcional acessível via API.

    Por fim, Pytest garantiu a qualidade e confiabilidade da aplicação, mostrando que velocidade e robustez podem coexistir.

    O ecossistema Python, com bibliotecas maduras e sintaxe simples, permite que equipes pequenas construam, testem e entreguem soluções completas em tempo recorde.

    Seja para criar dashboards internos, validar ideias de negócio ou colocar modelos em produção, as ferramentas certas estão disponíveis. O próximo passo é experimentar em projetos pequenos e explorar todo o potencial do Python.

    Referências

    Para saber mais sobre as bibliotecas mencionadas e aprofundar seus conhecimentos, seguem os links para as documentações oficiais:

    Compartilhe
    Recomendados para você
    Cognizant - Mobile Developer
    Luizalabs - Back-end com Python
    PcD Tech Bradesco - Java & QA Developer
    Comentários (6)
    Gabriela Arruda
    Gabriela Arruda - 30/09/2025 20:10

    Muito bem estruturado, Cainã! Parabéns pela didática.

    GR

    Graziano Rodrigues - 27/09/2025 22:44

    Maravilha de artigo Cainã

    Seu artigo demonstra de forma brilhante a versatilidade do Python além da ciência de dados. Com um fluxo de trabalho claro, ele integra Pandas, Flask e Pytest, mostrando como construir, testar e disponibilizar uma aplicação funcional. um excelente artigo para qualquer um que queira explorar o potencial completo da linguagem, comprovando que o Python é uma ferramenta poderosa para múltiplos domínios de desenvolvimento.

    Parabéns, excelente!!

    Cainã Pinto
    Cainã Pinto - 26/09/2025 08:40

    Muito obrigado pelo feedback, DIO!

    O maior desafio está em equilibrar necessidade e futuro do projeto. Muitas vezes, especialmente em projetos pequenos ou para iniciantes, a tendência é escolher uma biblioteca apenas para resolver o problema imediato, sem considerar como isso pode impactar a manutenção, a escalabilidade e até a segurança no futuro. Identificar o que realmente é essencial e evitar dependências desnecessárias é difícil, mas fundamental para manter o código limpo e sustentável.

    G

    Guilherme - 25/09/2025 22:02

    Muito bom, bastante ilustrativo me abriu muitas ideias e possiblidades, o texto aborda de forma clara e concisa o tema, mandou muito!

    BS

    Breno Soares - 25/09/2025 13:16

    Excelente artigo, Cainã!

    DIO Community
    DIO Community - 25/09/2025 09:27

    Excelente, Cainã! Que artigo incrível e super completo sobre "Python além da ciência de dados: construindo APIs, insights e testes robustos"! É fascinante ver como você aborda o Python não apenas como a linguagem do Data Science e do Machine Learning, mas como uma ferramenta versátil que se destaca em diversos campos, do backend à automação de testes.

    Você demonstrou que as bibliotecas Pandas (para dados), Flask (para APIs) e Pytest (para testes) são os pilares dessa versatilidade, quebrando a visão de que o Python se restringe à análise de dados. Sua análise de que a integração entre essas três ferramentas é o que permite a criação de pipelines completos e de software de alta qualidade é um insight valioso para a comunidade.

    Qual você diria que é o maior desafio para um desenvolvedor ao lidar com a vasta quantidade de bibliotecas e pacotes disponíveis, em termos de identificar a melhor opção e de evitar dependências desnecessárias que poderiam adicionar complexidade ao projeto?