File size: 4,532 Bytes
dad2f37
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import torch

from agroscan.classifier import AgroScanClassifier
from agroscan.data_loader import DataBundle


class FakeModel:
    def encode(self, texts, convert_to_tensor=True, normalize_embeddings=True):
        if isinstance(texts, list):
            vectors = [self._to_vec(t) for t in texts]
            return torch.stack(vectors)
        return self._to_vec(texts)

    def _to_vec(self, text):
        t = str(text).lower()
        if "solo" in t:
            return torch.tensor([1.0, 0.0])
        if "lagarta" in t:
            return torch.tensor([0.0, 1.0])
        return torch.tensor([0.7, 0.7])


def test_diagnostico_e_tratamento_retorna_campos_esperados():
    import pandas as pd

    df_base = pd.DataFrame({"DIAGNÓSTICO": ["Pragas do Solo", "Lagartas"]})
    df_trat = pd.DataFrame(
        {
            "Categoria da Praga": ["Pragas do Solo", "Lagartas"],
            "Tratamento Nível 1 (Orgânico)": ["Org Solo", "Org Lag"],
            "Tratamento Nível 2 (Genérico)": ["Gen Solo", "Gen Lag"],
            "Tratamento Nível 3 (Agrotóxico Controlado)": ["Agr Solo", "Agr Lag"],
        }
    )

    bundle = DataBundle(
        df_base=df_base,
        df_culturas_pragas=df_trat,
        diag_base_col="DIAGNÓSTICO",
        diag_trat_col="Categoria da Praga",
        trat1_col="Tratamento Nível 1 (Orgânico)",
        trat2_col="Tratamento Nível 2 (Genérico)",
        trat3_col="Tratamento Nível 3 (Agrotóxico Controlado)",
    )

    clf = AgroScanClassifier(data=bundle, model=FakeModel())
    out = clf.diagnostico_e_tratamento(["solo seco", "raiz roida"])

    assert out["diagnostico"] == "Pragas do Solo"
    assert out["tratamento_nivel_1"] == "Org Solo"
    assert out["tratamento_nivel_2"] == "Gen Solo"
    assert out["tratamento_nivel_3"] == "Agr Solo"


def test_diagnostico_e_tratamento_faz_fallback_semantico_categoria():
    import pandas as pd

    # "Pragas de Solo" nao existe igual no tratamento, mas e semanticamente proxima.
    df_base = pd.DataFrame({"DIAGNÓSTICO": ["Pragas de Solo", "Lagartas"]})
    df_trat = pd.DataFrame(
        {
            "Categoria da Praga": ["Pragas do Solo", "Lagartas"],
            "Tratamento Nível 1 (Orgânico)": ["Org Solo", "Org Lag"],
            "Tratamento Nível 2 (Genérico)": ["Gen Solo", "Gen Lag"],
            "Tratamento Nível 3 (Agrotóxico Controlado)": ["Agr Solo", "Agr Lag"],
        }
    )

    bundle = DataBundle(
        df_base=df_base,
        df_culturas_pragas=df_trat,
        diag_base_col="DIAGNÓSTICO",
        diag_trat_col="Categoria da Praga",
        trat1_col="Tratamento Nível 1 (Orgânico)",
        trat2_col="Tratamento Nível 2 (Genérico)",
        trat3_col="Tratamento Nível 3 (Agrotóxico Controlado)",
    )

    clf = AgroScanClassifier(data=bundle, model=FakeModel())
    out = clf.diagnostico_e_tratamento(["solo seco", "raiz roida"])

    assert out["diagnostico"] == "Pragas de Solo"
    assert out["tratamento_nivel_1"] == "Org Solo"
    assert out["tratamento_nivel_2"] == "Gen Solo"
    assert out["tratamento_nivel_3"] == "Agr Solo"


def test_match_estruturado_prioriza_linha_exata_da_base():
    import pandas as pd

    df_base = pd.DataFrame(
        {
            "Municipio": ["Boa Vista", "Alto Alegre"],
            "Porte": ["Pequeno", "Medio"],
            "Cultura": ["Mandioca", "Milho"],
            "Sintoma": ["Folhas amareladas e murcha inicial", "Folhas amareladas e com buracos"],
            "DIAGNÓSTICO": ["Percevejo", "Lagarta-do-cartucho"],
        }
    )
    df_trat = pd.DataFrame(
        {
            "Categoria da Praga": ["Percevejo", "Lagarta-do-cartucho"],
            "Tratamento Nível 1 (Orgânico)": ["Org Per", "Org Lag"],
            "Tratamento Nível 2 (Genérico)": ["Gen Per", "Gen Lag"],
            "Tratamento Nível 3 (Agrotóxico Controlado)": ["Agr Per", "Agr Lag"],
        }
    )

    bundle = DataBundle(
        df_base=df_base,
        df_culturas_pragas=df_trat,
        diag_base_col="DIAGNÓSTICO",
        diag_trat_col="Categoria da Praga",
        trat1_col="Tratamento Nível 1 (Orgânico)",
        trat2_col="Tratamento Nível 2 (Genérico)",
        trat3_col="Tratamento Nível 3 (Agrotóxico Controlado)",
    )

    clf = AgroScanClassifier(data=bundle, model=FakeModel())
    out = clf.diagnostico_e_tratamento(
        ["Boa Vista", "Pequeno", "Mandioca", "Folhas amareladas e murcha inicial"]
    )

    assert out["diagnostico"] == "Percevejo"
    assert out["tratamento_nivel_1"] == "Org Per"