File size: 4,674 Bytes
b555fe1 a851214 372b3f3 0cdc019 7a4002e 23fc541 1854cda 46545a4 0cdc019 618f85b 46545a4 c565f89 27cc353 46545a4 0cdc019 618f85b 0cdc019 46545a4 372b3f3 a851214 b555fe1 a851214 27cc353 46545a4 b555fe1 46545a4 b555fe1 b0848d8 2d29e28 b0848d8 46545a4 b0848d8 46545a4 2d29e28 5aee751 54c70ee b555fe1 822b684 b555fe1 46545a4 d36a0d6 46545a4 e799f84 46545a4 e799f84 46545a4 1854cda 46545a4 1854cda 7a4002e 1854cda b555fe1 46545a4 b555fe1 46545a4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
import streamlit as st
import pandas as pd
import google.generativeai as genai
import os
from dotenv import load_dotenv
import plotly.graph_objects as go
# Load environment variables from .env file
load_dotenv()
# Set page configuration first
st.set_page_config(page_title="AI-based Solar Project Estimation Tool", layout="centered")
# Initialize Gemini with the API key loaded from the .env file
api_key = os.getenv("GOOGLE_API_KEY")
if api_key:
genai.configure(api_key=api_key)
else:
st.error("API key is missing. Please set the GOOGLE_API_KEY environment variable.")
# Use better model: gemini-1.5-pro
model = genai.GenerativeModel("gemini-1.5-pro")
# Load solar data
@st.cache_data
def load_data():
df = pd.read_csv('https://huggingface.co/spaces/MLDeveloper/AI_based_Solar_Project_Estimation_Tool/resolve/main/solar_data_india_2024.csv')
return df
df = load_data()
# UI - Form for user input
st.title("AI-based Solar Project Estimation Tool")
st.write("### Enter Your Details Below:")
with st.form("solar_form"):
state_options = df['State'].dropna().unique()
location = st.selectbox("Select your State", options=sorted(state_options))
roof_size = st.number_input("Enter your roof size (in sq meters)", min_value=1)
electricity_bill = st.number_input("Enter your monthly electricity bill (₹)", min_value=0)
submitted = st.form_submit_button("Get Estimate")
# Build the clean prompt for Gemini
def build_prompt(location, roof_size, electricity_bill, ghi, solar_cost_per_kw):
prompt = f"""
You are a solar project estimator tool. Based on the following details, calculate and return only the values without any extra description:
Location: {location}
Roof size: {roof_size} sq meters
Monthly electricity bill: ₹{electricity_bill}
Average GHI: {ghi} kWh/m²/day
Solar system cost per kW: ₹{solar_cost_per_kw}
Respond strictly in this format (do not add anything extra):
Estimated solar system size in kW: <value>
Estimated daily solar output in kWh: <value>
Total system cost in ₹: <value>
Monthly savings in ₹: <value>
Payback period in years: <value>
"""
return prompt
# Generate the solar project estimate via Gemini
if submitted and location and roof_size > 0 and electricity_bill >= 0:
state_data = df[df['State'].str.contains(location, case=False)].iloc[0]
if state_data is not None:
ghi = state_data['Avg_GHI (kWh/m²/day)']
solar_cost_per_kw = state_data['Solar_Cost_per_kW (₹)']
prompt_text = build_prompt(location, roof_size, electricity_bill, ghi, solar_cost_per_kw)
# Call Gemini API
with st.spinner("Generating solar estimate with Gemini..."):
response = model.generate_content(prompt_text)
# Display clean structured output
st.subheader("Solar Project Estimate")
estimated_data = response.text.strip().split("\n")
system_size_kw = None
monthly_savings_rs = None
total_system_cost = None
for point in estimated_data:
if ":" in point:
try:
key, value = point.split(":", 1)
key = key.strip()
value = value.strip()
st.write(f"**{key}**: {value}")
if "Estimated solar system size" in key:
system_size_kw = float(value.split()[0])
if "Monthly savings" in key:
monthly_savings_rs = float(value.split()[0])
if "Total system cost" in key:
total_system_cost = float(value.split()[0])
except ValueError:
st.warning("There was an issue processing the response.")
# Show Graph if values are available
if total_system_cost is not None and monthly_savings_rs is not None:
st.subheader("📊 Visual Summary")
fig = go.Figure(data=[
go.Bar(
x=["Total System Cost (₹)", "Monthly Savings (₹)"],
y=[total_system_cost, monthly_savings_rs],
marker_color=['#636EFA', '#00CC96']
)
])
fig.update_layout(title="Solar Project Financial Estimates", yaxis_title="Amount (₹)", xaxis_title="Parameters")
st.plotly_chart(fig, use_container_width=True, key="solar_graph")
else:
st.error("Sorry, the location entered does not match any available data.")
else:
st.warning("Please fill out all fields to see your solar project estimate.")
|