Analytics_Dashboard / pages /Dashboard.py
Soumen's picture
Upload 5 files
2db80a1 verified
# import the required libraries
import streamlit as st # for creating interactive web apps
import pandas as pd # for data manipulation and analysis
import datetime # for working with dates and times
from PIL import Image # for loading and displaying images
import plotly.express as px # for creating interactive plots
import plotly.graph_objects as go # for creating low-level plotly graphs
import statsmodels.api as sm # for statistical modeling
# reading the data from csv file
df = pd.read_csv("data.csv") # load the data into a pandas dataframe
df=df.drop_duplicates(subset=["asin_id"]) # remove any duplicate rows based on the asin_id column
st.set_page_config(layout="wide") # set the layout of the web app to wide mode
st.markdown('<style>div.block-container{padding-top:1rem;}</style>', unsafe_allow_html=True) # add some custom CSS to the web app
#image = Image.open('download.png') # load an image from the local directory
col1, col2 = st.columns([0.1,0.9]) # create two columns with different widths
# with col1: # in the first column
# st.image(image,width=100) # display the image with a specified width
html_title = """
<style>
.title-test {
font-weight:bold;
padding:5px;
border-radius:6px;
}
</style>
<center><h1 class="title-test">Amazon Products Interactive Dashboard</h1></center>""" # create a HTML string for the title of the web app
with col2: # in the second column
st.markdown(html_title, unsafe_allow_html=True) # display the HTML string as markdown
def format_sales(value): # define a function to format the sales values
if value >= 0: # if the value is positive
return '{:.2f} Lakh'.format(value*100/100000) # convert it to lakh and return it as a string with two decimal places
fig= px.scatter( # create a scatter plot using plotly express
df, # use the dataframe as the data source
x="best_seller_rank", # use the best_seller_rank column as the x-axis
y="sold_last_month", # use the sold_last_month column as the y-axis
color="product_name", # use the product_name column to color the points
title="Sold_last_month vs Best_seller_rank", # set the title of the plot
marginal_y="violin", # add a violin plot to the y-axis
marginal_x="box", # add a box plot to the x-axis
trendline="ols", # add a ordinary least squares regression line to the plot
hover_data=["asin_id", "price_usd", "average_review", "total_reviews"], # add some additional data to the hover tooltip
)
st.plotly_chart(fig,use_container_width=True) # display the plot in the web app and use the container width as the plot width
result = df[["product_name","model_name","os_support","total_reviews","date_first_available"]].groupby(by ="model_name")["total_reviews"].sum().reset_index() # create a new dataframe by grouping the original dataframe by model_name and summing the total_reviews column
result0 = df[["product_name","model_name","os_support","total_reviews","date_first_available","price_usd"]].groupby(by ="product_name")["price_usd"].sum().reset_index() # create another new dataframe by grouping the original dataframe by product_name and summing the price_usd column
col3, col4, col5 = st.columns([0.15,0.40,0.45]) # create three columns with different widths
with col3: # in the first column
fig = px.bar(result0, x = "product_name", y = "price_usd", labels={"TotalSales" : "Sales"}, title="Total sales last month",
template="plotly_dark",height=500) # create a bar plot using plotly express with the product_name as the x-axis and the price_usd as the y-axis, and customize the labels, title, template, and height of the plot
st.plotly_chart(fig,use_container_width=True) # display the plot in the web app and use the container width as the plot width
with col4: # in the second column
fig1 = px.line(result, x = "model_name", y = "total_reviews", title="Total Reviews get by model_name",
template="gridon") # create a line plot using plotly express with the model_name as the x-axis and the total_reviews as the y-axis, and customize the title and template of the plot
st.plotly_chart(fig1,use_container_width=True) # display the plot in the web app and use the container width as the plot width
average_rev = df[["product_name","model_name","os_support","total_reviews","average_review","date_first_available"]].groupby(by ="model_name")["average_review"].mean().reset_index() # create a new dataframe by grouping the original dataframe by model_name and averaging the average_review column
with col5: # in the third column
fig = px.bar(average_rev, x = "model_name", y = "average_review", labels={"AvgReview" : "average review"}, title="Average review get by model name",
template="gridon",height=500) # create a bar plot using plotly express with the model_name as the x-axis and the average_review as the y-axis, and customize the labels, title, template, and height of the plot
st.plotly_chart(fig,use_container_width=True) # display the plot in the web app and use the container width as the plot width
col6, col7 = st.columns([0.45,0.55]) # create two columns with different widths
with col6: # in the first column
fig=px.box( # create a box plot using plotly express
df, # use the dataframe as the data source
x="ram_in_GB", # use the ram_in_GB column as the x-axis
y="average_review", # use the average_review column as the y-axis
title="Box plot to relate Ram vs Average Review", # set the title of the plot
notched=True, # add notches to the boxes
points="all" # show all the points
)
st.plotly_chart(fig,use_container_width=True) # display the plot in the web app and use the container width as the plot width
with col7: # in the second column
fig=px.scatter_matrix( # create a scatter matrix using plotly express
df, # use the dataframe as the data source
dimensions=[ # specify the dimensions to plot
"average_review",
"ram_in_GB",
"screen_size_in_inches",
],
title="Conditional Scatter!", # set the title of the plot
color="product_name", # use the product_name column to color the points
)
st.plotly_chart(fig,use_container_width=True) # display the plot in the web app and use the container width as the plot width
col8, col9 = st.columns([0.40,0.60]) # create two columns with different widths
# create two columns with different widths
with col8:
# create a density heatmap using plotly express
fig=px.density_heatmap(
df, # use the dataframe as the data source
x="date_first_available", # use the date_first_available column as the x-axis
y="total_reviews", # use the total_reviews column as the y-axis
title="Density Heatmap!", # set the title of the plot
nbinsx=20, # set the number of bins for the x-axis
nbinsy=20, # set the number of bins for the y-axis
histfunc="count", # use the count function to aggregate the values
marginal_x="rug", # add a rug plot to the x-axis
marginal_y="histogram", # add a histogram to the y-axis
)
# display the plot in the web app and use the container width as the plot width
st.plotly_chart(fig,use_container_width=True)
# create two columns with different widths
with col9:
# create a density heatmap using plotly express
fig = px.density_heatmap(df, # use the dataframe as the data source
x="price_usd", # use the price_usd column as the x-axis
y="average_review", # use the average_review column as the y-axis
title="Density Heatmap!", # set the title of the plot
facet_row="screen_size_in_inches") # create a facet row for each value of the screen_size_in_inches column
# display the plot in the web app and use the container width as the plot width
st.plotly_chart(fig,use_container_width=True)
# create a multiselect widget to let the user choose the columns to visualize on a treemap
options = st.multiselect(
label='Please select your combination to visualize on treemap!', # set the label of the widget
options=list(df.columns)) # use the list of dataframe columns as the options
# make a copy of the dataframe
data=df.copy()
# add a subheader to the web app
st.subheader("Prices by combinations!")
# check if the user has selected any options
if options:
# create a new column in the data to format the price_usd values
data["price_usd(Formatted)"] = data["price_usd"].apply(format_sales)
# create a treemap using plotly express
fig = px.treemap(data, # use the data as the data source
path = options, # use the options as the path for the hierarchy
values = "price_usd", # use the price_usd column as the values for the area
hover_name = "price_usd(Formatted)", # use the formatted price_usd column as the name for the hover tooltip
hover_data = ["price_usd(Formatted)"], # use the formatted price_usd column as the data for the hover tooltip
color = "model_name", # use the model_name column to color the rectangles
height = 700, # set the height of the plot
width = 600) # set the width of the plot
# update the traces to show more information on the labels
fig.update_traces(textinfo="percent entry+percent parent+label+value")
# display the plot in the web app and use the container width as the plot width
st.plotly_chart(fig,use_container_width=True)
# create two columns with different widths
v1,d1=st.columns([0.8, 0.2])
# in the first column
with v1:
# create an expander widget to show the total sales by combinations
expander = st.expander("Total Sales by Combinations!")
# create a new dataframe by grouping the data by the options and summing the price_usd column
dt = data[options+["price_usd"]].groupby(by=options)["price_usd"].sum().reset_index()
# format the price_usd column using the format_sales function
dt["price_usd"] = dt["price_usd"].apply(format_sales)
# rename the price_usd column to Total_Sales_by_Category
dt.rename(columns={"price_usd":"Total_Sales_by_Category"})
# write the dataframe to the expander widget
expander.write(dt)
# in the second column
with d1:
# create a download button to let the user download the dataframe as a csv file
st.download_button("Download", data = dt.to_csv().encode("utf-8"),
file_name="Sales.csv", mime="text/csv")