--- a +++ b/backend/app.py @@ -0,0 +1,100 @@ +# Import Libraries +import ast +import pandas as pd +import pickle +from flask import Flask,request,jsonify +from flask_cors import CORS + +# Create Flask App Object +app=Flask(__name__) + # Allow all Domains to Access the API +CORS(app) + +# Load the Model and Other Resources +with open("Trained_Classifier_Model.pkl","rb") as model_file: + model=pickle.load(model_file) +with open("Disease_Label_Encoder.pkl","rb") as le_file: + label_encoder=pickle.load(le_file) +with open("Disease_Mapper.pkl","rb") as mapper_file: + mapper=pickle.load(mapper_file) + +# Reading CSV Files +columns_df=pd.read_csv("F:\\Major-Project\\health-monitoring-system\\backend\\datasets\\Column_Name_Mapping.csv") +description_df=pd.read_csv("F:\\Major-Project\\health-monitoring-system\\backend\\datasets\\Description.csv") +precautions_df=pd.read_csv("F:\\Major-Project\\health-monitoring-system\\backend\\datasets\\Precautions.csv") +diet_df=pd.read_csv("F:\\Major-Project\\health-monitoring-system\\backend\\datasets\\Diets.csv") +medications_df=pd.read_csv("F:\\Major-Project\\health-monitoring-system\\backend\\datasets\\Medications.csv") +doctor_df=pd.read_csv("F:\\Major-Project\\health-monitoring-system\\backend\\datasets\\Doctor.csv") + +# Disease Prediction Function +def predict_health_status(symptoms): + input_df=pd.DataFrame([[0]*376],columns=list(columns_df["values"])) + for symptom in symptoms: + input_df[symptom]=1 + predicted_label=model.predict(input_df)[0] + predicted_disease=mapper[predicted_label] + confidence_score=round(model.predict_proba(input_df)[0][predicted_label],5) + # Check Confidence Score and Send Response Accordingly + if confidence_score>=0.5: + return predicted_disease,confidence_score + else: + return "Sorry, our model couldn't match any disease with these symptoms...",confidence_score + +# Function to Fetch Details for the Predicted Disease +def get_disease_details(disease): + # Fetch Associated Details for the Disease + try: + description=description_df[description_df["Disease"]==disease]["Description"].values[0] + precautions=precautions_df[precautions_df["Disease"]==disease] + precaution_list=[] + for i in range(1,5): + precaution_col=f"Precaution_{i}" + precaution_value=precautions[precaution_col].values[0] + precaution_list.append(precaution_value) + diet=ast.literal_eval(diet_df[diet_df["Disease"]==disease]["Diet"].values[0]) + medications=ast.literal_eval(medications_df[medications_df["Disease"]==disease]["Medications"].values[0]) + consult_doctor=doctor_df[doctor_df["Disease"]==disease]["Consulted Doctor"].values[0] + return{ + "description": description, + "precautions": precaution_list, + "diet": diet, + "medications": medications, + "consult": consult_doctor + } + except Exception as e: + raise ValueError(f"Error in Fetching Details for the Disease : {disease}") + +# Flask Route for Prediction +@app.route('/predict',methods=['POST']) +def predict(): + try: + # Get the Data from the Frontend + data=request.get_json() + symptoms=data.get('symptoms',[]) + # Get Prediction + predicted_disease,confidence_score=predict_health_status(symptoms) + # If no Match Found (Confidence < 0.5) + if confidence_score<0.5: + return jsonify({ + "prediction": predicted_disease, + "confidence_score": confidence_score, + "message": "The Confidence Score of our Model is too low to Provide Prediction" + }) + else: + # Get Details for the Predicted Disease + disease_details=get_disease_details(predicted_disease) + # Prepare the Response + response={ + "prediction": predicted_disease, + "confidence_score": confidence_score, + **disease_details + } + # Send Back the Response + return jsonify(response) + except ValueError as ve: + return jsonify({'error': str(ve)}),400 # Handle Specific ValueError Exceptions + except Exception as e: + return jsonify({'error': str(e)}),500 # Handle Other General Exceptions + +if __name__=='__main__': + app.run(debug=True) \ No newline at end of file