ds-project / app.py
wiwaaw's picture
Rename ProjectAkhir.py to app.py
c32f309
# mengimpor seluruh library
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import streamlit as st
from babel.numbers import format_currency
sns.set(style='dark')
# create_daily_orders() digunakan untuk menyiapkan daily_orders
def create_orders_daily(df):
create_orders_daily = df.resample(rule='M', on='order_approved_at').agg({
"order_id": "nunique",
"price": "sum"
})
create_orders_daily.index = create_orders_daily.index.strftime(
'%Y-%m-%d') # mengubah format order date menjadi nama bulan
create_orders_daily = create_orders_daily.reset_index()
create_orders_daily.rename(columns={
"order_id": "order_count",
"price": "revenue"
}, inplace=True)
return create_orders_daily
# create_sum_order() untuk menyiapkan sum_orders
def create_sum_order(df):
sum_order = df.groupby("product_category_name").product_id.nunique(
).sort_values(ascending=False).reset_index()
return sum_order
# create_state() digunakan untuk menyiapkan state
def create_state(df):
state = df.groupby(
by="customer_city").product_id.nunique().reset_index()
return state
# create_order_status() digunakan untuk menyiapkan order_statuse
def create_order_status(df):
order_status = df.groupby(
by="order_status").product_id.nunique().reset_index()
return order_status
# Menyimpan berkas data dari google colba.
all_dataset = pd.read_csv("all_dataset.csv")
# Filter untuk kolom order_approved_at dan order_status
datetime_columns = ["order_approved_at", "order_status"]
all_dataset.sort_values(by="order_approved_at", inplace=True)
all_dataset.reset_index(inplace=True)
all_dataset_index = all_dataset.set_index('order_approved_at')
for column in datetime_columns:
all_dataset[column] = pd.to_datetime(all_dataset['order_approved_at'])
# membuat filter dengan widget date input serta menambahkan logo perusahaan pada sidebar
min_date = all_dataset["order_approved_at"].min()
max_date = all_dataset["order_approved_at"].max()
with st.sidebar:
# Menambahkan logo perusahaan
st.title("Toko Kita")
st.image("https://raw.githubusercontent.com/MuhamdIlyas/ProjectDicodingDataScience/a773b6e2b6b6b1a890c7ccf635de83fc9b487de2/erica-zhou-IHpUgFDn7zU-unsplash.jpg",
width=None, use_column_width=None)
# https://unsplash.com/photos/IHpUgFDn7zU
# Mengambil start_date & end_date dari date_input
start_date, end_date = st.date_input(
label='Rentang Waktu', min_value=min_date,
max_value=max_date,
value=[min_date, max_date]
)
# start_date dan end_date di atas akan digunakan untuk memfilter all_dataset. Data yang telah difilter ini selanjutnya akan disimpan dalam main_dataset
main_dataset = all_dataset[(all_dataset["order_approved_at"] >= str(start_date)) &
(all_dataset["order_approved_at"] <= str(end_date))]
daily_order = create_orders_daily(main_dataset)
sum_order = create_sum_order(main_dataset)
state = create_state(main_dataset)
order_status = create_order_status(main_dataset)
# rfm_df = create_rfm_df(main_dataset)
# Menambahkan Header
st.header('Toko Kita Dashboard :sparkles:')
# menampilkan informasi total order dan revenue dalam bentuk metric() yang ditampilkan menggunakan layout columns()
st.subheader('Daily Orders')
col1, col2 = st.columns(2)
with col1:
total_orders = daily_order.order_count.sum()
st.metric("Total orders", value=total_orders)
with col2:
total_revenue = format_currency(
daily_order.revenue.sum(), "AUD", locale='es_CO')
st.metric("Total Revenue", value=total_revenue)
# Perfoma penjualan
fig, ax = plt.subplots(figsize=(16, 8))
ax.plot(
daily_order["order_approved_at"].values,
daily_order["order_count"].values,
marker='o',
linewidth=2,
color="#90CAF9"
)
ax.tick_params(axis='y', labelsize=20)
ax.tick_params(axis='x', labelsize=15, rotation=45)
st.pyplot(fig)
# Menampilkan 5 produk paling laris dan paling sedikit terjual melalui sebuah visualisasi data
st.subheader("Best & Worst Performing Product")
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(35, 15))
colors = ["#90CAF9", "#D3D3D3", "#D3D3D3", "#D3D3D3", "#D3D3D3"]
sns.barplot(x="product_id", y="product_category_name",
data=sum_order.head(5), palette=colors, ax=ax[0])
ax[0].set_ylabel(None)
ax[0].set_xlabel(None, fontsize=30)
ax[0].set_title("Best Performing Product", loc="center", fontsize=50)
ax[0].tick_params(axis='y', labelsize=35)
ax[0].tick_params(axis='x', labelsize=30)
sns.barplot(x="product_id", y="product_category_name", data=sum_order.sort_values(
by="product_id", ascending=True).head(5), palette=colors, ax=ax[1])
ax[1].set_ylabel(None)
ax[1].set_xlabel(None, fontsize=30)
ax[1].invert_xaxis()
ax[1].yaxis.set_label_position("right")
ax[1].yaxis.tick_right()
ax[1].set_title("Worst Performing Product", loc="center", fontsize=50)
ax[1].tick_params(axis='y', labelsize=35)
ax[1].tick_params(axis='x', labelsize=30)
st.pyplot(fig)