Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Projeto] Faça como eu fiz: DataFrames e Filtros

import pandas as pd
import numpy as np

df_produtos = pd.DataFrame()

lista_produtos = [f"Produto {i+1}" for i in range(50)]
lista_categorias = np.random.choice(["Eletrônicos", "Livros", "Roupas", "Alimentos", "Brinquedos"], 50)
lista_precos = np.random.uniform(10.0, 500.0, 50).round(2)
lista_avaliacoes = np.random.uniform(1.0, 5.0, 50).round(1)
lista_itens_vendidos = np.random.randint(1, 1000, 50)

df_produtos['nome do produto'] = lista_produtos
df_produtos['categoria'] = lista_categorias
df_produtos['preço'] = lista_precos
df_produtos['avaliacao'] = lista_avaliacoes
df_produtos['itens vendidos'] = lista_itens_vendidos

df_produtos.columns.unique()
df_produtos.head()
df_reviews2 = pd.read_csv('/content/reviews.csv')
df_reviews2.head()
df_reviews2
df_reviews2['reviewerName']``
df_produtos['categoria'].unique()
df_produtos.reset_index()
df_produtos[df_produtos['categoria'] == 'Eletrônicos']
df_produtos[df_produtos['avaliacao'] < 2.0]
df_produtos[(df_produtos['categoria'] == 'Eletrônicos') & (df_produtos['preço'] < 300)]
df_produtos.iloc[15]
df_produtos.iloc[15:22]
df_produtos.iloc[45:]
df_produtos.set_index('nome do produto', inplace=True)
df_produtos.loc['Produto 45']
df_produtos.loc['Produto 45', 'preço']
df_produtos.loc['Produto 45':]
df_produtos.loc[['Produto 45', 'Produto 47', 'Produto 16'], ['preço', 'itens vendidos']]
import os
import pandas as pd
from google.colab import userdata

# 1.Carregar o CSV
df_reviews = pd.read_csv("reviews.csv")
df_reviews.head()

os.environ["GROQ_API_KEY"] = userdata.get('GROQ_API_KEY')

from groq import Groq

client = Groq()

def analisar_sentimento(frase: str) -> str:
    """
    Envia uma pergunta para a GenAI API e retorna 'resposta'.
    """
    try:
        completion = client.chat.completions.create(
            model="llama-3.3-70b-versatile",
            messages=[
                {
                    "role": "user",
                    "content": f"Analise o sentimento do review:: {frase} e retorne APENAS uma das palavras (Positivo, Neutro ou Negativo.)"
                }
            ],
            temperature=0.2,
            max_completion_tokens=10,
            stream=False, # stream desativado para receber a resposta pronta
        )

        # Captura o texto completo da resposta
        resposta = completion.choices[0].message.content.strip()
        
        # Retorna formatado
        return f"{resposta}"

    except Exception as e:
        return f"Erro ao processar: {e}"


#Escrever dataframe com nova coluna com a classificação da review
try:
    # 1. Aplica a função de sentimento e cria a nova coluna
    # Usamos o .apply() para percorrer a coluna de forma otimizada
    df_reviews['sentimento'] = df_reviews['reviewText'].apply(lambda x: analisar_sentimento(str(x).strip()))

    # 2. Exibe o resultado para conferência
    print("Processamento concluído com sucesso!")
    print(df_reviews[['reviewerID', 'reviewText', 'sentimento']].head())

    # 3. (Opcional) Salva o DataFrame completo com a nova coluna em um arquivo CSV
    df_reviews.to_csv('reviews_analisadas.csv', index=False, encoding='utf-8')

except Exception as e:
    print(f"Um erro ocorreu: {e}")
2 respostas

Olá, Marcelo. Como vai?

Parabéns pelo excelente projeto! Você foi muito além do básico da manipulação de tabelas, construindo uma verdadeira aplicação de inteligência artificial aplicada ao conectar o Pandas à API da Groq com o modelo llama-3.3-70b-versatile.

Seu código está muito bem estruturado. O uso do NumPy para gerar dados simulados realistas (random.choice, random.uniform), o domínio refinado dos seletores do Pandas (.loc, .iloc, filtros booleanos compostos) e a aplicação otimizada de funções com o .apply() utilizando expressões lambda refletem ótimas práticas de engenharia de dados.

Analisando a sua implementação, quero compartilhar duas dicas valiosas: uma dica técnica de otimização para o processamento de grandes volumes de dados e uma pequena sugestão sobre o fatiamento de DataFrames.


1. Otimização de Chamadas de API em Lotes (Batching)

No seu bloco final, você utilizou a função .apply() para enviar cada comentário (review) individualmente para o modelo da Groq:

df_reviews['sentimento'] = df_reviews['reviewText'].apply(lambda x: analisar_sentimento(str(x).strip()))

Embora o .apply() seja muito elegante e prático, essa abordagem faz uma requisição HTTP por linha do seu DataFrame. Se o seu arquivo reviews.csv tiver mil linhas, o código fará mil chamadas de API consecutivas. Isso pode estourar rapidamente o limite de requisições por minuto (RPM) da Groq e tornar o processamento muito lento devido à latência da rede.

Uma boa prática de IA para Dados: Em vez de enviar uma frase por vez, você pode agrupar várias linhas (por exemplo, blocos de 20 ou 50 reviews) em uma única estrutura de texto (como uma lista numerada ou um JSON) e enviá-las em uma única requisição para a API, pedindo para o LLM retornar as respostas no mesmo formato ordenado.

Isso reduz drasticamente os custos, evita bloqueios por Rate Limit e acelera o tempo total de execução do seu script!


2. Um toque sobre Indexação e Seleção com .loc

No seu código de exploração, após definir o nome do produto como o índice do DataFrame, você utilizou esta linha para fazer um fatiamento:

df_produtos.loc['Produto 45':]

Essa sintaxe está perfeitamente correta e funciona muito bem! Contudo, vale a pena lembrar de um comportamento sutil do Pandas: quando fatiamos uma tabela usando índices numéricos (.iloc[15:22]), o limite final é exclusivo (o índice 22 não entra no resultado). Mas quando fazemos um fatiamento baseado em rótulos nominais com o .loc, o limite final é inclusivo.

Caso você decida fatiar delimitando um fim nominal, como df_produtos.loc['Produto 45':'Produto 50'], o 'Produto 50' será incluído na resposta. É um detalhe simples, mas que costuma confundir quem está alternando entre a lógica do .iloc e do .loc.

Seu projeto está em um nível espetacular, unindo Engenharia de Recursos (Feature Engineering) com LLMs de forma prática. Continue documentando e alimentando o seu repositório no GitHub com esses projetos!

Espero que possa ter lhe ajudado!

solução!

Ah! Boa precisava mesmo jogar esses proejtos todos no github hahahaha pelo menos criaria um portfólio.

Sobre adica de mandar lotes com json achei muito boa, eu estava mais focado no exercício e fazer rápido, mas de fato fazer um exemplo com JSON estruturado como Review e pedir pra retornar um outro json com um campo com as respostas ou uma lista indexada.

Esta questão do indice e posição, eu tinha lido no livro "Python para ciência de dados" do Vasiliev

Obrigado pelo feedback Evandro. Um abraço.