Código Python: previsão de demanda com uma rede simples (comparada com a média móvel)

Código Python: previsão de demanda com uma rede simples (comparada com a média móvel)
Quem cuida de um depósito convive com a mesma pergunta no fim de todo mês: quanto vou vender no mês que vem? Comprar demais deixa o dinheiro parado na prateleira e o galpão cheio de mercadoria que ninguém pede; comprar de menos faz faltar produto justo no dia em que o cliente aparece. O programa que acompanha este artigo responde a essa pergunta com números, não com palpite: lê vinte e quatro meses de vendas de um arquivo de texto, calcula duas previsões — a média móvel de três meses, o método clássico que todo mundo conhece, e uma rede neural pequenina — e compara as duas para dizer, com dados, qual delas errou menos. Foi escrito para donos de negócio, contadores e almoxarifes que querem entender o que existe por trás de um número de previsão sem virar programador.
⬇ Baixar o código (ZIP)| Arquivo do ZIP | Para que serve |
|---|---|
| pronostico_demanda.py | O programa completo, comentado em português linha por linha. É o único arquivo que se executa. |
| datos/ventas_mensuales.csv | Vinte e quatro meses de vendas de exemplo, com o mês e as unidades vendidas. O Excel abre e você pode trocar pelos seus próprios números. |
| salida_ejemplo.txt | A saída real do programa, exatamente como aparece na tela, para comparar com a sua. |
| LEIAME.md | As instruções do pacote: como executar, o que significa cada coluna e as dúvidas mais comuns. |
O que o programa faz
O programa não adivinha e não tem opinião sobre o seu negócio: ele aprende com o passado da própria série e depois se mede contra um método simples, para que você julgue se o esforço vale a pena. Passo a passo, é isto o que acontece:
- Lê o arquivo
datos/ventas_mensuales.csve guarda a lista de meses com a quantidade de unidades vendidas em cada um: vinte e quatro linhas no total. - Leva a série inteira para uma escala entre zero e um. Parece técnico, mas é puro bom senso: a rede trabalha confortável com números pequenos e, se receber as unidades cruas, as contas explodem.
- Monta as amostras de treino: cada mês vira um exemplo em que as entradas são os três meses anteriores e a resposta certa é o mês atual. Assim o programa não decora: ele aprende a relação entre o que aconteceu e o que veio depois.
- Cria uma rede de três entradas, quatro neurônios na camada oculta e uma saída. Os pesos iniciais são números sorteados, mas com semente fixa: é isso que faz o programa dar sempre o mesmo resultado, hoje e daqui a um ano.
- Treina a rede duas mil vezes sobre as mesmas amostras, corrigindo os pesos um pouquinho a cada passada, sempre na direção que reduz o erro.
- Calcula em paralelo a previsão da média móvel de três meses: a média simples dos três meses anteriores. É o método que todo mundo monta no Excel e serve de régua para medir.
- Compara os dois métodos exatamente sobre os mesmos meses: vinte e um meses têm histórico suficiente para serem avaliados; os três primeiros não, porque faltam meses anteriores.
- Imprime quanto cada um errou, diz qual venceu e deixa a tabela completa em um arquivo que abre no Excel.
Como executar
Você precisa de uma única coisa instalada: o Python 3.11 ou superior, que se baixa de graça no site oficial do Python e se instala com avançar, avançar, avançar. Depois disso, os passos são estes:
- Descompacte o ZIP em qualquer pasta; a área de trabalho serve, não importa onde ele fique.
- Abra o terminal: no Windows, menu Iniciar, digite
cmde entre; no Mac, o aplicativo Terminal. - Digite
cdseguido do caminho da pasta onde você descompactou o pacote e pressione Enter. - Digite
python pronostico_demanda.pye pressione Enter.
Não há mais nada para instalar: o programa usa apenas o que vem de fábrica no Python, então não há bibliotecas para baixar nem dependências que quebrem. Se o sistema avisar que python não existe, tente py no Windows ou python3 no Mac e no Linux. Quando terminar, além do resumo na tela, você vai encontrar um arquivo novo dentro da pasta salida.
O código, explicado
O programa cabe em uma tela e está comentado da primeira à última linha. Estas são as partes que vale a pena entender, sem entrar em matemática pesada.
# ==========================================================================
# PREVISÃO DE DEMANDA COM UMA REDE SIMPLES
# Código Python didático para estoque · Kardex Tauro · kardex-tauro.muisca.co
# O que faz: lê 24 meses de vendas de datos/ventas_mensuales.csv, treina à mão
# uma rede de 3 entradas, 4 neurônios ocultos e 1 saída, e compara com a média
# móvel de 3 meses; deixa a tabela e a previsão em salida/pronostico.csv
# ==========================================================================
import csv # csv: ler e escrever arquivos separados por vírgulas (o Excel abre direto)
import math # math: a função exponencial que a curva sigmoide precisa
import random # random: sorteio com semente fixa, para o resultado se repetir sempre
Esse cabeçalho diz em palavras para que serve o arquivo e de onde vêm os dados, e traz as bibliotecas: tudo o que é importado vem com o Python, então não há nada exótico para instalar. Esse hábito de explicar o arquivo logo na primeira linha é o que você mesmo vai agradecer daqui a um ano.
Depois vêm juntos os números que governam o experimento, cada um com a sua explicação ao lado. Ficam no alto, e não escondidos no meio do código, porque são justamente os que você vai querer mexer: mude a semente e verá outro resultado; reduza as épocas e verá a previsão perder precisão.
# Os números que governam a rede: semente, taxa, épocas, informe e forma
SEMILLA = 7 # Semente fixa: com o mesmo dado o resultado é sempre o mesmo
TASA = 0.1 # Taxa de aprendizagem: quanto cada peso se corrige em cada amostra
EPOCAS = 2000 # Épocas: quantas voltas completas se dão às 21 amostras
INFORME = 250 # A cada quantas épocas se imprime o erro médio da rede
REZAGO = 3 # Entradas da rede: os 3 meses anteriores
OCULTAS = 4 # Neurônios ocultos: nem tão poucos que não aprenda, nem tantos que decore
VENTANA = 3 # Meses que a média móvel considera, para comparar método com método
Em seguida vêm duas funções de três linhas que sustentam todo o resto. A primeira leva a série para uma escala confortável — o intervalo de zero a um — e a segunda é a curva do neurônio, essa que comprime qualquer número para esse mesmo intervalo. Sem essas duas funções, as contas vão para o infinito e o programa não aprende nada.
def escalar(valores: list[float]) -> tuple:
"""Leva a série ao intervalo 0..1 (min-max): assim a rede trabalha com números pequenos."""
minimo, maximo = min(valores), max(valores)
rango = maximo - minimo
# Se toda a série tivesse o mesmo valor o intervalo seria zero: o 0 evita dividir por zero
return [(valor - minimo) / rango for valor in valores], minimo, maximo
def sigmoide(suma: float) -> float:
"""Sigmoide: comprime qualquer número no intervalo 0..1 (a curva do neurônio)."""
return 1.0 / (1.0 + math.exp(-suma))
Aí está o coração da coisa: cada vez que a rede vê um mês de exemplo, compara a sua resposta com o dado real, mede a diferença e move cada peso um pouquinho contra o erro. É só isso. Repetido duas mil vezes, esse movimento é o que chamamos de aprender.
# Descida do gradiente: cada peso se move um pouco contra o erro
for j in range(OCULTAS):
red["w_salida"][j] += TASA * delta_salida * ocultas[j]
red["b_salida"] += TASA * delta_salida
E por fim a régua com que tudo é medido: a média móvel de três meses, que é a conta que qualquer um faria à mão, e o cálculo do erro absoluto médio de cada método exatamente sobre os mesmos meses. Esse detalhe é a chave de uma comparação honesta: se cada método fosse medido em meses diferentes, a comparação não valeria nada.
def promedio_movil(unidades: list[float], indice: int) -> float:
"""Previsão da média móvel: a média dos meses anteriores a esse mês."""
return sum(unidades[indice - VENTANA:indice]) / VENTANA
evaluados = [fila for fila in filas if fila["promedio"] is not None]
error_pm = sum(abs(fila["unidades"] - fila["promedio"]) for fila in evaluados) / len(evaluados)
error_rd = sum(abs(fila["unidades"] - fila["red"]) for fila in evaluados) / len(evaluados)
O que você vai ver na tela
A primeira coisa que o programa imprime é o que ele leu e com que forma a rede vai trabalhar:
Meses lidos: 24 Rede neural: 3 -> 4 -> 1 (sigmoide) Janela da média móvel: 3 meses Intervalo da série: 150,00 a 310,00 unidades
Depois ele mostra o andamento do treino a cada duzentas e cinquenta voltas. Esse detalhe é mais útil do que parece: o erro cai rápido no começo e depois empaca, e ver isso com os próprios olhos explica por que se escolhem duas mil épocas e não vinte mil.
TREINAMENTO: 2000 épocas, taxa 0,10, semente 7 Época 500/2000 · erro médio (escala 0-1) 0,093869 Época 1000/2000 · erro médio (escala 0-1) 0,086684 Época 2000/2000 · erro médio (escala 0-1) 0,078619
E fecha com o veredicto, que é o que você veio buscar:
RESUMO: QUEM ERRA MENOS Meses avaliados (os que têm 3 meses de histórico): 21 Erro absoluto médio da média móvel de 3 meses: 17,32 unidades Erro absoluto médio da rede neural 3-4-1: 12,58 unidades Previsão de 2028-01 - média móvel de 3 meses: 300,33 unidades Previsão de 2028-01 - rede neural 3-4-1: 289,71 unidades
O programa também salva a tabela completa em salida/pronostico.csv, com uma linha por mês e quatro colunas: o mês, as unidades reais, a previsão da média móvel e a da rede. O Excel abre esse arquivo e dá para montar um gráfico e ver com os próprios olhos onde as duas linhas se separam.
O resultado, contado sem exagero
Com os dados de exemplo o veredicto é claro, mas modesto: nos vinte e um meses avaliados, a média móvel errou em média 17,32 unidades por mês e a rede, 12,58. A rede venceu, sim, mas por pouco: menos de cinco unidades por mês numa série que anda entre 150 e 310 unidades. Para o mês seguinte os dois métodos também ficam próximos: a média móvel aponta para 300,33 unidades e a rede para 289,71. É isso que existe, nem mais nem menos: com vinte e quatro meses de histórico, a rede venceu a média por pouco, e esse resultado basta para continuar testando com os seus próprios dados, não para acreditar que ela adivinha o futuro.
Vale ter claro o que é essa rede antes de entregar a ela uma decisão de compra. Não é um programa que entende de vendas nem um oráculo: é uma regra que se ajusta sozinha. Imagine uma regra escrita com uma vintena de números; toda vez que a regra erra, esses números se deslocam um pouco para onde o erro diminui, até pararem na posição em que erram o mínimo possível. Nada além disso. Por isso o programa se compara com a média móvel: porque uma regra que se ajusta sozinha só vale a pena se vence a regra fixa que você já usava.
Erros comuns e conselhos
- Mudar os dados e nunca mais olhar o erro. O programa imprime sempre o erro dos dois métodos. Se ao carregar as suas vendas a rede ficar pior que a média, não há nada quebrado: os seus dados simplesmente não se entregam a uma rede tão pequena. Fique com a média e siga trabalhando.
- Tratar a previsão como promessa. Uma previsão é uma estimativa com erro, e o programa diz esse erro com todas as letras. Use o número para planejar compras e conversar com fornecedores, não para assinar compromisso de entrega.
- Histórico curto demais. Com doze meses a rede quase não tem de onde aprender e a média móvel também não se mede bem. Este programa foi pensado para dois anos ou mais.
- Esconder a sazonalidade. Se o seu negócio vende o triplo em dezembro, três meses de histórico não bastam para a rede ver o pico chegando. Carregue dois ou três anos completos e refaça a comparação.
- Mexer na semente para melhorar o resultado. Se você troca a semente até a rede vencer, não está mais medindo: está fazendo trapaça. Deixe a semente fixa e aceite o veredicto, vença quem vencer.
- Não conferir o arquivo de dados antes de rodar. Os cabeçalhos do CSV e o separador decimal precisam ser consistentes; se o Excel gravou os meses em outra ordem ou em outro formato, o programa vai ler outra coisa.
Quando isso não basta
Este programa é um bom ponto de partida e uma ótima maneira de entender uma previsão sem depender de ninguém, mas fica curto quando o negócio cresce. Aqui existe uma série só, um produto e uma pasta de arquivos: não há usuários, nem depósitos, nem histórico de quem mexeu em quê.
Quando o estoque já não cabe numa planilha — centenas de itens, vários depósitos e movimentações todos os dias — e quando você quer a previsão, o ponto de pedido e o movimento do dia no mesmo lugar, é aí que o Kardex Tauro faz o que um script não faz. A ideia de fundo não muda: a rede continua sendo a mesma regra que se ajusta sozinha, só que agora roda sobre dados organizados e com cópia de segurança. Comece pelo programa gratuito para entender o método e organizar a ficha de estoque; o software completo é para quando o Excel e os scripts já não bastam.
⬇ Baixar o código (ZIP)Baixe o ZIP, troque o arquivo de dados pelas suas próprias vendas dos últimos dois anos e olhe o resumo. Se a rede vencer a média por pouco, boa notícia: você já tem um método de previsão medido com os seus números, e sabe de quanto ele costuma errar.