notebooks / app.py
austinsd's picture
Update app.py
048e0d3 verified
Raw History Blame Contribute Delete
3.67 kB
from flask import Flask, request, jsonify
import joblib
import pandas as pd
import numpy as np
app = Flask(__name__)
# Load the trained model and scaler
model = joblib.load('xgboost_model.joblib')
scaler = joblib.load('scaler.joblib')
@app.route('/')
def home():
return "Welcome to the SuperKart Sales Prediction API!"
#@app.route('/predict', methods=['POST'])
#def predict():
# try:
# json_ = request.json
# query_df = pd.DataFrame(json_)
# Ensure the order of columns matches the training data
# This assumes the order of columns in X_train is known or can be derived
# For this example, we'll assume X_train is available globally or its columns can be recreated
# In a real deployment, you'd save/load the column order or use a more robust preprocessing pipeline
# --- Recreate df_encoded column order and apply transformations ---
# This is a placeholder. In a production system, you'd save the columns of X_train
# and ensure incoming data matches that structure after one-hot encoding.
# Example of creating dummy columns for categorical features if not present in the query_df
# and then reordering. This needs to be robust for all possible categories.
# Ensure all columns expected by the model are present, fill missing with 0 for one-hot encoded features
# and apply scaling to numerical features.
# Numerical features that were scaled
# numerical_features_to_scale = ['Product_Weight', 'Product_Allocated_Area', 'Product_MRP', 'Store_Age', 'Product_Visibility']
# Categorical features that were one-hot encoded
# ohe_columns = ['Product_Sugar_Content', 'Product_Type', 'Store_Id', 'Store_Size', 'Store_Location_City_Type', 'Store_Type']
# Need to re-create the full list of columns that were used for training
# This is crucial for consistent prediction. Ideally, you save X.columns during training.
# For demonstration, let's create a simplified version based on `df_encoded` structure from notebook state.
# NOTE: This part needs to be precise based on your exact `df_encoded` columns.
# A more robust solution involves saving the `X_train.columns` list during model training.
# Assuming X_train's columns are known from previous steps (from `df_encoded` before dropping target)
# For a more robust solution, save X.columns to a file and load it here.
# In this specific context, the notebook state shows X as a global variable, so we can use its columns.
# expected_columns = model.feature_names_in_ if hasattr(model, 'feature_names_in_') else X.columns
# Apply scaler to numerical features in query_df
# query_df[numerical_features_to_scale] = scaler.transform(query_df[numerical_features_to_scale])
# Handle categorical features using one-hot encoding, similar to training
# query_df_processed = pd.get_dummies(query_df, columns=ohe_columns, drop_first=True)
# Align columns - crucial for production deployment
# Add missing columns with 0 and remove extra ones
# missing_cols = set(expected_columns) - set(query_df_processed.columns)
# for c in missing_cols:
# query_df_processed[c] = 0
# query_df_processed = query_df_processed[expected_columns]
# prediction = model.predict(query_df_processed)
# return jsonify({'prediction': list(prediction)})
# except Exception as e:
# return jsonify({'error': str(e)}), 400
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)