atsuga commited on
Commit
e360e61
·
verified ·
1 Parent(s): 19f121c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +49 -93
app.py CHANGED
@@ -6,110 +6,66 @@ import numpy as np
6
  import requests
7
  import pandas as pd
8
  from fastapi.middleware.wsgi import WSGIMiddleware
 
9
 
10
  flask_app = Flask(__name__)
11
 
12
- # Load model dan scaler yang sudah disimpan
13
- with open('model.pkl', 'rb') as model_file:
14
- model = pickle.load(model_file)
15
-
16
  with open('scaler.pkl', 'rb') as scaler_file:
17
  scaler = pickle.load(scaler_file)
18
 
19
- # Halaman utama
 
 
 
 
 
 
 
 
20
  @flask_app.route('/')
21
  def home():
22
  return render_template('index.html')
23
 
24
- # Endpoint untuk prediksi berdasarkan input pengguna
25
- @flask_app.route('/predict', methods=['POST'])
26
  def predict():
27
- try:
28
- # Mendapatkan data dari form input
29
- input_data = request.get_json()
30
-
31
- # Ambil nilai input (pastikan semuanya adalah angka)
32
- sell_1 = float(input_data['features'][2])
33
- sell_2 = float(input_data['features'][1])
34
- sell_3 = float(input_data['features'][0])
35
-
36
- # Normalisasi data menggunakan scaler
37
- last_row = np.array([
38
- scaler.transform([[sell_1]]).flatten()[0],
39
- scaler.transform([[sell_2]]).flatten()[0],
40
- scaler.transform([[sell_3]]).flatten()[0]
41
- ]).reshape(1, -1)
42
-
43
- # Buat DataFrame dari nilai yang telah dinormalisasi
44
- last_row_df = pd.DataFrame(last_row, columns=['sell-1', 'sell-2', 'sell-3'])
45
-
46
- # Prediksi harga berdasarkan model
47
- predicted_value_normalized = model.predict(last_row_df)
48
- predicted_value = scaler.inverse_transform(predicted_value_normalized.reshape(-1, 1))
49
-
50
- # Ambil harga emas terakhir untuk perhitungan persentase
51
- last_price_inversed = sell_1 # Menggunakan harga hari ketiga (sell_3) sebagai harga terakhir
52
-
53
- # Hitung perubahan persentase
54
- percentage_change = ((predicted_value[0][0] - last_price_inversed) / last_price_inversed) * 100
55
-
56
- # Tentukan tanda perubahan (positif atau negatif)
57
- change_sign = '+' if percentage_change > 0 else ''
58
-
59
- # Kembalikan hasil prediksi dalam bentuk JSON
60
- return jsonify({
61
- 'last_price': last_price_inversed,
62
- 'predicted_value': predicted_value[0][0],
63
- 'percentage_change': f"{change_sign}{percentage_change:.2f}%",
64
- 'raw_data': input_data
65
- })
66
-
67
-
68
- except Exception as e:
69
- return jsonify({'error': str(e)}), 400
70
-
71
- # Endpoint untuk prediksi otomatis berdasarkan data API
72
- @flask_app.route('/auto-predict', methods=['POST'])
73
- def auto_predict():
74
- try:
75
- # Mendapatkan data yang dikirimkan dari frontend
76
- input_data = request.get_json()
77
- print(input_data)
78
- # Ambil nilai input (pastikan semuanya adalah angka)
79
- price_day_1 = float(input_data['features'][0])
80
- price_day_2 = float(input_data['features'][1])
81
- price_day_3 = float(input_data['features'][2])
82
- last_row = np.array([
83
- scaler.transform([[price_day_1]]).flatten()[0],
84
- scaler.transform([[price_day_2]]).flatten()[0],
85
- scaler.transform([[price_day_3]]).flatten()[0]
86
- ]).reshape(1, -1)
87
- last_row_df = pd.DataFrame(last_row, columns=['sell-1', 'sell-2', 'sell-3'])
88
- # Prediksi harga
89
- predicted_value_normalized = model.predict(last_row_df)
90
- predicted_value = scaler.inverse_transform(predicted_value_normalized.reshape(-1, 1))
91
-
92
- # Ambil harga emas terakhir untuk perhitungan persentase
93
- last_price_inversed = price_day_3
94
-
95
- # Hitung perubahan persentase
96
- percentage_change = ((predicted_value[0][0] - last_price_inversed) / last_price_inversed) * 100
97
-
98
- # Tentukan tanda perubahan (positif atau negatif)
99
- if percentage_change > 0:
100
- change_sign = '+'
101
- else:
102
- change_sign = ''
103
-
104
- return jsonify({
105
- 'last_price': last_price_inversed,
106
- 'predicted_value': predicted_value[0][0],
107
- 'percentage_change': f"{change_sign}{percentage_change:.2f}%",
108
- 'raw_data': input_data
109
- })
110
-
111
- except Exception as e:
112
- return jsonify({'error': str(e)}), 400
113
 
