|
|
from fastapi import FastAPI |
|
|
from asgiref.wsgi import WsgiToAsgi |
|
|
from flask import Flask, render_template, request, jsonify |
|
|
import pickle |
|
|
import numpy as np |
|
|
import requests |
|
|
import pandas as pd |
|
|
from fastapi.middleware.wsgi import WSGIMiddleware |
|
|
|
|
|
flask_app = Flask(__name__) |
|
|
|
|
|
|
|
|
with open('model.pkl', 'rb') as model_file: |
|
|
model = pickle.load(model_file) |
|
|
|
|
|
with open('scaler.pkl', 'rb') as scaler_file: |
|
|
scaler = pickle.load(scaler_file) |
|
|
|
|
|
|
|
|
@flask_app.route('/') |
|
|
def home(): |
|
|
return render_template('index.html') |
|
|
|
|
|
|
|
|
@flask_app.route('/predict', methods=['POST']) |
|
|
def predict(): |
|
|
try: |
|
|
|
|
|
input_data = request.get_json() |
|
|
|
|
|
|
|
|
sell_1 = float(input_data['features'][2]) |
|
|
sell_2 = float(input_data['features'][1]) |
|
|
sell_3 = float(input_data['features'][0]) |
|
|
|
|
|
|
|
|
last_row = np.array([ |
|
|
scaler.transform([[sell_1]]).flatten()[0], |
|
|
scaler.transform([[sell_2]]).flatten()[0], |
|
|
scaler.transform([[sell_3]]).flatten()[0] |
|
|
]).reshape(1, -1) |
|
|
|
|
|
|
|
|
last_row_df = pd.DataFrame(last_row, columns=['sell-1', 'sell-2', 'sell-3']) |
|
|
|
|
|
|
|
|
predicted_value_normalized = model.predict(last_row_df) |
|
|
predicted_value = scaler.inverse_transform(predicted_value_normalized.reshape(-1, 1)) |
|
|
|
|
|
|
|
|
last_price_inversed = sell_1 |
|
|
|
|
|
|
|
|
percentage_change = ((predicted_value[0][0] - last_price_inversed) / last_price_inversed) * 100 |
|
|
|
|
|
|
|
|
change_sign = '+' if percentage_change > 0 else '' |
|
|
|
|
|
|
|
|
return jsonify({ |
|
|
'last_price': last_price_inversed, |
|
|
'predicted_value': predicted_value[0][0], |
|
|
'percentage_change': f"{change_sign}{percentage_change:.2f}%", |
|
|
'raw_data': input_data |
|
|
}) |
|
|
|
|
|
|
|
|
except Exception as e: |
|
|
return jsonify({'error': str(e)}), 400 |
|
|
|
|
|
|
|
|
@flask_app.route('/auto-predict', methods=['POST']) |
|
|
def auto_predict(): |
|
|
try: |
|
|
|
|
|
input_data = request.get_json() |
|
|
print(input_data) |
|
|
|
|
|
price_day_1 = float(input_data['features'][0]) |
|
|
price_day_2 = float(input_data['features'][1]) |
|
|
price_day_3 = float(input_data['features'][2]) |
|
|
last_row = np.array([ |
|
|
scaler.transform([[price_day_1]]).flatten()[0], |
|
|
scaler.transform([[price_day_2]]).flatten()[0], |
|
|
scaler.transform([[price_day_3]]).flatten()[0] |
|
|
]).reshape(1, -1) |
|
|
last_row_df = pd.DataFrame(last_row, columns=['sell-1', 'sell-2', 'sell-3']) |
|
|
|
|
|
predicted_value_normalized = model.predict(last_row_df) |
|
|
predicted_value = scaler.inverse_transform(predicted_value_normalized.reshape(-1, 1)) |
|
|
|
|
|
|
|
|
last_price_inversed = price_day_3 |
|
|
|
|
|
|
|
|
percentage_change = ((predicted_value[0][0] - last_price_inversed) / last_price_inversed) * 100 |
|
|
|
|
|
|
|
|
if percentage_change > 0: |
|
|
change_sign = '+' |
|
|
else: |
|
|
change_sign = '' |
|
|
|
|
|
return jsonify({ |
|
|
'last_price': last_price_inversed, |
|
|
'predicted_value': predicted_value[0][0], |
|
|
'percentage_change': f"{change_sign}{percentage_change:.2f}%", |
|
|
'raw_data': input_data |
|
|
}) |
|
|
|
|
|
except Exception as e: |
|
|
return jsonify({'error': str(e)}), 400 |
|
|
|
|
|
app = FastAPI() |
|
|
app.mount("/", WSGIMiddleware(flask_app)) |
|
|
|