69 lines
1.9 KiB
Python
69 lines
1.9 KiB
Python
from fastapi import FastAPI, HTTPException
|
|
from pydantic import BaseModel
|
|
from typing import Dict
|
|
from decision_tree_model import (
|
|
get_required_fields,
|
|
predict_from_input_dict,
|
|
get_available_csv_files
|
|
)
|
|
|
|
app = FastAPI()
|
|
|
|
class PredictRequest(BaseModel):
|
|
file: str
|
|
data: Dict[str, float]
|
|
certificate_average_score: float
|
|
|
|
@app.get("/files")
|
|
def list_csv_files():
|
|
return {"files": get_available_csv_files()}
|
|
|
|
@app.get("/fields")
|
|
def get_fields(file: str):
|
|
try:
|
|
fields = get_required_fields(file)
|
|
return {"fields": fields}
|
|
except Exception as e:
|
|
raise HTTPException(status_code=404, detail=str(e))
|
|
|
|
@app.post("/predict")
|
|
def predict_route(req: PredictRequest):
|
|
try:
|
|
input_data = req.data
|
|
required = get_required_fields(req.file)
|
|
cert_avg_score = req.certificate_average_score
|
|
|
|
for field in required:
|
|
if field not in input_data:
|
|
raise HTTPException(status_code=400, detail=f"Field '{field}' wajib diisi.")
|
|
try:
|
|
input_data[field] = float(input_data[field])
|
|
except:
|
|
raise HTTPException(status_code=400, detail=f"Field '{field}' harus berupa angka.")
|
|
|
|
prediction = predict_from_input_dict(req.file, input_data)
|
|
selected_attributes = ["RATA_RATA", "MAT", "BIO", "KIM", "BIG"]
|
|
selected_values = [input_data[attr] for attr in selected_attributes]
|
|
avg_score = sum(selected_values) / len(selected_values)
|
|
|
|
if avg_score < 75:
|
|
prediction = 0
|
|
else:
|
|
prediction = predict_from_input_dict(req.file, input_data)
|
|
|
|
|
|
if prediction == 1:
|
|
score = 50 + cert_avg_score
|
|
else:
|
|
score = 25 + cert_avg_score
|
|
|
|
result = {
|
|
"prediction": prediction,
|
|
"score": score
|
|
}
|
|
|
|
return result
|
|
|
|
except Exception as e:
|
|
raise HTTPException(status_code=500, detail=str(e))
|
|
|