from wsgiref import simple_server from flask import Flask, request, Response, render_template import flask_monitoringdashboard as dashboard import os import pandas as pd import time from Training.validation_insertion_main import trainValidationInsertion from Prediction.prediction_validation_insertion_main import predictValidationInsertion from modelTraining import trainModel from modelPrediction import predictModel app = Flask(__name__) dashboard.bind(app) # Show input data used for Prediction - used for "/" route input_file = 'Prediction/PredictionFile_FromDB/InputFile.csv' pred_df = pd.read_csv(input_file) @app.route("/", methods=['GET']) def homepage(): return render_template('index.html', tables=[pred_df[:5].to_html(classes='data', header="true")]) @app.route("/predict", methods=['POST']) def predictRoute(): try: # Prediction via Postman if request.json is not None: path = request.json['folderpath'] # Validate prediction data pred_val = predictValidationInsertion(path) pred_val.predictionValidateInsert() # Make predictions using models built during training model_pred = predictModel() path, result_df = model_pred.modelPrediction() json_predictions = result_df.head(25).to_json(orient='records') # Return predictions return Response( "Prediction file created at " + str(path) + ". Few predictions are " + str(json_predictions)) # Prediction via UI elif request.form is not None: path = request.form['folderpath'] # Validate prediction data pred_val = predictValidationInsertion(path) pred_val.predictionValidateInsert() # Make predictions using models built during training model_pred = predictModel() path, result_df = model_pred.modelPrediction() pred_df["Prediction"] = result_df["Predictions"] # Return predictions return render_template('results.html', tables=[pred_df[:10].to_html(classes='data', header="true")]) except ValueError: return Response("Error Occurred! %s" % ValueError) except KeyError: return Response("Error Occurred! %s" % KeyError) except Exception as e: return Response("Error Occurred! %s" % e) # Add prediction logs @app.route("/pred_log_stream") def pred_log_stream(): """add prediction logging information""" def inner(): with open("Model_Prediction_Log.txt") as log_info: data = log_info.read() yield data.encode() time.sleep(1) return Response(inner(), mimetype="text/plain", content_type="text/event-stream") # Render model training template @app.route("/train", methods=['GET']) def trainRoute(): try: # renders training template return render_template('training.html') except Exception as e: return Response("Error Occurred! %s" % e) # Train models @app.route("/train_models", methods=['POST']) def trainModels(): # passes folder with train data and build models try: if request.form is not None: path = request.form['folderpath'] # Validate training data train_val = trainValidationInsertion(path) train_val.trainingValidateInsert() # Train Models model_train = trainModel() model_train.modelTraining() return render_template('training.html') except ValueError: return Response("Error Occurred! %s" % ValueError) except KeyError: return Response("Error Occurred! %s" % KeyError) except Exception as e: return Response("Error Occurred! %s" % e) # Add training logs @app.route("/train_log_stream") def train_log_stream(): """add training logging information""" def inner(): with open("Model_Training_Log.txt") as log_info: data = log_info.read() yield data.encode() time.sleep(1) return Response(inner(), mimetype="text/plain", content_type="text/event-stream") # Route for training via POSTMAN @app.route("/train_postman", methods=['POST']) def trainPostman(): try: if request.json is not None: path = request.json['folderpath'] # Validate training data train_val = trainValidationInsertion(path) train_val.trainingValidateInsert() # Train Models model_train = trainModel() model_train.modelTraining() # Return training return Response("Training successful !!") except ValueError: return Response("Error Occurred! %s" % ValueError) except KeyError: return Response("Error Occurred! %s" % KeyError) except Exception as e: return Response("Error Occurred! %s" % e) port = int(os.getenv("PORT", 8000)) if __name__ == "__main__": host = '0.0.0.0' # port = 5000 httpd = simple_server.make_server(host, port, app) print("Serving on %s %d" % (host, port)) httpd.serve_forever()