File size: 3,860 Bytes
cd9e894
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
import joblib
import pandas as pd
import gradio as gr

# --- 1) Загружаем модель ---
# Положи свой файл рядом (например, model.joblib)
# или укажи путь через переменную окружения MODEL_PATH
MODEL_PATH = os.getenv("MODEL_PATH", "model.joblib")
model = joblib.load(MODEL_PATH)

# Имена колонок должны совпадать с теми, на которых обучалась модель
FEATURE_COLUMNS = [
    "Type",
    "Air temperature [K]",
    "Process temperature [K]",
    "Rotational speed [rpm]",
    "Torque [Nm]",
    "Tool wear [min]",
]

TYPE_CHOICES = ["L", "M", "H"]  # под твой датасет

# --- 2) Функция предсказания для одной записи ---
def predict_single(_type, air_k, proc_k, rpm, torque, wear):
    row = {
        "Type": _type,
        "Air temperature [K]": float(air_k),
        "Process temperature [K]": float(proc_k),
        "Rotational speed [rpm]": float(rpm),
        "Torque [Nm]": float(torque),
        "Tool wear [min]": float(wear),
    }
    X = pd.DataFrame([row], columns=FEATURE_COLUMNS)

    if hasattr(model, "predict_proba"):
        proba = float(model.predict_proba(X)[:, 1][0])
        label = int(proba >= 0.5)
    else:
        # на случай, если модели нет predict_proba (вернём 0/1)
        label = int(model.predict(X)[0])
        proba = float(label)

    return round(proba, 4), int(label)

# --- 3) Пакетный режим (CSV/DataFrame) ---
def predict_batch(df: pd.DataFrame):
    # Проверяем, что нужные колонки есть
    missing = [c for c in FEATURE_COLUMNS if c not in df.columns]
    if missing:
        raise gr.Error(f"В CSV не хватает колонок: {missing}")

    X = df[FEATURE_COLUMNS].copy()
    if hasattr(model, "predict_proba"):
        probs = model.predict_proba(X)[:, 1]
        labels = (probs >= 0.5).astype(int)
    else:
        labels = model.predict(X)
        probs = labels.astype(float)

    out = df.copy()
    out["failure_probability"] = probs.round(4)
    out["predicted_label"] = labels
    return out

# --- 4) UI ---
with gr.Blocks(title="Predictive Maintenance (Gradio)") as demo:
    gr.Markdown("## Predictive Maintenance – Inference\nВвод параметров → предсказание вероятности отказа.")

    with gr.Tab("Single"):
        with gr.Row():
            t  = gr.Dropdown(TYPE_CHOICES, value="L", label="Type")
            aK = gr.Number(value=300.0, label="Air temperature [K]")
            pK = gr.Number(value=310.0, label="Process temperature [K]")
        with gr.Row():
            rpm = gr.Number(value=1500, label="Rotational speed [rpm]")
            tq  = gr.Number(value=40.0, label="Torque [Nm]")
            tw  = gr.Number(value=120.0, label="Tool wear [min]")

        btn = gr.Button("Predict")
        prob = gr.Number(label="failure_probability")
        labl = gr.Number(label="predicted_label (0/1)")

        # api_name="predict" — даёт REST-эндпоинт /run/predict
        btn.click(
            predict_single,
            inputs=[t, aK, pK, rpm, tq, tw],
            outputs=[prob, labl],
            api_name="predict"
        )

    with gr.Tab("Batch (CSV)"):
        gr.Markdown(
            "Загрузи CSV с колонками: "
            + ", ".join([f"`{c}`" for c in FEATURE_COLUMNS])
        )
        df_in  = gr.Dataframe(headers=FEATURE_COLUMNS, label="Input Data", row_count=2)
        btn_b  = gr.Button("Predict for all rows")
        df_out = gr.Dataframe(label="Output with predictions")
        btn_b.click(predict_batch, inputs=df_in, outputs=df_out, api_name="predict_batch")

# Запуск
if __name__ == "__main__":
    demo.launch()