Spaces:
Sleeping
Sleeping
File size: 1,759 Bytes
5a4fe8b | 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 | import os
import json
import joblib
import pandas as pd
from pathlib import Path
from flask import Flask, request, jsonify
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
# Model directory in HF Space (root/models/)
MODEL_PATH = Path("models") / "best_model.joblib"
if MODEL_PATH.exists():
PIPELINE = joblib.load(MODEL_PATH)
else:
PIPELINE = None
@app.get("/")
def root():
return jsonify({
"status": "ok",
"message": "ExtraaLearn Lead Conversion API",
"model_loaded": PIPELINE is not None
})
@app.post("/predict")
def predict_single():
"""Predict for a single JSON input"""
if PIPELINE is None:
return jsonify({"error": "Model not loaded"}), 503
payload = request.get_json(force=True)
X = pd.DataFrame([payload])
proba = float(PIPELINE.predict_proba(X)[:, 1][0])
pred = int(proba >= 0.5)
return jsonify({
"probability": proba,
"prediction": pred
})
@app.post("/predict-batch")
def predict_batch():
"""Predict for multiple JSON rows"""
if PIPELINE is None:
return jsonify({"error": "Model not loaded"}), 503
payload = request.get_json(force=True)
if isinstance(payload, dict) and "records" in payload:
records = payload["records"]
elif isinstance(payload, list):
records = payload
else:
return jsonify({"error": "Invalid payload format"}), 400
df = pd.DataFrame(records)
probas = PIPELINE.predict_proba(df)[:, 1]
preds = (probas >= 0.5).astype(int)
df["conversion_proba"] = probas
df["prediction"] = preds
return df.to_json(orient="records")
if __name__ == "__main__":
port = int(os.environ.get("PORT", 7860))
app.run(host="0.0.0.0", port=port)
|