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 from tensorflow.keras.models import load_model flask_app = Flask(__name__) # Load model dan scaler model = load_model('model.keras') # Pastikan model.keras ada di direktori yang sama dengan app.py with open('scaler.pkl', 'rb') as scaler_file: scaler = pickle.load(scaler_file) with open('scaler1.pkl', 'rb') as scaler_file: scaler_pred = pickle.load(scaler_file) # Konfigurasi stockname = "ADARO" FEATURES = ['High', 'Low', 'Open', 'Close', 'Volume'] sequence_length = 50 # Endpoint untuk halaman utama (HTML) @flask_app.route('/') def home(): return render_template('index.html') # Endpoint untuk prediksi harga saham @flask_app.route('/predict', methods=['GET']) def predict(): # Load data url = 'https://raw.githubusercontent.com/atsugaa/psd/refs/heads/main/ADRO.csv' df = pd.read_csv(url) df['Date'] = pd.to_datetime(df['Date'], dayfirst=True).dt.date df.set_index('Date', inplace=True) df.index = pd.to_datetime(df.index) df = df.sort_values(by=['Date']) # Ambil fitur yang diperlukan input_df = df[FEATURES] target_df = df['Close'] last_N_days = input_df[-sequence_length:].values # Pastikan data mencukupi if len(last_N_days) < sequence_length: return jsonify({"error": "Data tidak mencukupi untuk prediksi"}), 400 # Skala data last_N_days_scaled = scaler.transform(last_N_days) # Siapkan data untuk prediksi X_test_new = [last_N_days_scaled] # Prediksi harga pred_price_scaled = model.predict(np.array(X_test_new)) pred_price_unscaled = scaler_pred.inverse_transform(pred_price_scaled.reshape(-1, 1)) # Hitung perubahan dan hasil akhir price_today = np.round(df['Close'][-1], 2) predicted_price = np.round(pred_price_unscaled.ravel()[0], 2) change_percent = np.round(100 - (price_today * 100) / predicted_price, 2) # Kirim respons ke halaman HTML return render_template('index.html', stock=stockname, price_today=price_today, predicted_price=predicted_price, change_percent=change_percent) app = FastAPI() app.mount("/", WSGIMiddleware(flask_app))