File size: 4,206 Bytes
b659f0b
23d61af
abd0fdf
 
 
 
 
1d8e5e4
abd0fdf
1d8e5e4
abd0fdf
 
 
 
 
 
 
 
 
9549dea
abd0fdf
 
 
 
9549dea
abd0fdf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9549dea
abd0fdf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0bf203d
53b69dc
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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))