Dashboard de Consumo Energético em Edificações - um projeto de Ciência de Dados de ponta a ponta

Publicado em 13.10.2022
por Bruno Perdigão


Sou arquiteto e projeto edifícios há mais de 10 anos. Diante de todos os desafios ambientais pelos quais temos passado em nosso planeta, uma das principais responsabilidades no campo AEC (arquitetura, engenharia e construção) é criar edifícios mais sustentáveis e torná-los mais eficientes no consumo de energia. Como projetista, existe um conjunto de conceitos que usamos para conseguir isso, como o estudo do caminho solar e estratégias de projeto passivo. Entretanto, na maioria das vezes, este trabalho é feito de forma empírica, sem coleta de dados após a conclusão do edifício. A idéia de uma abordagem mais orientada a dados me levou a começar a aprender Data Science, que tem grande uso para a sustentabilidade e eficiência energética em edifícios.

Atualmente, há uma grande oferta de tecnologia disponível para medir muitas informações sobre os edifícios. Este projeto tenta demonstrar um exemplo de como a Data Science pode ser usada no campo AEC, ajudando a monitorar os dados do edifício e usando dados de previsão do tempo para ajudar a prever o consumo de energia do edifício. Com esse conhecimento, os operadores do edifício são capazes de tomar decisões e criar estratégias para melhorar a forma como a energia é utilizada naquele edifício e torná-lo mais eficiente.

Esta foi minha primeira tentativa de criar um projeto com tantas etapas e ferramentas diferentes. Aprendi muito com ele e este post é uma forma de explicar meu processo. Tenha em mente que este não é um tutorial passo a passo, mas se você tiver alguma dúvida e quiser uma explicação mais aprofundada sobre qualquer parte, entre em contato comigo.

Dê uma olhada no resultado final do projeto , ou você pode conferir o código por trás deste projeto

A página pode demorar um pouco para abrir devido às limitações do plano gratuito Render.com.

imagem do dashboard

print screen do dashboard

Os dados

Para este projeto eu queria arabalhar com dados reais e de aransmissão contínua, para que o aplicativo fosse atualizado constantemente. Depois de procurar algumas opções, escolhi trabalhar com a API fornecido pelo município de Helsinki , porque ela era aberta e atualizada diariamente. Além disso, eu precisava de dados meteorológicos para funcionar como covariáveis para a previsão do consumo de energia. O API Open Meteo API foi escolhido basicamente pelas mesmas razões: abertura e facilidade de uso.

Uma vez que isso foi estabelecido, usei a biblioteca Requests do Python para conectar os dados ao meu dashboard. Esta foi minha primeira vez usando dados de uma API, mas foi mais fácil do que eu imaginava no início. A parte mais difícil foi entender como os dados eram estruturados e como trabalhar com o formato JSON. Eu tive que ir e voltar entre JSON e Pandas Dataframe. Após alguma tentativa e erro, peguei o jeito, e logo tive todos os dados preparados da maneira que precisava para os gráficos.

Dash e Plotly

Existem alguns frameworks para criar dashboards usando Python, mas escolhi Dash porque era um dos mais populares e pude encontrar muito material que me permitisse aprendê-lo por conta própria. Comecei com alguns tutoriais, mas a documentação também foi muito útil. Na verdade, um dos grandes benefícios deste projeto para mim foi que eu senti que poderia realmente aprender com a documentação oficial. Eu sabia que ler a documentação era uma boa fonte de aprendizado, mas não era fácil quando eu era um iniciante. Por isso, me senti bem em poder quebrar esta barreira e dar um passo à frente nas minhas habilidades.

Comecei com uma simples implementação do aplicativo Dash, com um único gráfico Plotly. Depois disso, criei a primeira interação, com um seletor de datas que controlaria a linha do tempo do gráfico. Com isso, eu tinha todas as bases de trabalho, os próximos passos seriam adicionar mais dados e os outros gráficos.

