CHANGE: Enable training models
All checks were successful
Build docker container / Build image (push) Successful in 10m29s
All checks were successful
Build docker container / Build image (push) Successful in 10m29s
This commit is contained in:
94
src/app.py
Normal file
94
src/app.py
Normal file
@@ -0,0 +1,94 @@
|
||||
from flask import Flask, jsonify, request
|
||||
import joblib
|
||||
import os
|
||||
from datetime import date
|
||||
|
||||
from db import fetch_data
|
||||
import threading
|
||||
from model_registry import register, load_meta
|
||||
from models_train import train_demand_model, train_nulo_model
|
||||
|
||||
app = Flask(__name__)
|
||||
MODEL_DIR = "models"
|
||||
|
||||
def load_model(model_type):
|
||||
meta = load_meta()
|
||||
file = meta["current"].get(model_type)
|
||||
if not file:
|
||||
return None
|
||||
return joblib.load(os.path.join(MODEL_DIR, file))
|
||||
|
||||
def background_train():
|
||||
print("Fetching data...")
|
||||
df = fetch_data()
|
||||
print(f"Data fetched: {len(df)} rows")
|
||||
|
||||
today = date.today().isoformat()
|
||||
os.makedirs(MODEL_DIR, exist_ok=True)
|
||||
|
||||
print("Training demand model...")
|
||||
demand_model = train_demand_model(df)
|
||||
demand_file = f"demand_xgb_{today}.joblib"
|
||||
joblib.dump(demand_model, f"{MODEL_DIR}/{demand_file}")
|
||||
register("demand", demand_file, len(df))
|
||||
print("Demand model trained and saved.")
|
||||
|
||||
print("Training nulo model...")
|
||||
nulo_model = train_nulo_model(df)
|
||||
nulo_file = f"nulo_xgb_{today}.joblib"
|
||||
joblib.dump(nulo_model, f"{MODEL_DIR}/{nulo_file}")
|
||||
register("nulo", nulo_file, len(df))
|
||||
print("Nulo model trained and saved.")
|
||||
|
||||
@app.route("/train", methods=["POST"])
|
||||
def train():
|
||||
threading.Thread(target=background_train).start()
|
||||
return jsonify({"status": "training started"})
|
||||
|
||||
@app.route("/predict_demand", methods=["GET"])
|
||||
def predict_demand():
|
||||
h3 = int(request.args["h3"])
|
||||
week = int(request.args["week"])
|
||||
dow = int(request.args["dow"])
|
||||
hour = int(request.args["hour"])
|
||||
|
||||
model = load_model("demand")
|
||||
X = [[h3, week, dow, hour]]
|
||||
pred = model.predict(X)[0]
|
||||
|
||||
return jsonify({"expected_demand": float(pred)})
|
||||
|
||||
@app.route("/predict_nulo", methods=["GET"])
|
||||
def predict_nulo():
|
||||
h3 = int(request.args["h3"])
|
||||
week = int(request.args["week"])
|
||||
dow = int(request.args["dow"])
|
||||
hour = int(request.args["hour"])
|
||||
|
||||
model = load_model("nulo")
|
||||
X = [[h3, week, dow, hour]]
|
||||
prob = model.predict_proba(X)[0][1]
|
||||
|
||||
return jsonify({"nulo_probability": float(prob)})
|
||||
|
||||
@app.route("/predict", methods=["GET"])
|
||||
def predict_legacy():
|
||||
h3 = int(request.args["h3"])
|
||||
week = int(request.args["week"])
|
||||
dow = int(request.args["dow"])
|
||||
hour = int(request.args["hour"])
|
||||
|
||||
model = load_model("nulo")
|
||||
X = [[h3, week, dow, hour]]
|
||||
prob = model.predict_proba(X)[0][1]
|
||||
|
||||
return jsonify({
|
||||
"predicted_nulo_prob": float(prob)
|
||||
})
|
||||
|
||||
@app.route("/models", methods=["GET"])
|
||||
def models():
|
||||
return jsonify(load_meta())
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run(host="0.0.0.0", port=5000)
|
||||
Reference in New Issue
Block a user