TIF_E41211266/backend/scripts/prediction.py

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