Spaces:
Running
Running
# 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") | |