Executando verificação de segurança...
12

Prevendo o futuro com Prophet

Republicando aqui pois ninguém lê meu blog.

Faz tempo que eu achava que era possível prever o futuro a partir de dados do passado. Mas assim como recomendar itens legais com algoritmos eu sabia que era possível e queria fazer mas não tinha a oportunidade de usar no trabalho ou em projetos pessoais, até agora. Em uma disciplina do curso de IA Aplicada o professor sugeriu usar dados de séries temporais e eu conheci o Prophet.

Prophet é um procedimento de previsão de séries temporais desenvolvido pelo Facebook. Para aprender a usa-lo vamos precisar de conhecimento em Python e um conjunto de dados (dataset).

O Prophet trabalha com dados no formato dataframe com duas colunas: ds e y. A coluna ds (datestamp) deve ser uma data ou data/hora. A coluna y deve ser numérica e representa a medida/quantidade que queremos prever.

Dataset

Como um exemplo vamos trabalhar com os dados de Notificações de Síndrome Gripal — 2024 do Ministério da Saúde disponível no openDataSUS. Esses dados estão divididos por estados e alguns estados possuem um ou mais lotes. No estado do Paraná (PR) temos um lote. Ele contém todas as notificações, com várias colunas para cada uma delas. No nosso exemplo utilizamos somente a coluna dataNotificacao (que é a data da notificação) e agrupamos pela quantidade de notificações a cada dia.

Código

Vamos importar a biblioteca pandas e através dela baixar e carregar o lote do estado do Paraná (PR). Atenção: se essa etapa retornar um erro "403: Forbidden" entre na página do openDataSUS, procure por "Dados PR" e copie o link do lote (ele muda quando é atualizado).

# Biblioteca pandas para abertura e manipulação dos dados
import pandas as pd

# Baixa e carrega o lote do estado do Paraná (PR)
df = pd.read_csv('https://s3.sa-east-1.amazonaws.com/ckan.saude.gov.br/SGL/2024/uf=PR/lote=1/part-00000-0fd19605-a609-4193-9408-9dea444604d3.c000.csv', delimiter=';')

Agora selecionamos a única coluna que importa (a data da notificação). Aproveitamos e removemos as linhas com valores nulos (ausentes):

# Seleciona coluna
df = df[['dataNotificacao']]

# Descarta valores nulos (ausentes)
df = df.dropna()

Contabilizamos a quantidade de notificações por data (agrupamos) e renomeamos as colunas para a entrada no Prophet (ds e y):

# Contabiliza (Agrupa)
row_counts = df.groupby('dataNotificacao').size().reset_index(name='quantidade')

# Renomeia para entrada no Prophet
row_counts = row_counts.rename(columns={'dataNotificacao': 'ds', 'quantidade': 'y'})

E finalmente inserimos os dados no Prophet:

# Importa o profeta
from prophet import Prophet

# Inicializa o modelo
model = Prophet()

# Treina com os dados
model.fit(row_counts)

Agora vamos criar um dataframe com datas futuras (um ano), gerar a previsão e retornar os 5 últimos valores previstos (yhat):

# Cria dataframe com datas futuras para o próximo ano
future_year = model.make_future_dataframe(periods=365)

# Faz a predição para datas futuras
forecast_year = model.predict(future_year)

# Retorna últimos dias da previsão
forecast_year[['ds', 'yhat']].tail()

E plotar um gráfico:

# Exibe gráfico para o próximo ano
model.plot(forecast_year);

Conclusão

Esse foi um guia de inicio rápido mas o Prophet possui diversos ajustes para casos como feriados, dados mensais ou por hora. A documentação entra em mais detalhes e deve ser explorada.

Esse mesmo guia está disponível no Google Colab.

Sobre o autor

Dirceu Jr. é desenvolvedor de software e estudante de IA Aplicada na PUCPR. Entusiasta de tecnologia, escreve em seu blog e publica o que encontra de mais legal pela web em seu Twitter.

Carregando publicação patrocinada...
1

Dirceu, ótimo tutorial postaste! Só como sugestão dá uma explicada na razão de reset do index logo e também do agrupamento. Para explicar aos incautos, o Prophet precisa de duas variáveis "ds" e "y" para realizar suas inferências ,por isso necessário o grupo!

1
1

Adoro esse modelo!
Utilizei ele durante minha pós em ciência de dados para gerar previsões de séries temporais em mercado de ações, também tem outra versão dele, o NeuralProphet que utiliza redes neurais, mas particularmente eu preferi o resultado do Propeth mesmo, achei mais legal de usar