Spaces:
Runtime error
Runtime error
| import streamlit as st | |
| import pandas as pd | |
| import requests | |
| import io | |
| # Set the title of the Streamlit app | |
| st.title("Product Store Sales Prediction") | |
| # --- Online Prediction Section --- | |
| st.subheader("Online Prediction") | |
| st.markdown("Enter the details for a single product to get a sales prediction.") | |
| # Create a two-column layout for better organization | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| # Product-related inputs | |
| st.text_input("Product ID", "FD_123") | |
| product_weight = st.number_input("Product Weight (grams)", min_value=0.0, value=150.5, step=0.1) | |
| product_sugar_content = st.selectbox("Product Sugar Content", ["Low Sugar", "Regular", "High Sugar"]) | |
| product_allocated_area = st.number_input("Product Allocated Area (sq. cm)", min_value=0.0, value=500.0, step=10.0) | |
| product_type = st.selectbox("Product Type", [ | |
| "Dairy", "Soft Drinks", "Meat", "Fruits and Vegetables", "Household", | |
| "Baking Goods", "Snack Foods", "Frozen Foods", "Breakfast", | |
| "Health and Hygiene", "Hard Drinks", "Canned", "Breads", "Starchy Foods", | |
| "Others", "Seafood" | |
| ]) | |
| product_mrp = st.number_input("Product MRP (in $)", min_value=0.0, value=150.0) | |
| with col2: | |
| # Store-related inputs | |
| st.text_input("Store ID", "STR_001") | |
| store_establishment_year = st.number_input("Store Establishment Year", min_value=1900, max_value=2024, step=1, value=2010) | |
| store_size = st.selectbox("Store Size", ["Small", "Medium", "High"]) | |
| store_location_city_type = st.selectbox("Store Location City Type", ["City Tier 1", "City Tier 2", "City Tier 3"]) | |
| store_type = st.selectbox("Store Type", ["Supermarket Type1", "Supermarket Type2", "Grocery Store", "Supermarket Type3"]) | |
| # Button to trigger the prediction | |
| if st.button("Predict Sales"): | |
| # Collect user input into a dictionary | |
| input_data = { | |
| 'Product_Weight': product_weight, | |
| 'Product_Sugar_Content': product_sugar_content, | |
| 'Product_Allocated_Area': product_allocated_area, | |
| 'Product_Type': product_type, | |
| 'Product_MRP': product_mrp, | |
| 'Store_Establishment_Year': store_establishment_year, | |
| 'Store_Size': store_size, | |
| 'Store_Location_City_Type': store_location_city_type, | |
| 'Store_Type': store_type | |
| } | |
| # Display the collected data for confirmation | |
| st.write("---") | |
| st.write("**Input Data for Prediction:**") | |
| st.json(input_data) | |
| # --- API Call --- | |
| # NOTE: Replace the URL with your actual API endpoint. | |
| API_URL_SINGLE = "https://vaishaliagarwal-ProductPricePredictionBackend.hf.space/v1/predict_sales" | |
| try: | |
| # Send data to the prediction API | |
| response = requests.post(API_URL_SINGLE, json=input_data) | |
| response.raise_for_status() # Raise an exception for bad status codes (4xx or 5xx) | |
| if response.status_code == 200: | |
| prediction = response.json() | |
| # Assuming the API returns a dictionary like: {'Predicted_Sales': 5500.75} | |
| predicted_sales = prediction.get('Predicted_Sales', 'N/A') | |
| st.success(f"**Predicted Total Sales:** ${predicted_sales:,.2f}") | |
| else: | |
| st.error(f"Error: Received status code {response.status_code}") | |
| st.json(response.json()) | |
| except requests.exceptions.RequestException as e: | |
| st.error(f"API request failed: {e}") | |
| st.warning("Please ensure the backend API is running and the URL is correct.") | |
| # --- Batch Prediction Section --- | |
| st.subheader("Batch Prediction") | |
| st.markdown("Upload a CSV file with multiple product details to get batch sales predictions.") | |
| # Allow users to upload a CSV file | |
| uploaded_file = st.file_uploader("Choose a CSV file", type=["csv"]) | |
| if uploaded_file is not None: | |
| # Display a preview of the uploaded data | |
| try: | |
| df_upload = pd.read_csv(uploaded_file) | |
| st.write("**Uploaded Data Preview:**") | |
| st.dataframe(df_upload.head()) | |
| # Button to trigger batch prediction | |
| if st.button("Predict for Batch"): | |
| # --- API Call for Batch Prediction --- | |
| # NOTE: Replace the URL with your actual batch prediction API endpoint. | |
| API_URL_BATCH = "https://vaishaliagarwal-ProductPricePredictionBackend.hf.space/v1/predict_sales_batch" | |
| # Reset file pointer to the beginning before sending | |
| uploaded_file.seek(0) | |
| # The file needs to be sent in a 'files' dictionary | |
| files = {"file": (uploaded_file.name, uploaded_file, "text/csv")} | |
| try: | |
| with st.spinner('Processing batch prediction...'): | |
| response = requests.post(API_URL_BATCH, files=files) | |
| response.raise_for_status() | |
| if response.status_code == 200: | |
| # Assuming the API returns a JSON array of predictions | |
| predictions = response.json() | |
| st.success("Batch predictions completed successfully!") | |
| # Convert predictions to a DataFrame for better display | |
| df_predictions = pd.DataFrame(predictions) | |
| st.write("**Prediction Results:**") | |
| st.dataframe(df_predictions) | |
| # Provide an option to download the results | |
| def convert_df_to_csv(df): | |
| return df.to_csv(index=False).encode('utf-8') | |
| csv = convert_df_to_csv(df_predictions) | |
| st.download_button( | |
| label="Download Predictions as CSV", | |
| data=csv, | |
| file_name='sales_predictions.csv', | |
| mime='text/csv', | |
| ) | |
| else: | |
| st.error(f"Error: Received status code {response.status_code}") | |
| st.json(response.json()) | |
| except requests.exceptions.RequestException as e: | |
| st.error(f"API request failed: {e}") | |
| st.warning("Please ensure the backend API is running and the URL is correct.") | |
| except Exception as e: | |
| st.error(f"An error occurred while processing the file: {e}") | |