Spaces:
Sleeping
Sleeping
import pandas as pd | |
import numpy as np | |
import streamlit as st | |
import os | |
import time | |
import pickle | |
# import seaborn as sns | |
# import matplotlib.pyplot as plt | |
# import pip | |
try: | |
#insert headers | |
st.header(" Welcome to Sales Prediction Using Prophet ") | |
st.subheader("To help you know your future sales📈...") | |
st.image("future.png", width=500, caption="Sales Prediction") | |
Disp_results = pd.DataFrame() # Initialize for download | |
# Take input | |
with st.form("This form", clear_on_submit=True): | |
st.subheader("Enter the number of day(s)/Week(s) you want to predict, And the frequency as D for Daily or W for weekly ") | |
frequency = str(st.text_input("Frequency 'D' for Daily 'W' for weekly ")).upper() # convert to string and change to upper | |
Number_of_days = int(st.number_input("Number of day(s)/Week(s)")) # convert to int | |
submit = st.form_submit_button("Predict your sales") | |
# process the input | |
if submit: | |
# check if we have the right data type | |
if frequency == "D" or frequency == 'W': | |
st.success("Inputs received successfully ✅") | |
# import model | |
with open('prophet_model.pkl', 'rb') as f: | |
model = pickle.load(f) | |
# pass inputs to the model(To make predictions, prophet requires number of days and frequency) | |
future = model.make_future_dataframe(periods=Number_of_days, freq=str(frequency), include_history=False) | |
# Make prediction | |
forecast = model.predict(future) | |
# show results | |
print(f'[INFO]: The whole results {forecast}') | |
# pick the relevant columns from the forecast | |
sales_forecast = forecast[['ds', 'yhat_lower', 'yhat_upper', 'yhat']] | |
# rename the columns | |
Disp_results = sales_forecast.rename(columns={'ds': 'Date', 'yhat_lower': 'lowest Expected sales', 'yhat_upper': 'Highest Expected Sales', 'yhat': 'Expected Sales'}) | |
# print result dataframe to terminal | |
print(f'[INFO]: results dataframe {Disp_results}') | |
# show progress | |
with st.spinner("Prediction in progress..."): | |
time.sleep(2) | |
st.balloons() | |
st.success("Great✅") | |
# Display results | |
if frequency == "W": | |
output_frequency = 'Week(s)' | |
else: | |
output_frequency = 'Day(s)' | |
# Check frequency | |
st.write(f"These are your predicted sales in the next {Number_of_days} {output_frequency}") | |
st.dataframe(Disp_results) | |
# Display the graph of sales | |
st.title(f"Line Graph Of Predicted Sales Over {Number_of_days} {output_frequency} ") | |
# Line Graph | |
st.line_chart(data=Disp_results, x='Date', y='Expected Sales') | |
print('[INFO]: Line Chart displayed') | |
else: | |
st.error("Input the right frequency or Days ⚠") | |
# Print input to the terminal | |
print(f'[INFO]: These are the inputs to the model {Number_of_days},{frequency}') | |
print(f"[INFO]: Inputs received") | |
# Create a function to convert df to csv | |
def convert_to_csv(df): | |
return df.to_csv() | |
# Create an expander | |
expand = st.expander('Download Results as CSV') | |
with expand: | |
st.download_button( | |
'Download results', | |
convert_to_csv(Disp_results), | |
'prediction_results.csv', | |
'text/csv', | |
'download' | |
) | |
# Create Sidebar for Description | |
sidebar = st.sidebar.title('Sales Prediction') | |
# first option | |
option1 = st.sidebar.button('About', key="About") | |
# second option | |
option2 = st.sidebar.button('About the sales prediction', key="sales prediction") | |
# Display text for a selected option | |
if option1: | |
st.sidebar.write('This is a Sales prediction app Using Prophet(Developed by meta), this project was done under the Azubi Africa Data Analysis Training program ') | |
elif option2: | |
st.sidebar.write('This is a time series analysis & forecasting problem. In this project, we shalll predict store sales on data from Corporation Favorita, a large Ecuadorian-based grocery retailer. Specifically, this app predicts the sales for up to weeks in advance for Corporation Favorita ') | |
except: | |
st.error('''something went wrong: Make sure you entered the correct number of days | |
otherwise contact admin! | |
''' | |
) | |