harishsohani's picture
Update app.py
78316ec verified
import joblib
import pandas as pd
from flask import Flask, request, jsonify
from utils.validation import validate_and_prepare_input, InputValidationError
# Initialize Flask app with a name
pred_mainteanance_api = Flask ("Engine Maintenance Predictor")
# Load the trained churn prediction model
model = joblib.load ("best_eng_fail_pred_model.joblib")
# Define a route for the home page
@pred_mainteanance_api.get ('/')
def home ():
return "Welcome to the Engine Maintenance Prediction!"
# Define an endpoint to predict sales for Super Kart
@pred_mainteanance_api.post ('/v1/EngPredMaintenance')
def predict_need_maintenance ():
# Get JSON data from the request
engine_sensor_inputs = request.get_json ()
# validate request (json)
# if input is valid - return prediction
# in case of error - return appropriate error
try:
input_json = request.get_json()
input_df = pd.DataFrame([input_json])
validated_df = validate_and_prepare_input(input_df, model)
prediction = model.predict(validated_df)[0]
return jsonify({
"status": "success",
"prediction": int(prediction)
})
except InputValidationError as e:
return jsonify({
"status": "error",
"error_type": "validation_error",
"message": str(e)
}), 400
except Exception as e:
return jsonify({
"status": "error",
"error_type": "internal_error",
"message": "Unexpected server error"
}), 500
# Define an endpoint to predict sales for Super Kart
@pred_mainteanance_api.post ('/v1/EngPredMaintenanceForBatch')
def predict_need_maintenance_for_batch ():
# validate request (json)
# if input is valid - return prediction
# in case of error - return appropriate error
try:
# Get the uploaded CSV file from the request
file = request.files.get('file')
if file is None:
return jsonify({
"status": "error",
"error_type": "input_error",
"message": "File not provided"
}), 400
if file.filename == "":
return jsonify({
"status": "error",
"error_type": "input_error",
"message": "No file selected"
}), 400
# Read the file into a DataFrame
input_df = pd.read_csv (file)
if input_df.empty:
return jsonify({
"status": "error",
"error_type": "input_error",
"message": "Uploaded file is empty"
}), 400
# Process the data to clean up and make it ready for prediction
# mostly we will use the file with same format as given in problem statement for batch prediction
# remove/drop engine condition column if present
input_df.drop(columns=['Engine Condition'], inplace=True, errors='ignore')
# update column names to replace spaces with underscore
input_df.columns = input_df.columns.str.replace(' ', '_')
# Convert int → float
int_columns = input_df.select_dtypes(include=['int64']).columns
input_df[int_columns] = input_df[int_columns].astype('float64')
# Validate entire batch
validated_df = validate_and_prepare_input(input_df, model)
# predict for given input
predictions = model.predict(validated_df)
# Convert numpy array → Python list
prediction_list = predictions.tolist()
return jsonify({
"status": "success", # overall batch status
"total_records": len(prediction_list),
"predictions": prediction_list, # simple list version
})
except InputValidationError as e:
return jsonify({
"status": "error",
"error_type": "validation_error",
"message": str(e)
}), 400
except Exception as e:
return jsonify({
"status": "error",
"error_type": "internal_error",
"message": "Unexpected server error"
}), 500
# Run the Flask app
if __name__ == "__main__":
import os
port = int (os.environ.get("PORT", 7860))
pred_mainteanance_api.run(host="0.0.0.0", port=port)