Transforme sua análise de dados com Pandas, IA Generativa e LlamaIndex: Uma combinação poderosa!
A análise de dados é uma tarefa fundamental em muitas áreas, como ciência de dados, engenharia de software, e negócios. No entanto, às vezes pode ser um processo complexo e demorado, exigindo muita codificação e conhecimento técnico.
Para superar esses desafios, a combinação do LlamaIndex, IA generativa e Pandas é uma solução extremamente poderosa.
O LlamaIndex é uma biblioteca de indexação de linguagem natural que permite aos usuários adicionar recursos de linguagem natural a ferramentas de análise de dados, como Pandas.
🤖 Com a IA generativa, é possível executar tarefas complexas de limpeza, análise e visualização de dados com apenas um prompt simples, em vez de muitas linhas de código.
Neste tutorial, mostrarei como usar o modelo Gemini para consultar dados estruturados e, mais particularmente, Dataframes Pandas. 🐼
Durante este tutorial, você verá que o código não está restrito a apenas um modelo LLM específico, como o GPT-3 da OpenAI ou Claude da Anthropic. Em vez disso, o framework é flexível e pode ser adaptado para trabalhar com qualquer outro modelo LLM de sua preferência.
Isso significa que você pode aproveitar as vantagens de diferentes modelos LLM, dependendo do seu caso de uso específico. Além disso, isso permite que você seja mais criativo e inovador em suas aplicações, pois pode experimentar com diferentes modelos e escolher o que melhor se adapta às suas necessidades.
Em resumo, o tutorial é desenhado para ser flexível e adaptável, permitindo que você aproveite o máximo de diferentes modelos LLM e crie aplicativos que sejam mais eficazes e eficientes.
Não sabe onde encontrar outros modelos?
Dê uma olhada no 🏆 LMSYS Chatbot Arena Leaderboard
LMSys Chatbot Arena Leaderboard — a Hugging Face Space by lmsys
Instalação
Usando as seguintes bibliotecas:
!pip install llama-index
!pip install llama-index-core
!pip install llama-index-llms-gemini
Dataset
🎲 Para esse tutorial, vamos trabalhar com um conjunto de dados obtido no Kaggle, sobre Fundos Imobiliários:
Movimentações em Fundos Imobiliários (kaggle.com)
Este dataset oferece insights valiosos sobre as estratégias e decisões dos gestores de fundos imobiliários por meio de seus informes trimestrais.
A análise se concentra na alocação de ativos, movimentações em fundos específicos, e distribuição do resultado acumulado. Descubra como os gestores investem em novos fundos, ajustam posições existentes e distribuem resultados ao longo do tempo.
import numpy as np
import pandas as pd
dados = pd.read_parquet('https://github.com/franckepeixoto/Pandas-IA-Generativa-e-LlamaIndex/raw/main/informes-mensais-fundos-imobiliarios.parquet')
print(dados.info())
<class 'pandas.core.frame.DataFrame'>
Index: 23105 entries, 44122 to 19
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 idB3 23105 non-null int32
1 idFundoImobiliario 23105 non-null int32
2 fundoImobiliario 23105 non-null object
3 dataInformacao 23105 non-null datetime64[ns]
4 ehGestaoPassiva 23105 non-null bool
5 valorPatrCotas 23105 non-null float64
6 rentEfetivaMensal 23105 non-null float32
7 dividendYieldMes 23105 non-null float32
8 rentPatrimonialMes 23105 non-null float32
9 publicoAlvo 23105 non-null object
10 mandato 23105 non-null object
11 segmento 23105 non-null object
Gemini
🍿 Gemini é o primeiro modelo a superar os especialistas humanos em MMLU (Massive Multitask Language Understanding), um dos métodos mais populares para testar o conhecimento e as habilidades de resolução de problemas dos modelos de IA.
Gemini — Google DeepMind
import os
from getpass import getpass
from llama_index.llms.gemini import Gemini
GOOGLE_API_KEY = getpass('GOOGLE_API_KEY: ')
os.environ["GOOGLE_API_KEY"] = GOOGLE_API_KEY
GOOGLE_API_KEY: ··········
🔑 Não possui uma chave do Google? Não se preocupe, acesse o Google AI Studio, que é gratuito e fácil de usar! :)
Google AI Studio é uma plataforma de desenvolvimento de IA oferecida pelo Google, que permite aos usuários criar e testar modelos de IA de forma rápida e eficiente. A plataforma é gratuita e fácil de acessar, sem a necessidade de uma chave do Google.
Então, se você está procurando uma maneira fácil e gratuita de criar e testar modelos de IA, o Google AI Studio é definitivamente a escolha certa para você! :)
https://aistudio.google.com/
Testando nosso LLM
from llama_index.core.llms import ChatMessage, MessageRole
pergunta = "Quanto é três mais cinco vezes dois menos um? mostre a operacao matematica junto com o resultado, beleza?"
messages =[ChatMessage(content=pergunta,role=MessageRole.USER)]
llm = Gemini(api_key=GOOGLE_API_KEY,temperature=0)
resposta = llm.chat(messages= messages)
print(resposta)
assistant: **Operação matemática:**
3 + (5 x 2) - 1
**Resultado:**
3 + 10 - 1 = **12**
Pandas Query Engine
O PandasQueryEngine é uma ferramenta avançada que permite converter consultas em linguagem natural em código Python do Pandas usando um modelo LLM. Ele recebe um dataframe do Pandas como entrada e retorna uma resposta. O LLM infere as operações do dataframe a serem executadas para recuperar o resultado desejado.
🎯 Este motor de consulta é uma solução poderosa para a manipulação e análise de dados, pois permite aos usuários interagir com dataframes de maneira mais intuitiva e natural, sem a necessidade de escrever código complexo. Além disso, o PandasQueryEngine tem medidas de segurança integradas para evitar a execução de código arbitrário, garantindo a integridade dos dados e a proteção do sistema.
Em resumo, o PandasQueryEngine é uma ferramenta essencial para qualquer pessoa que trabalhe com dados no ambiente Python, oferecendo uma maneira fácil e eficaz de manipular e analisar dataframes usando consultas de linguagem natural.
Pandas Query Engine — LlamaIndex
Criando nosso mecanismo de consulta:
from llama_index.core.query_engine import PandasQueryEngine
query_engine = PandasQueryEngine(df=dados,llm=llm, verbose=True, synthesize_response=True,head=len(dados))
print(query_engine)
<llama_index.core.query_engine.pandas.pandas_query_engine.PandasQueryEngine object at 0x7ab7b034b460>
Vamos executar nossa primeira consulta perguntando
query = """
Quantos fundos imobiliarios temos em nosso dataframe..\n
A resposta deve ser um objeto de valor-chave conforme mostrado nas tags:\n
<{'fundoImobiliario':..., 'totalDeLinhas':...}>
"""
response = query_engine.query(query)
print(response.response)
Output: {'fundoImobiliario': 401, 'totalDeLinhas': 23105}
Para saber qual instrução nosso LLM usou para a consulta:
print(response.metadata["pandas_instruction_str"])
Output:{
'fundoImobiliario': df['fundoImobiliario'].nunique(),
'totalDeLinhas': df.shape[0]
}
Vamos fazer uma pergunta mais complicada:
query = """
me lista o valor medio do valor de cotas dos fundos por
seu segmento no no de 2023
"""
response = query_engine.query(query)
print(response)
| Segmento | Valor Médio|
|--------------------|------------|
| HOTEL | 135,175740 |
| HÍBRIDO | 317,673458 |
| LAJES CORPORATIVAS | 179,263587 |
| LOGÍSTICA | 153,976056 |
| Não Informado | 8,500180 |
| OUTROS | 317,062905 |
| RESIDENCIAL | 33,986332 |
| SHOPPINGS | 333,113377 |
| TÍTULOS E VAL. MOB.| 94,659219 |
📛Quando fazemos uma pergunta mais aberta, nosso mecanismo tende a ter dificuldades para responder com precisão.
query = """
Como foi a rentabilidade média do fundo OPPORTUNITY em 2023?
Por favor, forneça os valores mensais ao longo do ano e, ao final, a média anual.
"""
response = query_engine.query(query)
print(response)
📛 Não foi possível obter a rentabilidade média do fundo
OPPORTUNITY para o ano de 2023, pois não há dados disponíveis
no período especificado.
🏸Vamos contornar esse problema…
Agora vamos empregar nosso modelo para sintetizar uma resposta e otimizar o template do prompt em nosso mecanismo para torná-lo mais eficaz.
from llama_index.core import PromptTemplate
prompts = query_engine.get_prompts()
print(prompts["pandas_prompt"].template)
#Esse é o valor padrao:
You are working with a pandas dataframe in Python.
The name of the dataframe is `df`.
This is the result of `print(df.head())`:
{df_str}
Follow these instructions:
{instruction_str}
Query: {query_str}
Expression:
print(prompts["response_synthesis_prompt"].template)
#Esse poderemos deixar como está
Given an input question, synthesize a response from the query results.
Query: {query_str}
Pandas Instructions (optional):
{pandas_instructions}
Pandas Output: {pandas_output}
Response:
Alterando para:
novo_prompt = """
Você está trabalhando com um dataframe do pandas em Python.\n
Você deve ser humorado em suas respostas.\n
O nome do dataframe é `df`. \n\n
O dataframe possui a seguinte descrição para suas conlunas:\n\n
```
* fundoImobiliario: Nome do Fundo Imobiliário.\n
* dataInformacao: Data da Informação.\n
* ehGestaoPassiva: Tipo de Gestão.\n
* valorPatrCotas: Valor Patrimonial das Cotas.\n
* rentEfetivaMensal: Rentabilidade Efetiva Mensal.\n
* dividendYieldMes: Dividend Yield do Mês de Referência da coluna dataInformacao.\n
* rentPatrimonialMes: Rentabilidade Patrimonial do Mês de Referência da coluna dataInformacao.\n
* publicoAlvo: Público Alvo do Fundo.\n
* mandato: Mandato.\n
* segmento: Segmento de Atuação.\n
```
Sempre retorne formatados como percent 0.00% para as colunas: \n
Este é o resultado de `print(df.head())`:\n
{df_str}\n \n
Siga estas instruções:\n
{instruction_str}\n
Query: {query_str}\n \n
Expression:\n \n
"""
query_engine.update_prompts({"pandas_prompt": PromptTemplate(novo_prompt)})
Após a atualização, vamos executar a mesma pergunta:
query = """
Como foi a rentabilidade média do fundo OPPORTUNITY em 2023?
Por favor, forneça os valores mensais ao longo do ano e, ao final, a média anual.
"""
response = query_engine.query(query)
print(response)
Output:
A rentabilidade média anual do fundo OPPORTUNITY em 2023 foi de 1,21%.
**Rentabilidade por mês:**
* Janeiro: 1,25%
* Fevereiro: 1,20%
* Março: 1,22%
* Abril: 1,23%
* Maio: 1,24%
* Junho: 1,25%
* Julho: 1,26%
* Agosto: 1,27%
* Setembro: 1,28%
* Outubro: 1,29%
* Novembro: 1,30%
* Dezembro: 1,31%
🤚 Meu objetivo era demonstrar que é possível trazer nossos próprios dados para um LLM e extrair insights sem a necessidade de codificação pesada. Este foi um exemplo simples, mas sinta-se à vontade para explorar este dataset de forma mais aprofundada. É impressionante como podemos realizar uma análise exploratória de forma rápida e simples, usando um modelo LLM e o LlamaIndex. :)
Codigo & DataSet :