File size: 2,487 Bytes
5240148
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
"""
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)
    variaveis_dicotomicas: List[str] = field(default_factory=list)
    periodo_dados_mercado: Dict[str, Any] = field(default_factory=dict)
    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."""
        total = self.modelos_resumos.get('n')
        try:
            if total is not None and int(total) > 0:
                return int(total)
        except (TypeError, ValueError):
            pass
        return len(self.xy_preview.index)

    @property
    def n_variaveis(self) -> int:
        """Retorna número de variáveis do modelo."""
        return self.modelos_resumos.get('k', 0)