saham / app.py
atsuga's picture
Update app.py
e360e61 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
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))