Spaces:
Build error
Build error
| import streamlit as st | |
| import pandas as pd | |
| import numpy as np | |
| from datetime import datetime, timedelta | |
| import faiss | |
| from groq import Groq | |
| import os | |
| from dotenv import load_dotenv # Import dotenv | |
| # Load environment variables from .env file | |
| load_dotenv() | |
| # Fetch the API key from the environment variable | |
| api_key = os.getenv("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") | |
| # Debugging line to verify the API key is loaded | |
| st.write("Loaded API Key:", api_key) | |
| if api_key: | |
| st.success("Groq API key loaded successfully.") | |
| client = Groq(api_key=api_key) | |
| else: | |
| st.warning("Groq API key is not set. Features requiring Groq API will be disabled.") | |
| client = None | |
| # App title | |
| st.title("Optimized EV Charging Scheduling in Microgrids") | |
| # Upload Excel file | |
| st.sidebar.header("Upload Data File") | |
| uploaded_file = st.sidebar.file_uploader("Upload Excel File", type=["xlsx", "xls"]) | |
| if uploaded_file: | |
| data = pd.ExcelFile(uploaded_file) | |
| try: | |
| # Load data from sheets | |
| historical_data = data.parse("Historical Data") | |
| renewable_forecast = data.parse("Renewable Energy Forecast") | |
| ev_profiles = data.parse("EV Charging Profiles") | |
| # Standardize column names | |
| historical_data.columns = historical_data.columns.str.strip() | |
| renewable_forecast.columns = renewable_forecast.columns.str.strip() | |
| ev_profiles.columns = ev_profiles.columns.str.strip() | |
| # Rename specific columns if necessary | |
| historical_data.rename(columns={"DATE": "Date", "date": "Date"}, inplace=True) | |
| renewable_forecast.rename(columns={"DATE": "Date", "date": "Date"}, inplace=True) | |
| ev_profiles.rename(columns={"DATE": "Date", "date": "Date"}, inplace=True) | |
| # Parameters | |
| rated_grid_capacity = 3500 # kW | |
| disconnect_threshold = 3200 # kW | |
| # Generate optimized schedule | |
| def optimize_schedule(historical, renewable, profiles): | |
| combined_data = pd.merge( | |
| historical, renewable, on=["Date", "Time"], how="inner" | |
| ) | |
| combined_data = pd.merge( | |
| combined_data, profiles, on=["Date"], how="inner" | |
| ) | |
| # Initialize schedule | |
| schedule = [] | |
| total_load = 0 | |
| for _, row in combined_data.iterrows(): | |
| ev_load = row["State of Charge (kWh)"] | |
| solar_load = row["Solar Load (kW)"] | |
| total_load += ev_load - solar_load | |
| if total_load > disconnect_threshold: | |
| schedule.append("DISCONNECT") | |
| elif total_load > rated_grid_capacity: | |
| schedule.append("V2G ENABLED") | |
| else: | |
| schedule.append("ALLOW") | |
| combined_data["Charging Action"] = schedule | |
| return combined_data | |
| # Generate schedule | |
| st.subheader("Optimized EV Charging Schedule") | |
| schedule_df = optimize_schedule(historical_data, renewable_forecast, ev_profiles) | |
| st.write(schedule_df) | |
| # Download optimized schedule | |
| st.download_button( | |
| "Download Schedule", | |
| data=schedule_df.to_csv(index=False), | |
| file_name="optimized_schedule.csv", | |
| mime="text/csv", | |
| ) | |
| # Simulate Groq API | |
| if client: | |
| st.subheader("Groq AI Insights") | |
| prompt = st.text_input("Ask Groq for insights (e.g., grid stability)") | |
| if prompt: | |
| try: | |
| response = client.chat.completions.create( | |
| messages=[{"role": "user", "content": prompt}], | |
| model="llama-3.3-70b-versatile", | |
| ) | |
| st.write(response.choices[0].message.content) | |
| except Exception as e: | |
| st.error(f"Error communicating with Groq API: {e}") | |
| else: | |
| st.warning("Groq API key is missing. Insights feature is disabled.") | |
| except Exception as e: | |
| st.error(f"Error parsing file: {e}") | |
| else: | |
| st.warning("Please upload a file to proceed.") | |