File size: 4,290 Bytes
75889cb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9f51c76
75889cb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
127
128
129
130
131
132
from fastapi import FastAPI
from asgiref.wsgi import WsgiToAsgi
from flask import Flask, request, render_template
import pickle, os
from fastapi.middleware.wsgi import WSGIMiddleware

# Initialize Flask app
flask_app = Flask(__name__)

def validasi_inputan(form_data):
    errors = {}

    # Validasi untuk field Age, TB, Alkphos, Sgpt, A/G Ratio
    if not form_data.get("Age"):
        errors["Age"] = "Age tidak boleh kosong."
    else:
        try:
            Age = int(form_data.get("Age"))
        except ValueError:
            errors["Age"] = "Age harus berupa angka."

    if form_data.get("Gender") not in ["0", "1"]:
        errors["Gender"] = "Gender harus 0 (Female) atau 1 (Male)."

    if not form_data.get("TB"):
        errors["TB"] = "TB tidak boleh kosong."
    else:
        try:
            TB = float(form_data.get("TB"))
        except ValueError:
            errors["TB"] = "TB harus berupa angka."

    if not form_data.get("Alkphos"):
        errors["Alkphos"] = "Alkphos tidak boleh kosong."
    else:
        try:
            Alkphos = float(form_data.get("Alkphos"))
        except ValueError:
            errors["Alkphos"] = "Alkphos harus berupa angka."

    if not form_data.get("Sgpt"):
        errors["Sgpt"] = "Sgpt tidak boleh kosong."
    else:
        try:
            Sgpt = float(form_data.get("Sgpt"))
        except ValueError:
            errors["Sgpt"] = "Sgpt harus berupa angka."

    if not form_data.get("AG_Ratio"):
        errors["AG_Ratio"] = "A/G Ratio tidak boleh kosong."
    else:
        try:
            AG_Ratio = float(form_data.get("AG_Ratio"))
        except ValueError:
            errors["AG_Ratio"] = "A/G Ratio harus berupa angka."

    return errors

def validate_data(record):
    errors = {}

    # Menambahkan batasan nilai untuk beberapa input
    if record["Age"] < 0 or record["Age"] > 150:
        errors["Age"] = "Age harus antara 0 dan 150."

    if record["TB"] < 0 or record["TB"] > 100:
        errors["TB"] = "TB harus antara 0 dan 100."

    if record["Alkphos"] < 0 or record["Alkphos"] > 1000:
        errors["Alkphos"] = "Alkphos harus antara 0 dan 1000."

    if record["Sgpt"] < 0 or record["Sgpt"] > 1000:
        errors["Sgpt"] = "Sgpt harus antara 0 dan 1000."

    if record["AG_Ratio"] < 0 or record["AG_Ratio"] > 2:
        errors["AG_Ratio"] = "A/G Ratio harus antara 0 dan 2."

    return errors

# Load models
linear_model_load = pickle.load(open('model.sav', 'rb'))
scaler_load = pickle.load(open('scaler.sav', 'rb'))

# Flask route
@flask_app.route("/", methods=["GET", "POST"])
def index():
    prediction = None
    errors = {}
    if request.method == "POST":
        # Validasi inputan tidak boleh kosong
        errors = validasi_inputan(request.form)
        if not errors:
            record = {
                "Age": int(request.form.get("Age")),
                "Gender": int(request.form.get("Gender")),  # Gender (0 = Female, 1 = Male)
                "TB": float(request.form.get("TB")),
                "Alkphos": float(request.form.get("Alkphos")),
                "Sgpt": float(request.form.get("Sgpt")),
                "AG_Ratio": float(request.form.get("AG_Ratio"))
            }

            errors = validate_data(record)
            if not errors:
                # Data input untuk prediksi
                input_data = [
                    record["Age"],
                    record["Gender"],
                    record["TB"],
                    record["Alkphos"],
                    record["Sgpt"],
                    record["AG_Ratio"]
                ]

                # Normalisasi input data
                input_data_normalized = scaler_load.transform([input_data])

                # Membuat prediksi dari model
                predicted_value_normalized = linear_model_load.predict(input_data_normalized)

                # Menyesuaikan bentuk data untuk inverse_transform

                # Mengambil elemen prediksi pertama sebagai hasil akhir
                prediction = int(predicted_value_normalized)

    return render_template('index.html', prediction=prediction, errors=errors, record=request.form)


# FastAPI app to mount Flask app
app = FastAPI()

# Mount Flask app inside FastAPI using WSGIMiddleware
app.mount("/", WSGIMiddleware(flask_app))