| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- import os
- import pandas as pd
- import pickle
- from flask import Flask, jsonify, request, json
- from utils import PreProcessing
- from datetime import date, datetime
- from sklearn.externals import joblib
- class ApiJsonEncoder(json.JSONEncoder):
- def default(self, obj):
- if isinstance(obj, (date, datetime)):
- return obj.isoformat()
- return super(ApiJsonEncoder, self).default(obj)
- app = Flask(__name__)
- app.json_encoder = ApiJsonEncoder
- @app.route('/')
- def index():
- """ Index Web Page
- """
- return "Modelo Mexico PML Day Ahead Forecast"
- @app.route('/predict', methods=['POST'])
- def apicall():
- """API Call
-
- Pandas dataframe (sent as a payload) from API Call
- """
- prepro = PreProcessing()
-
- try:
- data_json = request.data
-
- data = pd.read_json(data_json, orient='split')
- data['fecha_hora'] = pd.to_datetime(data['fecha_hora'])
- data.set_index('fecha_hora', inplace=True)
- data = prepro.process(data)
- data = data[data.index.date == data.index.max().date()].drop('price', axis=1)
- #Getting the datetime into separated out
- forecast_datetime = data.index
- except Exception as e:
-
- raise e
-
- rgs = 'lbrprice_model_svr.pkl'
- dir_path = os.path.dirname(os.path.realpath(__file__))
- if data.empty:
- return(bad_request())
-
- else:
- #Load the saved model
- print("Loading the model...")
- loaded_model = None
- try:
- with open(dir_path+'/models/'+rgs,'rb') as f:
- loaded_model = pickle.load(f)
- except Exception as e:
- print("Error loading model...", e)
- raise e
- print("The model has been loaded...doing predictions now...")
- predictions = loaded_model.predict(data)
-
- """Add the predictions as Series to a new pandas dataframe
- OR
- Depending on the use-case, the entire test data appended with the new files
- """
- prediction_series = list(pd.Series(predictions))
- final_predictions = pd.DataFrame({'fecha_hora': forecast_datetime, 'pred_price': prediction_series})
-
- """We can be as creative in sending the responses.
- But we need to send the response codes as well.
- """
- responses = jsonify(predictions=final_predictions.to_dict(orient="records"))
- responses.status_code = 200
- return (responses)
- @app.errorhandler(400)
- def bad_request(error=None):
- message = {
- 'status': 400,
- 'message': 'Bad Request: ' + request.url + '--> Please check your data payload...',
- }
- resp = jsonify(message)
- resp.status_code = 400
- return resp
- if __name__ == '__main__':
- app.run(host='0.0.0.0')
|