Este projeto foi também uma grande oportunidade de trabalhar com HTML e CSS. Embora o desenvolvimento web não seja meu objetivo principal, era importante conhecer o básico para ter mais controle de como o aplicativo web era estruturado e como seria sua aparência. Eu não queria ter um template padrão, por isso ajustei um pouco o CSS para ter uma aparência mais personalizada.

Outro passo que vale a pena mencionar é que vi um ótimo vídeo de @arjan_codes quando eu estava no meio deste processo. Em seus vídeos ele cria um aplicativo Dash, mas a maior parte da parte do Dash eu já conhecia. O que mais gostei foi que ele implementou alguns conceitos de design de software que me ajudaram a entender uma melhor maneira de estruturar meu código e torná-lo mais gerenciável a longo prazo. Isto não estava em minha lista de coisas a aprender, mas como eu estava trabalhando neste projeto, foi uma oportunidade de exercitar isto.

Depois de trabalhar no painel por um tempo, eu tinha feito quase tudo o que era necessário: estrutura, aparência e todos os gráficos. A única coisa que faltava eram os dados da previsão do consumo de energia. Portanto, era hora de focar em machine learning (ML).

Treinamento ML

Meu processo de aprendizagem da Data Science tem sido muito difuso, pois venho de outra formação, que é a arquitetura. Comecei a aprender DS quando aprendi Python, primeiro como curiosidade e sem saber exatamente como iria utilizar. Quanto mais me dedicava a isso, mais eu gostava. Depois, comecei a ver algumas formas de utilização no campo da AEC. A razão pela qual menciono isto é para dizer que primeiro aprendi o básico do ML de uma maneira prática. Principalmente, o processo de preparação, divisão, treinamento de dados e avaliação do modelo em um Jupyter notebook. Mas em meu projeto eu tive que lidar com dados de séries temporais, que tem algumas particularidades. Sazonalidade, estacionariedade, tendência, são conceitos que eu tinha que entender, e havia muitas abordagens diferentes para as séries temporais em ML. Portanto, dei um passo para trás para aprender mais sobre os conceitos subjacentes aos modelos e algoritmos de ML. Este é um tópico muito amplo e não consegui cobrir a maior parte dele, mas certamente me ajudou a estar mais consciente de como os modelos ML funcionam.

Enquanto estava pesquisando, encontrei a biblioteca Darts Python que tem uma abordagem unificadora em relação às séries temporais. Foi muito útil ter tudo em uma biblioteca e ter uma ferramenta específica para esta tarefa. Este foi outro ponto em que a documentação me ajudou muito. Foi um desafio, mas finalmente consegui obter alguns bons resultados.

Você pode dar uma olhada neste caderno para obter os detalhes sobre o treinamento do modelo. Sei que há coisas que podem ser feitas para melhorar o modelo - como lidar melhor com os outliers, criar características de atraso, testar e afinar outros tipos de modelos -, mas para este projeto eu senti que já era suficiente. Salvei o modelo e o incorporei em minha pasta de projetos.

No início, foi fácil conectar o modelo aos meus dados de aplicação e criar a última parte do gráfico, que era a previsão do consumo de energia. Entretanto, o modelo era um arquivo muito pesado - embora mais tarde eu tenha conseguido reduzi-lo com Bz2file - que criou um problema com as limitações do GitHub uma vez que tentei levá-lo para a produção. Eu sabia que havia uma maneira melhor de lidar com isso, mas achava que estava muito fora do meu alcance. Como eu não tinha outra opção, comecei a aprender um pouco sobre os MLOps.

ML para produção

Nesta fase, eu sabia que tinha que melhorar meu processo de aprendizagem, então decidi fazer mais cursos estruturados em vez de pegar conhecimento de fontes difusas. Comecei um curso em MLOps em Alura que me ajudou muito a entender os fundamentos e me deu a confiança para tentar esta abordagem em meus projetos.

No curso, aprendi a trabalhar com o Flask, mas no projeto decidi tentar trabalhar com FastAPI , uma vez que é uma opção que vem crescendo na preferência da comunidade de ML. Foi também uma ótima maneira de me desafiar. A idéia era que, ao invés de ter o arquivo do modelo ML dentro do meu projeto do dashboard, eu o colocaria em outro repositório e criaria uma API que pudesse se conectar com o aplicativo do dashboard. Dessa forma, eu poderia ter todas as coisas relacionadas ao modelo em uma estrutura separada, facilitando a manutenção e atualização quando necessário.

