Rizwan9 commited on
Commit
e75488c
·
verified ·
1 Parent(s): 7aca3d4

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +45 -10
app.py CHANGED
@@ -1,4 +1,3 @@
1
-
2
  from flask import Flask, request, jsonify
3
  import joblib
4
  import pandas as pd
@@ -6,27 +5,63 @@ import os
6
 
7
  app = Flask(__name__)
8
 
 
9
  MODEL_PATH = os.getenv("MODEL_PATH", "best_model_random_forest.joblib")
10
 
 
11
  if not os.path.exists(MODEL_PATH):
12
- raise FileNotFoundError(f"Model file not found: {MODEL_PATH}. Please ensure it's uploaded to the Space.")
 
 
13
 
14
  model_bundle = joblib.load(MODEL_PATH)
15
- if isinstance(model_bundle, dict) and "pipeline" in model_bundle:
16
- pipe = model_bundle["pipeline"]
17
- else:
18
- pipe = model_bundle
 
 
 
 
 
 
 
 
19
 
20
  @app.route("/health", methods=["GET"])
21
  def health():
22
- return jsonify({"status": "ok", "model": MODEL_PATH})
23
 
24
  @app.route("/predict", methods=["POST"])
25
  def predict():
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  data = request.get_json(force=True)
 
 
27
  df = pd.DataFrame([data]) if isinstance(data, dict) else pd.DataFrame(data)
28
- preds = pipe.predict(df)
29
- return jsonify({"predictions": [float(p) for p in preds]})
30
 
 
 
 
 
 
 
 
 
 
 
31
  if __name__ == "__main__":
32
- app.run(host="0.0.0.0", port=5000)
 
 
 
1
  from flask import Flask, request, jsonify
2
  import joblib
3
  import pandas as pd
 
5
 
6
  app = Flask(__name__)
7
 
8
+ # Default model path (can be changed via Space environment variable)
9
  MODEL_PATH = os.getenv("MODEL_PATH", "best_model_random_forest.joblib")
10
 
11
+ # Load model if it exists
12
  if not os.path.exists(MODEL_PATH):
13
+ raise FileNotFoundError(
14
+ f"❌ Model file not found: {MODEL_PATH}. Please ensure it's uploaded to the Space root directory."
15
+ )
16
 
17
  model_bundle = joblib.load(MODEL_PATH)
18
+
19
+ # Support both raw model or model dict with a pipeline
20
+ pipe = model_bundle["pipeline"] if isinstance(model_bundle, dict) and "pipeline" in model_bundle else model_bundle
21
+
22
+ @app.route("/", methods=["GET"])
23
+ def home():
24
+ return jsonify({
25
+ "status": "ok",
26
+ "message": "Backend Flask API is running successfully 🎉",
27
+ "model_loaded": True,
28
+ "model_path": MODEL_PATH
29
+ })
30
 
31
  @app.route("/health", methods=["GET"])
32
  def health():
33
+ return jsonify({"status": "ok", "model_path": MODEL_PATH})
34
 
35
  @app.route("/predict", methods=["POST"])
36
  def predict():
37
+ """
38
+ Example input:
39
+ {
40
+ "feature1": value1,
41
+ "feature2": value2,
42
+ ...
43
+ }
44
+ or
45
+ [
46
+ {"feature1": value1, "feature2": value2},
47
+ {"feature1": value3, "feature2": value4}
48
+ ]
49
+ """
50
  data = request.get_json(force=True)
51
+
52
+ # Normalize input to a DataFrame
53
  df = pd.DataFrame([data]) if isinstance(data, dict) else pd.DataFrame(data)
 
 
54
 
55
+ try:
56
+ preds = pipe.predict(df)
57
+ # Convert numpy types to native Python floats
58
+ predictions = [float(p) for p in preds]
59
+ return jsonify({"predictions": predictions})
60
+ except Exception as e:
61
+ return jsonify({"error": str(e)}), 400
62
+
63
+
64
+ # Entry point for local development; Spaces uses gunicorn automatically
65
  if __name__ == "__main__":
66
+ port = int(os.getenv("PORT", 7860)) # HF Spaces use port 7860 by default
67
+ app.run(host="0.0.0.0", port=port, debug=False)