Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
2
respostas

Faça como eu fiz: DataFrames e Filtros

Passo 1: Criar um DataFrame com 5 colunas

import pandas as pd

dados = {
    "produto": ["Notebook", "Mouse", "Geladeira", "Smartphone", "Fone Bluetooth"],
    "categoria": ["eletrônicos", "eletrônicos", "eletrodomésticos", "eletrônicos", "eletrônicos"],
    "preco": [3500, 80, 2500, 1800, 150],
    "avaliacao": [4.8, 1.9, 4.2, 3.5, 1.7],
    "itens_vendidos": [120, 500, 45, 300, 250]
}

df = pd.DataFrame(dados)

print(df)

Passo 2: Importar dados de um arquivo CSV

df_csv = pd.read_csv("produtos.csv")

print(df_csv)

Passo 3: Exibir o DataFrame completo e os primeiros registros

print(df)

print(df.head())

Passo 4: Selecionar uma coluna específica

print(df["produto"])

Passo 5: Extrair valores únicos de uma coluna

print(df["categoria"].unique())

ou

print(set(df["categoria"]))

Passo 6: Filtrar produtos da categoria eletrônicos

eletronicos = df[df["categoria"] == "eletrônicos"]

print(eletronicos)

Passo 7: Filtrar produtos com avaliação menor que 2.0

baixa_avaliacao = df[df["avaliacao"] < 2.0]

print(baixa_avaliacao)

Passo 8: Combinar filtros com operador &

Selecionar produtos eletrônicos com preço acima de R$ 100.

filtro_combinado = df[
    (df["categoria"] == "eletrônicos") &
    (df["preco"] > 100)
]

print(filtro_combinado)

Passo 9: Utilizar iloc para selecionar linhas por índice

Primeira linha:

print(df.iloc[0])

Primeiras três linhas:

print(df.iloc[0:3])

Passo 10: Utilizar loc após definir um índice textual

df_indice = df.set_index("produto")

print(df_indice.loc["Notebook"])

Selecionando mais de um registro:

print(df_indice.loc[["Notebook", "Smartphone"]])

Desafio: Classificação de Sentimentos com LLM

Passo 11: Carregar o arquivo Reviews.csv

import pandas as pd

df_reviews = pd.read_csv("Reviews.csv")

print(df_reviews.head())

Passo 12: Criar lista para armazenar os sentimentos

sentimentos = []

Passo 13: Utilizar o LLM para classificar cada review

for review in df_reviews["Review Text"]:

    resposta = client.models.generate_content(
        model="gemini-2.5-flash",
        contents=f"""
        Classifique o sentimento abaixo utilizando apenas uma palavra:
        Positivo, Negativo ou Neutro.

        Texto:
        {review}
        """
    )

    sentimento = resposta.text.strip().capitalize()

    sentimentos.append(sentimento)

Passo 14: Adicionar a nova coluna ao DataFrame

df_reviews["Sentimento"] = sentimentos

print(df_reviews.head())

Passo 15: Salvar o resultado em um novo CSV

df_reviews.to_csv(
    "Reviews_Classificados.csv",
    index=False,
    encoding="utf-8"
)

Passo 16: Ler o arquivo gerado

novo_df = pd.read_csv(
    "Reviews_Classificados.csv",
    encoding="utf-8"
)

print(novo_df.head())
2 respostas

Olá, Estudante. Como vai?

Que publicação espetacular! Você construiu um roteiro de estudos perfeito, que une os fundamentos da manipulação de dados com Pandas à engenharia de software aplicada à Inteligência Artificial. Esse tipo de conteúdo é extremamente valioso no fórum, pois serve de guia prático para quem quer entender como estruturar dados antes e depois de passá-los por um modelo de linguagem (LLM).

O seu código está muito bem estruturado e segue as melhores práticas da biblioteca Pandas. Analisando o seu passo a passo, separei alguns destaques e dicas avançadas para você elevar ainda mais o nível técnico desse projeto:


1. Destaque Técnico: A Diferença entre loc e iloc (Passos 9 e 10)

Muitos iniciantes em Ciência de Dados se confundem na hora de fatiar dados, mas você demonstram ter dominado os dois principais indexadores do Pandas:

  • iloc (Indexación por Localização Inteira): Baseado puramente na posição numérica da linha (índice posicional, começando do 0). É excelente para algoritmos e loops automáticos.
  • loc (Indexación por Rótulo/Label): Baseado no nome textual da linha. Ao definir o produto como índice no Passo 10 (df.set_index("produto")), você transformou a tabela em uma estrutura de busca direta muito mais intuitiva para análises humanas.

2. Ponto de Atenção e Otimização: A Limpeza do Retorno da IA (Passo 13)

No Passo 13, você usou engenharia de prompt para forçar o Gemini a responder com apenas uma palavra e aplicou métodos de string no Python:

sentimento = resposta.text.strip().capitalize()
  • Por que isso é fundamental? Modelos de linguagem adoram conversar. Se você pedir "Responda apenas Positivo, Negativo ou Neutro", o modelo pode acabar gerando algo como "O sentimento do texto é Positivo." ou trazer quebras de linha (\nPositivo). O seu tratamento com .strip() (remove espaços em branco e quebras de linha) e .capitalize() (garante a primeira letra maiúscula) blinda a sua lista contra sujeiras de formatação, garantindo que o seu Passo 5 (.unique()) retorne exatamente as três categorias esperadas.

3. Engenharia de Produção: Criando uma Rede de Segurança para o Loop (Passos 13 e 14)

Em projetos reais de IA Aplicada, a tabela Reviews.csv pode conter milhares de linhas. Se você rodar o loop for puro e a sua conexão com a internet cair na linha 400, ou se a cota da sua API estourar, o script vai quebrar com uma exceção e você perderá a lista sentimentos que estava na memória, tendo que pagar os tokens para rodar tudo de novo.

  • Boa Prática (Garantia de Dados): Para loops que realizam chamadas externas (APIs de LLM), uma tática profissional é usar o tratamento de erros que vimos no capítulo anterior combinada com um valor padrão caso a IA falhe. Veja como proteger o seu Passo 13:
for review in df_reviews["Review Text"]:
    try:
        resposta = client.models.generate_content(
            model="gemini-2.5-flash",
            contents=f"Classifique o sentimento em uma palavra (Positivo, Negativo, Neutro):\n{review}"
        )
        sentimento = resposta.text.strip().capitalize()
    except Exception as e:
        # Se a API falhar, grava "Erro" e não deixa o código quebrar no meio do caminho
        sentimento = "Erro_API"
        print(f"Falha ao processar review devido ao erro: {e}")
        
    sentimentos.append(sentimento)

4. Dica de Performance: Vetorização com Métodos do Pandas (Passo 5)

No Passo 5, você mostrou duas formas de extrair valores únicos. Ambas funcionam, mas vale uma nota sobre performance:

  • df["categoria"].unique() utiliza o motor interno em C do Pandas, retornando um array NumPy de forma extremamente rápida.
  • set(df["categoria"]) converte a coluna para uma estrutura nativa do Python.

Para DataFrames massivos, dê sempre preferência ao método próprio do Pandas (.unique()), pois ele mantém a consistência dos tipos de dados e ganha em velocidade de processamento.

Parabéns pela didática impecável e pela consistência na construção do pipeline! Você uniu com maestria a manipulação de tabelas com os novos recursos de inteligência artificial generativa.

solução!

Obrigado pelo feedback e pelas dicas!