| import os |
| import json |
| from flask import Flask, render_template, request, jsonify, send_file |
| import pandas as pd |
|
|
| from src.model import ChurnClassifier |
| from src.predict import predict_single |
| from src.train import train_pipeline |
|
|
| app = Flask(__name__) |
|
|
| MODEL_PATH = "models/churn_model.pkl" |
| METRICS_PATH = "models/metrics.json" |
|
|
| @app.route("/") |
| def index(): |
| |
| metrics = None |
| if os.path.exists(METRICS_PATH): |
| try: |
| with open(METRICS_PATH, "r") as f: |
| metrics = json.load(f) |
| except Exception: |
| pass |
| |
| model_exists = os.path.exists(MODEL_PATH) |
| return render_template("index.html", metrics=metrics, model_exists=model_exists) |
|
|
| @app.route("/video") |
| def video(): |
| possible_paths = ["download.webm", "src/static/download.webm", os.path.join(os.path.dirname(__file__), "..", "download.webm")] |
| for path in possible_paths: |
| if os.path.exists(path): |
| return send_file(path, mimetype="video/webm") |
| return "Video not found", 404 |
|
|
| @app.route("/train", methods=["POST"]) |
| def train(): |
| try: |
| train_pipeline( |
| n_samples=1000, |
| test_size=0.2, |
| model_path=MODEL_PATH, |
| metrics_path=METRICS_PATH |
| ) |
| with open(METRICS_PATH, "r") as f: |
| metrics = json.load(f) |
| return jsonify({"success": True, "metrics": metrics}) |
| except Exception as e: |
| return jsonify({"success": False, "error": str(e)}), 500 |
|
|
| @app.route("/predict", methods=["POST"]) |
| def predict(): |
| try: |
| age = int(request.form.get("age", 40)) |
| monthly_charges = float(request.form.get("monthly_charges", 50.0)) |
| contract_length = int(request.form.get("contract_length", 12)) |
| support_calls = int(request.form.get("support_calls", 1)) |
| tech_support = request.form.get("tech_support", "no") |
| |
| result = predict_single( |
| age=age, |
| monthly_charges=monthly_charges, |
| contract_length=contract_length, |
| support_calls=support_calls, |
| tech_support=tech_support, |
| model_path=MODEL_PATH |
| ) |
| return jsonify({"success": True, "result": result}) |
| except Exception as e: |
| return jsonify({"success": False, "error": str(e)}), 500 |
|
|
| if __name__ == "__main__": |
| port = int(os.environ.get("PORT", 7860)) |
| app.run(host="0.0.0.0", port=port, debug=False) |
|
|
|
|