File size: 4,263 Bytes
55dd870 2116765 55dd870 a050248 2116765 55dd870 fe0f7d0 a050248 fe0f7d0 a050248 fe0f7d0 a050248 fe0f7d0 55dd870 fe0f7d0 a050248 55dd870 fe0f7d0 0d07f14 fe0f7d0 55dd870 fe0f7d0 55dd870 fe0f7d0 a050248 55dd870 5ed0329 fe0f7d0 55dd870 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
import joblib
import pandas as pd
from flask import Flask, request, jsonify
import os
import logging
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
#initialise flask app
sales_forecast_api = Flask('Sales forecasting')
# load the model and training columns
try:
# Log current working directory and files
current_dir = os.getcwd()
logger.info(f"Current working directory: {current_dir}")
files_in_dir = os.listdir(current_dir)
logger.info(f"Files in current directory: {files_in_dir}")
# Assuming model and columns are saved as a dictionary using joblib
model_and_columns_path = 'sales_forecast_model_and_columns.joblib' # Update path if needed
loaded_object = joblib.load(model_and_columns_path)
model = loaded_object['model']
training_columns = loaded_object['columns']
logger.info("Model and training columns loaded successfully.")
except FileNotFoundError:
logger.error(f"Model and training columns file not found at {model_and_columns_path}!")
model = None
training_columns = None # Ensure training_columns is also None if file not found
except Exception as e:
logger.error(f"Error loading model or training columns: {e}")
model = None
training_columns = None
#define home page
@sales_forecast_api.get('/')
def home():
return 'Welcome to the sales forecase api'
#define an endpoint for prediction
@sales_forecast_api.post('/v1/sales')
def sales_predict():
if model is None or training_columns is None:
return jsonify({"error": "Model or training columns not loaded"}), 500
#get data from json request
sales_data = request.get_json()
#get relevant details
sample = {
'Product_Weight': sales_data['Product_Weight'],
'Product_Sugar_Content': sales_data['Product_Sugar_Content'],
'Product_Allocated_Area': sales_data['Product_Allocated_Area'],
'Product_Type': sales_data['Product_Type'],
'Product_MRP': sales_data['Product_MRP'],
'Store_Establishment_Year': sales_data['Store_Establishment_Year'],
'Store_Size': sales_data['Store_Size'],
'Store_Location_City_Type': sales_data['Store_Location_City_Type'],
'Store_Type': sales_data['Store_Type']
}
input_data = pd.DataFrame([sample])
#convert the categorical to dummies
categorical_columns_for_dummies = ['Product_Sugar_Content','Product_Type','Store_Size','Store_Location_City_Type','Store_Type']
input_df_dummies = pd.get_dummies(input_data, columns=categorical_columns_for_dummies, drop_first=True)
# Reindex input_df_dummies to match the columns of X_train used during training
input_df_aligned = input_df_dummies.reindex(columns=training_columns, fill_value=0)
#make model to predict
prediction = model.predict(input_df_aligned)
return jsonify({'Prediction':prediction[0]})
#defining endpoint for batch
@sales_forecast_api.post('/v1/salesbatch')
def sales_batch_predict():
if model is None or training_columns is None:
return jsonify({"error": "Model or training columns not loaded"}), 500
#get the file from the request
file = request.files['file']
#read the file to df
input_data = pd.read_csv(file)
#convert the categorical to dummies
categorical_columns_for_dummies = ['Product_Sugar_Content','Product_Type','Store_Size','Store_Location_City_Type','Store_Type']
input_df_dummies = pd.get_dummies(input_data, columns=categorical_columns_for_dummies, drop_first=True)
# Reindex input_df_dummies to match the columns of X_train used during training
input_df_aligned =input_df_dummies.reindex(columns=training_columns, fill_value=0)
#predict
predictions = model.predict(input_df_aligned).tolist() # Predict and convert to list
product_id_list = input_data.Product_Id.tolist() # Convert to list
store_id_list = input_data.Store_Id.tolist() # Convert to list
# Create a list of dictionaries for the output
output_list = []
for i in range(len(product_id_list)):
output_list.append({
'Product_Id': product_id_list[i],
'Store_Id': store_id_list[i],
'Prediction': predictions[i]
})
return jsonify(output_list)
#run the flask app in debug mode
if __name__ == '__main__':
sales_forecast_api.run(debug=True)
|