File size: 4,206 Bytes
b659f0b 23d61af abd0fdf 1d8e5e4 abd0fdf 1d8e5e4 abd0fdf 9549dea abd0fdf 9549dea abd0fdf 9549dea abd0fdf 0bf203d 53b69dc | 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 | 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__)
# Load model dan scaler yang sudah disimpan
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)
# Halaman utama
@flask_app.route('/')
def home():
return render_template('index.html')
# Endpoint untuk prediksi berdasarkan input pengguna
@flask_app.route('/predict', methods=['POST'])
def predict():
try:
# Mendapatkan data dari form input
input_data = request.get_json()
# Ambil nilai input (pastikan semuanya adalah angka)
sell_1 = float(input_data['features'][2])
sell_2 = float(input_data['features'][1])
sell_3 = float(input_data['features'][0])
# Normalisasi data menggunakan scaler
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)
# Buat DataFrame dari nilai yang telah dinormalisasi
last_row_df = pd.DataFrame(last_row, columns=['sell-1', 'sell-2', 'sell-3'])
# Prediksi harga berdasarkan model
predicted_value_normalized = model.predict(last_row_df)
predicted_value = scaler.inverse_transform(predicted_value_normalized.reshape(-1, 1))
# Ambil harga emas terakhir untuk perhitungan persentase
last_price_inversed = sell_1 # Menggunakan harga hari ketiga (sell_3) sebagai harga terakhir
# Hitung perubahan persentase
percentage_change = ((predicted_value[0][0] - last_price_inversed) / last_price_inversed) * 100
# Tentukan tanda perubahan (positif atau negatif)
change_sign = '+' if percentage_change > 0 else ''
# Kembalikan hasil prediksi dalam bentuk JSON
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
# Endpoint untuk prediksi otomatis berdasarkan data API
@flask_app.route('/auto-predict', methods=['POST'])
def auto_predict():
try:
# Mendapatkan data yang dikirimkan dari frontend
input_data = request.get_json()
print(input_data)
# Ambil nilai input (pastikan semuanya adalah angka)
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'])
# Prediksi harga
predicted_value_normalized = model.predict(last_row_df)
predicted_value = scaler.inverse_transform(predicted_value_normalized.reshape(-1, 1))
# Ambil harga emas terakhir untuk perhitungan persentase
last_price_inversed = price_day_3
# Hitung perubahan persentase
percentage_change = ((predicted_value[0][0] - last_price_inversed) / last_price_inversed) * 100
# Tentukan tanda perubahan (positif atau negatif)
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))
|