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))