P2-Final / app.py
Azrieldr
initial commit
79d2ded
import streamlit as st
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.api import ExponentialSmoothing, SimpleExpSmoothing, Holt
from sklearn.metrics import mean_squared_error, mean_absolute_error
from math import sqrt
data= pd.read_csv('sample_dataset_timeseries_noarea.csv')
#menggunakan dictionary untuk menyimpan tabel dari setiap product
def table_generator(df, listname):
name={}
n= len(listname)
for i in range(n):
name[i]=df[df['product_item']==listname[i]]
return name
# menghitung berapa banyak kejadian pembelian setiap produk
value_counts= data['product_item'].value_counts()
#membuat tabel baru dengan hanya produk yang dibeli di seluruh minggu
tabel_baru = data.loc[data['product_item'].isin(value_counts[value_counts == 67].index)]
# Kelompokkan data berdasarkan product_item dan hitung total quantity
grouped_data = tabel_baru.groupby('product_item')['quantity'].sum()
# Urutkan data secara menurun berdasarkan total quantity
sorted_data = grouped_data.sort_values(ascending=False)
# Ambil product_item dengan total quantity terbanyak
top_product_item = sorted_data.index[0]
sorted_data2= sorted_data.head(10)
product_item_names = sorted_data2.index.tolist()
new_data = data[data['product_item'].isin(product_item_names)]
name= table_generator(data, product_item_names)
week= new_data.groupby('week_number')['quantity'].sum()
# Ubah series menjadi dataframe
df = week.to_frame().reset_index()
# Ganti nama kolom dari indeks menjadi 'Week Number'
week = df.rename(columns={'index': 'Week Number'})
#splitting train and test
train=week[0:53]
test=week[53:]
y_hat_avg = test.copy()
fit1 = ExponentialSmoothing(np.asarray(train['quantity']), seasonal_periods=13, trend='multiplicative', seasonal='multiplicative').fit()
y_hat_avg['Holt_Winter'] = fit1.forecast(len(test))
# Create the plot
fig, ax = plt.subplots(figsize=(20, 8))
ax.plot(train['quantity'], label='Train')
ax.plot(test['quantity'], label='Test')
ax.plot(y_hat_avg['Holt_Winter'], label='Holt_Winter')
ax.legend(loc='best')
# Show the plot in Streamlit
st.pyplot(fig)
def forecasting(x):
predict= fit1.forecast(len(test)+x)
predict= predict[-x:]
rounded_arr = []
for num in predict:
rounded_num = round(num)
rounded_arr.append(rounded_num)
return rounded_arr
number = st.number_input("Enter a number between 1 and 10 to predict upcoming weeks", min_value=1, max_value=10)
num=forecasting(number)
st.write(num)
num1 = st.number_input("forecast a product", min_value=0, max_value=9)
def holtz_generator(df):
df=df.drop(columns=['week_start_date','week_end_date','product_item'])
n=0.8*len(df)
n=round(n)
#splitting train and test
train=df.iloc[0:n]
test=df.iloc[n:]
y_hat_avg = test
fit1 = ExponentialSmoothing(np.asarray(train['quantity']) ,seasonal_periods=8 ,trend='multiplicative', seasonal='multiplicative').fit()
y_hat_avg['Holt_Winter'] = fit1.forecast(len(test))
# Create the plot
fig, ax = plt.subplots(figsize=(20, 8))
ax.plot(train['quantity'], label='Train')
ax.plot(test['quantity'], label='Test')
ax.plot(y_hat_avg['Holt_Winter'], label='Holt_Winter')
ax.legend(loc='best')
# Show the plot in Streamlit
st.pyplot(fig)
holtz_generator(name[num1])