114
  app = FastAPI()
115
  app.mount("/", WSGIMiddleware(flask_app))
 
6
  import requests
7
  import pandas as pd
8
  from fastapi.middleware.wsgi import WSGIMiddleware
9
+ from tensorflow.keras.models import load_model
10
 
11
  flask_app = Flask(__name__)
12
 
13
+ # Load model dan scaler
14
+ model = load_model('model.keras') # Pastikan model.keras ada di direktori yang sama dengan app.py
 
 
15
  with open('scaler.pkl', 'rb') as scaler_file:
16
  scaler = pickle.load(scaler_file)
17
 
18
+ with open('scaler1.pkl', 'rb') as scaler_file:
19
+ scaler_pred = pickle.load(scaler_file)
20
+
21
+ # Konfigurasi
22
+ stockname = "ADARO"
23
+ FEATURES = ['High', 'Low', 'Open', 'Close', 'Volume']
24
+ sequence_length = 50
25
+
26
+ # Endpoint untuk halaman utama (HTML)
27
  @flask_app.route('/')
28
  def home():
29
  return render_template('index.html')
30
 
31
+ # Endpoint untuk prediksi harga saham
32
+ @flask_app.route('/predict', methods=['GET'])
33
  def predict():
34
+ # Load data
35
+ url = 'https://raw.githubusercontent.com/atsugaa/psd/refs/heads/main/ADRO.csv'
36
+ df = pd.read_csv(url)
37
+ df['Date'] = pd.to_datetime(df['Date'], dayfirst=True).dt.date
38
+ df.set_index('Date', inplace=True)
39
+ df.index = pd.to_datetime(df.index)
40
+ df = df.sort_values(by=['Date'])
41
+
42
+ # Ambil fitur yang diperlukan
43
+ input_df = df[FEATURES]
44
+ target_df = df['Close']
45
+ last_N_days = input_df[-sequence_length:].values
46
+
47
+ # Pastikan data mencukupi
48
+ if len(last_N_days) < sequence_length:
49
+ return jsonify({"error": "Data tidak mencukupi untuk prediksi"}), 400
50
+
51
+ # Skala data
52
+ last_N_days_scaled = scaler.transform(last_N_days)
53
+
54
+ # Siapkan data untuk prediksi
55
+ X_test_new = [last_N_days_scaled]
56
+
57
+ # Prediksi harga
58
+ pred_price_scaled = model.predict(np.array(X_test_new))
59
+ pred_price_unscaled = scaler_pred.inverse_transform(pred_price_scaled.reshape(-1, 1))
60
+
61
+ # Hitung perubahan dan hasil akhir
62
+ price_today = np.round(df['Close'][-1], 2)
63
+ predicted_price = np.round(pred_price_unscaled.ravel()[0], 2)
64
+ change_percent = np.round(100 - (price_today * 100) / predicted_price, 2)
65
+
66
+ # Kirim respons ke halaman HTML
67
+ return render_template('index.html', stock=stockname, price_today=price_today,
68
+ predicted_price=predicted_price, change_percent=change_percent)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
 
70
  app = FastAPI()
71
  app.mount("/", WSGIMiddleware(flask_app))