83 lines
2.4 KiB
Python
83 lines
2.4 KiB
Python
import numpy as np
|
|
import pandas as pd
|
|
import joblib
|
|
from tensorflow.keras.models import load_model
|
|
|
|
def load_model_and_scaler(model_path, scaler_path):
|
|
"""
|
|
Memuat model dan scaler yang telah disimpan
|
|
"""
|
|
model = load_model(model_path)
|
|
scaler = joblib.load(scaler_path)
|
|
return model, scaler
|
|
|
|
def prepare_input_data(data, scaler, time_step=60):
|
|
"""
|
|
Menyiapkan data input untuk prediksi
|
|
"""
|
|
# Normalisasi data
|
|
scaled_data = scaler.transform(data)
|
|
|
|
# Membuat sequence data
|
|
X = []
|
|
for i in range(len(scaled_data) - time_step):
|
|
X.append(scaled_data[i:(i + time_step), 0])
|
|
|
|
return np.array(X).reshape(-1, time_step, 1)
|
|
|
|
def predict_future(model, last_sequence, steps_ahead=30, scaler=None):
|
|
# prediksi masa depann
|
|
future_predictions = []
|
|
current_sequence = last_sequence.copy()
|
|
|
|
for _ in range(steps_ahead):
|
|
|
|
current_reshape = current_sequence.reshape(1, -1, 1)
|
|
|
|
next_pred = model.predict(current_reshape)[0, 0]
|
|
|
|
future_predictions.append(next_pred)
|
|
|
|
current_sequence = np.append(current_sequence[1:], next_pred)
|
|
|
|
# Denormalisasi jika scaler disediakan
|
|
if scaler:
|
|
future_predictions = scaler.inverse_transform(
|
|
np.array(future_predictions).reshape(-1, 1)
|
|
)
|
|
|
|
return future_predictions
|
|
|
|
def predict_bpp(data_file, model_file, scaler_file, future_days=30):
|
|
|
|
# Muat data
|
|
df = pd.read_csv(data_file, delimiter=';')
|
|
df['Tanggal'] = pd.to_datetime(df['Tanggal'], format='%d/%m/%Y')
|
|
df.set_index('Tanggal', inplace=True)
|
|
|
|
# Muat model dan scaler
|
|
model, scaler = load_model_and_scaler(model_file, scaler_file)
|
|
|
|
# Siapkan data input
|
|
data = df[['Harga']].values
|
|
X = prepare_input_data(data, scaler)
|
|
|
|
# Prediksi pada data yang ada
|
|
predictions = model.predict(X)
|
|
predictions = scaler.inverse_transform(predictions)
|
|
|
|
# Prediksi masa depan
|
|
last_sequence = scaler.transform(data[-60:])
|
|
future_preds = predict_future(model, last_sequence.flatten(), future_days, scaler)
|
|
|
|
# Buat dataframe hasil
|
|
last_date = df.index[-1]
|
|
future_dates = pd.date_range(start=last_date + pd.Timedelta(days=1), periods=future_days)
|
|
|
|
future_df = pd.DataFrame({
|
|
'Tanggal': future_dates,
|
|
'Prediksi_Harga': future_preds.flatten()
|
|
})
|
|
future_df.set_index('Tanggal', inplace=True)
|
|
|
|
return future_df |