Variação 2: Abordagem Orientada a Objetos (POO)
Usando essa variação achei mais interessante para reaproveitar o código.
Organizar o modelo em uma classe torna o código reutilizável, modular e fácil de integrar a sistemas maiores (como APIs ou pipelines de dados).
import numpy as np
class PrevisorMarkovClima:
"""
Classe para modelagem e simulação de previsão do tempo
utilizando Cadeias de Markov discretas.
"""
def __init__(self, estados: list, matriz_transicao: list):
self.estados = estados
self.matriz = np.array(matriz_transicao)
self._validar_matriz()
def _validar_matriz(self):
"""Valida se as probabilidades de cada linha somam aproximadamente 1.0"""
somas_linhas = self.matriz.sum(axis=1)
if not np.allclose(somas_linhas, 1.0):
raise ValueError("A soma das probabilidades de cada linha da matriz deve ser igual a 1.")
def _get_indice(self, estado: str) -> int:
"""Retorna o índice numérico do estado fornecido."""
return self.estados.index(estado)
def simular_trajetoria(self, estado_inicial: str, dias: int) -> list:
"""Gera uma sequência simulada de clima para N dias."""
if estado_inicial not in self.estados:
raise ValueError(f"Estado '{estado_inicial}' inválido. Escolha entre: {self.estados}")
clima_atual = estado_inicial
trajetoria = [clima_atual]
for _ in range(dias - 1):
idx_atual = self._get_indice(clima_atual)
# Sorteia o próximo estado com base na linha atual da matriz
proximo_clima = np.random.choice(self.estados, p=self.matriz[idx_atual])
trajetoria.append(proximo_clima)
clima_atual = proximo_clima
return trajetoria
# ---------------------------------------------------------
# Testando a Classe
# ---------------------------------------------------------
if __name__ == "__main__":
lista_estados = ["Ensolarado", "Nublado", "Chuvoso"]
matriz = [
[0.8, 0.15, 0.05],
[0.2, 0.6, 0.2],
[0.25, 0.25, 0.5]
]
# Instanciando o modelo
modelo_clima = PrevisorMarkovClima(lista_estados, matriz)
# Gerando previsão
previsao = modelo_clima.simular_trajetoria(estado_inicial="Ensolarado", dias=10)
print("=== PREVISÃO (VERSÃO POO) ===")
for i, dia_clima in enumerate(previsao, start=1):
print(f"Dia {i:02d}: {dia_clima}")