CHANGE: Enable training models
All checks were successful
Build docker container / Build image (push) Successful in 10m29s

This commit is contained in:
2025-12-21 00:26:15 +01:00
parent 2389e17b4c
commit ff51af276d
8 changed files with 225 additions and 87 deletions

94
src/app.py Normal file
View 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)