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)