thyroid-detection / app.py
app.py
Raw
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()