lufthan/psd3
0
1import streamlit as st2import numpy as np3import pandas as pd4from sklearn.model_selection import train_test_split5from sklearn.ensemble import GradientBoostingRegressor6from sklearn.preprocessing import StandardScaler, OneHotEncoder7from sklearn.compose import ColumnTransformer8from sklearn.pipeline import Pipeline9from pyngrok import ngrok10 11# Fungsi untuk menghitung MAPE12def mean_absolute_percentage_error(y_true, y_pred):13 y_true, y_pred = np.array(y_true).flatten(), np.array(y_pred).flatten()14 non_zero_mask = y_true != 015 y_true_non_zero = y_true[non_zero_mask]16 y_pred_non_zero = y_pred[non_zero_mask]17 return np.mean(np.abs((y_true_non_zero - y_pred_non_zero) / y_true_non_zero)) * 10018 19# Memuat dataset20data = pd.read_csv('data penjualan.csv', sep=';')21data['Date'] = pd.to_datetime(data['Date'], format='%d/%m/%Y')22 23# Menyiapkan data24selected_columns = ['Date', 'Category', 'Quantity', 'Gross Sales']25data = data[selected_columns]26X = data[['Date', 'Category', 'Quantity']]27y = data['Gross Sales']28 29# Ekstraksi fitur waktu (Year, Month, Day)30X['Year'] = X['Date'].dt.year31X['Month'] = X['Date'].dt.month32X['Day'] = X['Date'].dt.day33X = X.drop(columns=['Date'])34 35# Split data36X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)37 38# Definisikan preprocessing dan model pipeline39categorical_features = X.select_dtypes(include=['object']).columns40numerical_features = X.select_dtypes(exclude=['object']).columns41preprocessor = ColumnTransformer(42 transformers=[43 ('num', StandardScaler(), numerical_features),44 ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features)45 ])46 47pipeline = Pipeline(steps=[48 ('preprocessor', preprocessor),49 ('regressor', GradientBoostingRegressor(random_state=42))50])51 52# Latih model53pipeline.fit(X_train, y_train)54 55# Prediksi harga56y_pred = pipeline.predict(X_test)57 58# Fungsi untuk prediksi harga selanjutnya (multi-step)59def predict_price_for_multiple_days(category, quantity, start_date, num_days):60 predictions = []61 for i in range(num_days):62 # Mengambil tanggal dan mengekstraksi fitur63 date = pd.to_datetime(start_date) + pd.Timedelta(days=i)64 year = date.year65 month = date.month66 day = date.day67 68 # Buat input baru untuk prediksi69 input_data = pd.DataFrame([[category, quantity, year, month, day]], columns=['Category', 'Quantity', 'Year', 'Month', 'Day'])70 71 # Prediksi harga72 price = pipeline.predict(input_data)[0]73 predictions.append({'Tanggal': date, 'Harga Prediksi': price})74 75 return pd.DataFrame(predictions)76 77# Streamlit UI78st.title('Prediksi Harga Penjualan')79 80st.write("Masukkan data untuk memprediksi harga penjualan:")81 82category = st.selectbox('Kategori', data['Category'].unique())83quantity = st.number_input('Kuantitas', min_value=1)84start_date = st.date_input('Tanggal Mulai')85num_days = st.number_input('Jumlah Hari', min_value=1, max_value=30, value=7)86 87if st.button('Prediksi'):88 predicted_prices = predict_price_for_multiple_days(category, quantity, start_date, num_days)89 st.write("Prediksi Harga Penjualan untuk Beberapa Hari Kedepan:")90 st.write(predicted_prices)91 