|
|
import joblib |
|
|
import pandas as pd |
|
|
from flask import Flask, request, jsonify |
|
|
import os |
|
|
import logging |
|
|
|
|
|
|
|
|
logging.basicConfig(level=logging.INFO) |
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
|
|
|
sales_forecast_api = Flask('Sales forecasting') |
|
|
|
|
|
|
|
|
try: |
|
|
|
|
|
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}") |
|
|
|
|
|
|
|
|
model_and_columns_path = 'sales_forecast_model_and_columns.joblib' |
|
|
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 |
|
|
except Exception as e: |
|
|
logger.error(f"Error loading model or training columns: {e}") |
|
|
model = None |
|
|
training_columns = None |
|
|
|
|
|
|
|
|
|
|
|
@sales_forecast_api.get('/') |
|
|
def home(): |
|
|
return 'Welcome to the sales forecase api' |
|
|
|
|
|
|
|
|
@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 |
|
|
|
|
|
|
|
|
sales_data = request.get_json() |
|
|
|
|
|
|
|
|
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]) |
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
input_df_aligned = input_df_dummies.reindex(columns=training_columns, fill_value=0) |
|
|
|
|
|
|
|
|
prediction = model.predict(input_df_aligned) |
|
|
|
|
|
return jsonify({'Prediction':prediction[0]}) |
|
|
|
|
|
|
|
|
|
|
|
@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 |
|
|
|
|
|
|
|
|
file = request.files['file'] |
|
|
|
|
|
input_data = pd.read_csv(file) |
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
input_df_aligned =input_df_dummies.reindex(columns=training_columns, fill_value=0) |
|
|
|
|
|
|
|
|
predictions = model.predict(input_df_aligned).tolist() |
|
|
product_id_list = input_data.Product_Id.tolist() |
|
|
store_id_list = input_data.Store_Id.tolist() |
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
sales_forecast_api.run(debug=True) |
|
|
|