Uma vez que a API foi feita, criei um arquivo Docker e uma imagem em meu PC local para configurar tudo a ser implantado. Esta parte foi complicada, mas uma vez que entendi como funciona o uvicorn (e o gunicorn), consegui ter sucesso. Agora, faltava apenas um passo, que era o de implementação, para que eu pudesse torná-lo facilmente acessível on-line.

Implementação do App (Deploy)

Enquanto eu estava trabalhando neste projeto, Heroku (que é uma das opções mais populares) terminou todos os planos gratuitos, então eu tive que procurar outras opções. Vi alguém na comunidade Dash recomendando Render.com e eu precisava de um plano gratuito, pois este era um projeto de portfólio e era minha primeira tentativa de implementação. Primeiro implementei o dashboard. Para isso, Render tem a opção de criar um ambiente Python durante o processo de construção, então tudo o que você realmente precisa é de um arquivo requirements.txt com todas as bibliotecas que o pip tem que instalar. Eu falhei algumas vezes por causa de alguma configuração necessária e porque eu não tinha configurado corretamente meu código para invocar o gunicorn, mas uma vez que eu percebi isso, o restante foi muito simples. Uma das desvantagens de utilizar o plano livre é que o processo de construção é lento, portanto, tentar, depurar e consertar levou mais do que eu esperava.

Depois disso, eu comecei o processo de implementação da API. Para isso, usei o Dockerfile, que é muito fácil de usar no Render também. Portanto, neste momento tenho dois serviços web no Render, um para o API do modelo e outro para o dashboard. O aplicativo solicita os dados do ML API, dando como entrada o consumo de energia do edifício (do edifício selecionado) e os dados de previsão do tempo (para o modelo usar como covariates para a previsão). O painel recebe os dados de previsão e depois transforma estes dados para mostrar como a linha azul tracejada no gráfico de previsão. Finalmente, tudo estava funcionando!

Pensamentos finais

Meu objetivo com esta postagem era mostrar o processo, de alguém que está encontrando seu caminho para um novo campo, vindo da arquitetura à ciência dos dados. Há alguns meses venho estudando Python, ciência de dados e aprendizado de máquinas, mas este projeto me ajudou a elevar minhas habilidades de uma maneira totalmente nova. A idéia era criar um projeto que me desse a capacidade de aprender um processo completo, vindo da coleta de dados até a implementação de um aplicativo, mas, na época, eu não tinha o entendimento completo de todas as coisas que eu teria que fazer e aprender. Eu tinha que resolver os problemas à medida que avançava no projeto.

Também acho que minha formação em arquitetura me ajudou muito. Primeiro, por causa de uma abordagem generalista: temos que estudar física, estrutura, materiais, em conjunto com, estudos sociais, psicologia, design, história, arte, estética, e assim por diante. Estamos acostumados a ver todo o processo que envolve um edifício, desde a perspectiva urbana até o usuário individual. Isto me levou a experimentar um projeto de ciência de dados onde eu pudesse ver o quadro completo, e conhecer um pouco sobre cada etapa do processo. Em segundo lugar, o projeto arquitetônico tem muito a ver com a solução de problemas. Você tem objetivos e um briefing quando inicia um projeto, mas o processo não é linear, e você tem que se adaptar constantemente a novas circunstâncias que aparecem à medida que você desenvolver o trabalho. Pareceu semelhante fazer isto em um projeto de ciência de dados, onde você tem que planejar cuidadosamente antes de começar, mas também tem que ser capaz de enfrentar novos problemas e concluir o trabalho.

Se você leu até aqui, espero que isto tenha sido útil de alguma forma. Por favor, entre em contato comigo se tiver alguma dúvida. Também gostaria de receber feedback sobre idéias para melhorar o código, o dashboard ou o modelo de ML. Muito obrigado!