emas / app.py
atsuga's picture
Update app.py
53b69dc verified
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))