""" Dataclass tipada para os dados do modelo de avaliação. Os dados são carregados de arquivos .dai (joblib). """ from dataclasses import dataclass, field from typing import Dict, List, Any, Optional from pathlib import Path import pandas as pd @dataclass class ModelData: """Representa os dados estatísticos de um modelo de avaliação.""" nome: str path: Path # Dados do banco de dados xy_preview: pd.DataFrame = field(default_factory=pd.DataFrame) top_x_esc: pd.DataFrame = field(default_factory=pd.DataFrame) top_y_esc: pd.Series = field(default_factory=pd.Series) # Estatísticas descritivas estatisticas: pd.DataFrame = field(default_factory=pd.DataFrame) # Modelo de regressão tabelas_coef: pd.DataFrame = field(default_factory=pd.DataFrame) tabelas_obs_calc: pd.DataFrame = field(default_factory=pd.DataFrame) modelos_resumos: Dict[str, Any] = field(default_factory=dict) modelos_sm: Any = None # RegressionResultsWrapper # Transformações e gráficos formatted_top_transformation_info: List[Any] = field(default_factory=list) graf_model: str = "" @property def r2(self) -> Optional[float]: """Retorna o coeficiente de determinação R².""" return self.modelos_resumos.get('r2') @property def r2_ajustado(self) -> Optional[float]: """Retorna o R² ajustado.""" return self.modelos_resumos.get('r2_ajustado') @property def equacao(self) -> Optional[str]: """Retorna a equação do modelo.""" return self.modelos_resumos.get('equacao') @property def variaveis(self) -> List[str]: """Retorna lista de variáveis do modelo.""" if self.tabelas_coef.empty: return [] return [v for v in self.tabelas_coef.index.tolist() if v != 'const'] @property def n_amostras(self) -> int: """Retorna número de amostras no banco de dados.""" return self.modelos_resumos.get('n', 0) @property def n_variaveis(self) -> int: """Retorna número de variáveis do modelo.""" return self.modelos_resumos.get('k', 0) def tem_template(self) -> bool: """Verifica se existe template de metodologia.""" template_path = self.path / "metodologia.docx" return template_path.exists() def get_template_path(self) -> Optional[Path]: """Retorna caminho do template de metodologia.""" template_path = self.path / "metodologia.docx" return template_path if template_path.exists() else None