mdsalmon159's picture
Upload folder using huggingface_hub
cdefe97 verified
import numpy as np
import joblib
import pandas as pd
from flask import Flask, request, jsonify
# Initialize Flask app
superkart_api = Flask("superkart_sales_api")
# Load the trained model (must be in same folder as app.py)
try:
# This assumes 'superkart_prediction.joblib' is in the same directory as app.py
model = joblib.load("superkart_prediction.joblib")
print("βœ… Model loaded successfully.")
except Exception as e:
print("❌ Model load failed:", e)
raise e
# Health check to show Backend is running
@superkart_api.get('/')
def home():
return "βœ… You are on Sales Prediction API for SuperKart"
# Prediction endpoint
@superkart_api.post('/v1/predict')
def predict_sales():
try:
data = request.get_json()
if data is None:
return jsonify({'error': "No JSON payload received"}), 400
print("Raw incoming data:", data)
required_fields = [
'Product_Id_char',
'Product_Weight',
'Product_Sugar_Content',
'Product_Allocated_Area',
'Product_MRP',
'Store_Size',
'Store_Location_City_Type',
'Store_Type',
'Store_Age_Years',
'Product_Type_Category'
]
missing_fields = [f for f in required_fields if f not in data]
if missing_fields:
return jsonify({'error': f"Missing fields: {missing_fields}"}), 400
sample = {
'Product_Id_char': data['Product_Id_char'],
'Product_Weight': float(data['Product_Weight']),
'Product_Sugar_Content': data['Product_Sugar_Content'],
'Product_Allocated_Area': np.log1p(float(data['Product_Allocated_Area'])),
'Product_MRP': float(data['Product_MRP']),
'Store_Size': data['Store_Size'],
'Store_Location_City_Type': data['Store_Location_City_Type'],
'Store_Type': data['Store_Type'],
'Store_Age_Years': int(data['Store_Age_Years']),
'Product_Type_Category': data['Product_Type_Category']
}
input_df = pd.DataFrame([sample])
print("Transformed input for model:\n", input_df)
prediction = model.predict(input_df).tolist()[0]
return jsonify({'Predicted_Sales': prediction})
except Exception as e:
print("❌ Error during prediction:", str(e))
return jsonify({'error': f"Prediction failed: {str(e)}"}), 500
# BATCH SALES PREDICTION
# Corrected decorator to use the `superkart_api` instance
@superkart_api.route("/v1/sales_batch", methods=["POST"])
def predict_sales_batch():
try:
file = request.files.get("file")
if file is None:
return jsonify({"error": "No CSV file uploaded under key 'file'"}), 400
df = pd.read_csv(file)
log_preds = model.predict(df).tolist()
predictions = [round(float(np.exp(p)), 2) for p in log_preds]
id_col = next((c for c in ("id", "ID", "Product_Id") if c in df.columns), None)
if id_col:
ids = df[id_col].astype(str).tolist()
result = dict(zip(ids, predictions))
else:
result = {str(i): predictions[i] for i in range(len(predictions))}
return jsonify({"predictions": result}), 200
except Exception as e:
return jsonify({"error": str(e)}), 400
# Local testing
if __name__ == '__main__':
# This will still use superkart_api for local runs
superkart_api.run(debug=True, host='0.0.0.0', port=7860)