File size: 3,514 Bytes
1a242fa
 
b8e582e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# A importação do sklearn/LogisticRegression é necessária caso o modelo não carregue# PEQUENA ALTERAÇÃO PARA FORÇAR O BUILD

import gradio as gr
import pandas as pd
import joblib
import numpy as np
from sklearn.linear_model import LogisticRegression 
# A importação do sklearn/LogisticRegression é necessária caso o modelo não carregue

# --- 1. CARREGAR O MODELO ---
# O NOME DO ARQUIVO DEVE SER EXATAMENTE o que você subiu (modelo_chuva_lr.joblib)
MODEL_FILE = "modelo_chuva_lr.joblib" 
try:
    model = joblib.load(MODEL_FILE)
    print(f"Modelo de previsão carregado: {MODEL_FILE}")
except Exception as e:
    print(f"ERRO ao carregar o modelo {MODEL_FILE}. Usando um placeholder. Erro: {e}")
    # Criação de um modelo placeholder caso o arquivo não seja encontrado
    model = LogisticRegression()
    X_fake = pd.DataFrame(np.random.rand(10, 5), columns=['TempMax', 'Umidade', 'Pressao', 'VelVento', 'Mes'])
    y_fake = np.random.randint(0, 2, 10)
    model.fit(X_fake, y_fake)


# --- 2. FUNÇÃO DE PREVISÃO ---
def prever_clima(temp_max, umidade_dia, pressao_dia, vel_vento, mes):
    """
    Recebe as entradas do Gradio e retorna a previsão de chuva e probabilidade.
    """
    
    # IMPORTANTE: A ordem das colunas e os nomes devem ser iguais aos do treinamento.
    input_data = pd.DataFrame({
        'TempMax': [temp_max],
        'Umidade': [umidade_dia],
        'Pressao': [pressao_dia],
        'VelVento': [vel_vento],
        'Mes': [mes]
    })
    
    try:
        # Previsão de probabilidade da classe 1 (Chuva)
        prob_chuva = model.predict_proba(input_data)[:, 1][0] * 100
        
        # Classificação final
        if prob_chuva > 50:
            resultado = "Sim, há **alta probabilidade** de chuva!"
        elif prob_chuva > 20:
            resultado = "Probabilidade moderada de chuva."
        else:
            resultado = "Não, a probabilidade de chuva é **baixa**."
        
        return resultado, f"{prob_chuva:.2f}%"

    except Exception as e:
        return f"Erro na previsão (Verifique os logs): {e}", "0.0%"


# --- 3. DEFINIÇÃO DA INTERFACE GRADIO ---
with gr.Blocks() as demo:
    gr.Markdown("# 🌧️ Previsão de Chuvas (Modelo Simples)")
    gr.Markdown("Este é um modelo de demonstração treinado em dados simulados de temperatura, umidade, pressão, vento e mês do ano.")

    with gr.Row():
        temp_max_input = gr.Slider(label="Temperatura Máxima Esperada (°C)", minimum=10, maximum=50, value=25, step=1)
        umidade_input = gr.Slider(label="Umidade Relativa do Ar (%)", minimum=0, maximum=100, value=65, step=1)
        
    with gr.Row():
        pressao_input = gr.Slider(label="Pressão Atmosférica (hPa)", minimum=950, maximum=1050, value=1010, step=0.1)
        vel_vento_input = gr.Slider(label="Velocidade Média do Vento (km/h)", minimum=0, maximum=100, value=15, step=1)
        mes_input = gr.Slider(label="Mês do Ano (1=Jan, 12=Dez)", minimum=1, maximum=12, value=11, step=1)

    predict_btn = gr.Button("🔮 Prever Chuva", variant="primary")
    
    with gr.Row():
        resultado_output = gr.Textbox(label="Veridicto", value="Aguardando dados...", interactive=False)
        prob_output = gr.Textbox(label="Probabilidade de Chuva", value="0.0%", interactive=False)

    predict_btn.click(
        fn=prever_clima,
        inputs=[temp_max_input, umidade_input, pressao_input, vel_vento_input, mes_input],
        outputs=[resultado_output, prob_output]
    )

demo.queue().launch()