Import Library
import pandas as pd
import numpy as np
import tensorflow as tf
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
Data Preparation
Ubah dataset format horizontal menjadi vertikal
df = pd.read_csv('dataset.csv', sep=';')
df_melted = pd.melt(df, id_vars=['komoditas'], var_name='tanggal', value_name='harga')
df_melted.head()
df_beras = df_melted[df_melted['komoditas'] == 'Beras'].drop(columns=['komoditas'])
df_gula = df_melted[df_melted['komoditas'] == 'Gula Pasir'].drop(columns=['komoditas'])
df_minyak = df_melted[df_melted['komoditas'] == 'Minyak Goreng'].drop(columns=['komoditas'])
df_beras['tanggal'] = pd.to_datetime(df_beras['tanggal'], format='%d/%m/%Y').dt.strftime('%Y-%m-%d')
df_gula['tanggal'] = pd.to_datetime(df_gula['tanggal'], format='%d/%m/%Y').dt.strftime('%Y-%m-%d')
df_minyak['tanggal'] = pd.to_datetime(df_minyak['tanggal'], format='%d/%m/%Y').dt.strftime('%Y-%m-%d')
Data Preprocessing
Membuat fungsi untuk membuat dataset time series dengan jendela geser (sliding window) menggunakan TensorFlow.
def windowed_dataset(series, window_size, batch_size, shuffle_buffer):
series = tf.expand_dims(series, axis=-1)
ds = tf.data.Dataset.from_tensor_slices(series)
ds = ds.window(window_size + 1, shift=1, drop_remainder=True)
ds = ds.flat_map(lambda w: w.batch(window_size + 1))
ds = ds.shuffle(shuffle_buffer)
ds = ds.map(lambda w: (w[:-1], w[1:]))
return ds.batch(batch_size).prefetch(1)
Training
Membuat function untuk membuat model machine learning dengan data historis harga menggunakan normalisasi dan metrik Mean Absolute Error (MAE), lalu melatih model selama 100 epoch.
def model_fit(df):
time_step = df['tanggal'].values
prices = df['harga'].values
series = np.array(prices)
min = np.min(series)
max = np.max(series)
series -= min
series /= max
time = np.array(time_step)
split_time = 3000
time_train = time[:split_time]
x_train = series[:split_time]
time_valid = time[split_time:]
x_valid = series[split_time:]
window_size = 30
batch_size = 32
shuffle_buffer_size = 1000
train_set = windowed_dataset(x_train, window_size=window_size,
batch_size=batch_size, shuffle_buffer=shuffle_buffer_size)
model = tf.keras.models.Sequential([
tf.keras.layers.Conv1D(filters=32, kernel_size=5, strides=1, padding="causal", activation="relu",
input_shape=[None, 1]),
tf.keras.layers.LSTM(64, return_sequences=True),
tf.keras.layers.LSTM(64, return_sequences=True),
tf.keras.layers.Dense(30, activation="relu"),
tf.keras.layers.Dense(10, activation="relu"),
tf.keras.layers.Dense(1)
])
model.compile(loss=tf.keras.losses.Huber(),
optimizer=tf.keras.optimizers.SGD(learning_rate=1e-5, momentum=0.9),
metrics=["mae"])
model.fit(train_set, epochs=100)
return model
Training Model untuk prediksi harga beras
model_beras = model_fit(df_beras)
Training Model untuk prediksi harga gula
model_gula = model_fit(df_gula)
Training Model untuk prediksi harga minyak goreng
model_minyak = model_fit(df_minyak)
Membuat fungsi untuk melakukan prediksi harga berdasarkan tanggal di masa depan
safrom datetime import datetime, timedelta
def predict_future_price_on_date(model, df, target_date_str, window_size):
# Konversi tanggal target ke datetime
target_date = datetime.strptime(target_date_str, '%Y-%m-%d')
# Cari tanggal terakhir dalam dataset
last_date_str = df['tanggal'].iloc[-1]
last_date = datetime.strptime(last_date_str, '%Y-%m-%d')
# Hitung selisih hari antara tanggal terakhir dan tanggal target
delta_days = (target_date - last_date).days
if delta_days <= 0:
raise ValueError("Target date must be in the future.")
# Normalisasi harga
min_price = df['harga'].min()
max_price = df['harga'].max()
normalized_prices = (df['harga'] - min_price) / (max_price - min_price)
# Prediksi harga untuk setiap hari hingga tanggal target
current_date = last_date
for _ in range(delta_days):
# Gunakan data harga terakhir sebanyak window_size
last_data_points = normalized_prices[-window_size:].values.reshape((1, window_size, 1))
# Prediksi harga untuk hari berikutnya
predicted_normalized_price = model.predict(last_data_points)
# Tambahkan prediksi ke daftar harga yang dinormalisasi
normalized_prices = normalized_prices.append(pd.Series(predicted_normalized_price.ravel()[0]))
# Perbarui tanggal saat ini
current_date += timedelta(days=1)
# Denormalisasi harga prediksi terakhir
predicted_price = normalized_prices.iloc[-1] * (max_price - min_price) + min_price
return predicted_price
Prediksi
target_date
window_size = 30
target_date = target_date.strftime('%Y-%m-%d')
Beras
predicted_future_price = predict_future_price_on_date(model_beras, df_beras, target_date, window_size)
print(f"Prediksi harga beras untuk tanggal {target_date} adalah: {predicted_future_price}")
Gula
predicted_future_price = predict_future_price_on_date(model_gula, df_gula, target_date, window_size)
print(f"Prediksi harga gula untuk tanggal {target_date} adalah: {predicted_future_price}")
Minyak Goreng
predicted_future_price = predict_future_price_on_date(model_minyak, df_minyak, target_date, window_size)
print(f"Prediksi harga minyak untuk tanggal {target_date} adalah: {predicted_future_price}")