Persano's picture
Update app10.py
962cff4 verified
import os
import pandas as pd
import openai
from google.oauth2 import service_account
from googleapiclient.discovery import build
from googleapiclient.http import MediaIoBaseDownload
import io
import json
# Função para carregar e testar a leitura do arquivo CSV
def load_and_test_csv():
try:
# Carrega as credenciais a partir da variável de ambiente do Hugging Face Secrets
cred_json = os.getenv("GOOGLE_APPLICATION_CREDENTIALS")
# Utiliza google.oauth2.service_account para carregar as credenciais corretamente
creds = service_account.Credentials.from_service_account_info(json.loads(cred_json))
# Autentica com o Google API
service = build('drive', 'v3', credentials=creds)
# ID do arquivo no Google Drive (substituído pelo ID real fornecido)
file_id = '1lNadnIVnDs9Oex5ckNXj1-56nvlEea6p'
# Solicita o download do arquivo CSV
request = service.files().get_media(fileId=file_id)
fh = io.FileIO('imoveis_ficticios.csv', 'wb')
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
status, done = downloader.next_chunk()
# Carrega o CSV usando pandas
df = pd.read_csv('imoveis_ficticios.csv')
# Verifica se as colunas necessárias estão presentes
required_columns = ['nome', 'bairro', 'valor', 'aluguel', 'rentabilidade', 'status']
missing_columns = [col for col in required_columns if col not in df.columns]
if missing_columns:
# Retorna um erro claro sem tentar abrir esse erro como arquivo
return f"Erro: Colunas ausentes no CSV: {', '.join(missing_columns)}"
return df
except Exception as e:
return f"Erro ao acessar o arquivo CSV: {e}"
# Função para buscar imóveis na planilha
def buscar_imoveis(bairro=None, status=None, preco_maximo=2000000):
try:
# Carrega os dados da planilha
df = load_and_test_csv()
if isinstance(df, str):
return df # Se houve erro na leitura, retorna o erro
# Verifica se a coluna 'valor' existe antes de fazer qualquer operação
if 'valor' not in df.columns:
return "Erro: A coluna 'valor' não foi encontrada no arquivo CSV."
# Converte a coluna 'valor' para numérico, caso seja necessário
df['valor'] = pd.to_numeric(df['valor'], errors='coerce')
# Filtra os imóveis com base nos critérios fornecidos
if bairro:
df = df[df['bairro'].str.contains(bairro, case=False, na=False)]
if status:
df = df[df['status'].isin(status)] # Filtra com base nos status selecionados
# Filtra pelo preço máximo
df = df[df['valor'] <= preco_maximo] # Filtra pelo preço máximo
# Exibe os resultados
if df.empty:
return "Nenhum imóvel encontrado com os critérios informados."
else:
return df[['nome', 'bairro', 'valor', 'aluguel', 'rentabilidade', 'status']].head(5) # Exibe os primeiros 5 resultados
except Exception as e:
return f"Erro na busca: {e}"
# Função para interagir com o modelo GPT
def conversacao_openai(prompt):
openai.api_key = os.getenv("OPENAI_API_KEY")
try:
response = openai.Completion.create(
model="text-davinci-003", # Ou o modelo GPT adequado
prompt=prompt,
max_tokens=150
)
return response.choices[0].text.strip()
except Exception as e:
return f"Erro ao interagir com o OpenAI: {e}"
# Função principal de interação
def interagir_com_usuario():
print("Olá! Eu sou seu assistente para ajudar na busca de imóveis. Como posso te ajudar hoje?")
while True:
user_input = input("Você: ")
# Se o usuário quiser parar a conversa
if user_input.lower() in ['sair', 'tchau', 'adeus']:
print("Até logo!")
break
# Definir parâmetros para a busca com base na entrada do usuário
bairro = None
status = None
preco_maximo = 2000000 # Preço padrão, pode ser alterado pela interação
# Aqui, podemos usar o OpenAI para interpretar as intenções do usuário.
prompt = f"Usuário quer buscar imóveis com as seguintes palavras: {user_input}. Interpretar isso como bairros, status e preços de imóveis."
gpt_response = conversacao_openai(prompt)
print(f"Assistente: {gpt_response}")
# Parse do GPT para obter os parâmetros de busca (simplificado)
if "bairro" in gpt_response:
bairro = gpt_response.split("bairro:")[1].strip().split()[0] # Apenas para ilustrar, ajustar conforme necessário
if "status" in gpt_response:
status = gpt_response.split("status:")[1].strip().split()[0] # Ajuste conforme resposta do GPT
if "preço" in gpt_response:
preco_maximo = int(gpt_response.split("preço:")[1].strip().split()[0]) # Ajuste conforme resposta do GPT
# Realizar a busca com base na interpretação do GPT
resultado = buscar_imoveis(bairro=bairro, status=status, preco_maximo=preco_maximo)
print(f"Assistente: {resultado}")
if __name__ == "__main__":
interagir_com_usuario()