File size: 2,365 Bytes
526c7cf
 
 
 
 
 
 
 
e360e61
526c7cf
56bad39
526c7cf
e360e61
 
526c7cf
 
 
e360e61
 
 
 
 
 
 
 
 
56bad39
526c7cf
 
 
e360e61
 
526c7cf
e360e61
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
526c7cf
56bad39
 
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
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))