File size: 6,874 Bytes
b555fe1 a851214 372b3f3 0cdc019 7a4002e 23fc541 1854cda 46545a4 0cdc019 618f85b eaee169 fec7bb9 27cc353 eaee169 0cdc019 618f85b 0cdc019 eaee169 46545a4 372b3f3 a851214 b555fe1 a851214 27cc353 eaee169 46545a4 eaee169 46545a4 eaee169 46545a4 eaee169 46545a4 eaee169 2d29e28 5aee751 54c70ee b555fe1 822b684 eaee169 d36a0d6 46545a4 e799f84 eaee169 46545a4 1854cda 233f1db 1854cda 46545a4 1854cda eaee169 1854cda 233f1db 1854cda eaee169 1854cda 233f1db 1854cda 233f1db 1854cda b555fe1 46545a4 b555fe1 eaee169 |
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 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 |
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
st.set_page_config(page_title="☀️AI-based Solar Project Estimation Tool", layout="centered")
# Initialize Gemini with the API key
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 Gemini-1.5-Pro model
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()
# Build prompt for Gemini
def build_prompt(location, project_type, roof_size=None, desired_kwh=None, electricity_bill=None, ghi=None, solar_cost_per_kw=None):
if project_type == "Rooftop Solar":
prompt = f"""
You are a solar project estimator tool. Based on the following details, calculate and return only the values without any extra description:
Project Type: Rooftop Solar
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>
"""
else: # Ground Mount Solar
prompt = f"""
You are a solar project estimator tool. Based on the following details, calculate and return only the values without any extra description:
Project Type: Ground Mount Solar
Location: {location}
Desired monthly solar production: {desired_kwh} kWh
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):
Required 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
# 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))
project_type = st.radio(
"Select Solar Project Type",
options=["Rooftop Solar", "Ground Mount Solar"]
)
if project_type == "Rooftop Solar":
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)
desired_kwh = None
else:
desired_kwh = st.number_input("Enter desired monthly solar electricity production (kWh)", min_value=1)
electricity_bill = st.number_input("Enter your monthly electricity bill (₹)", min_value=0)
roof_size = None
submitted = st.form_submit_button("Get Estimate")
# Generate the solar project estimate via Gemini
if submitted and location:
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, project_type, roof_size=roof_size, desired_kwh=desired_kwh, electricity_bill=electricity_bill, ghi=ghi, solar_cost_per_kw=solar_cost_per_kw)
# Call Gemini API
with st.spinner("Generating solar estimate with Gemini..."):
response = model.generate_content(prompt_text)
# Display 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
payback_period_years = 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 or "Required 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])
if "Payback period" in key:
payback_period_years = float(value.split()[0])
except ValueError:
st.warning("There was an issue processing the response. Please try again.")
# Show Graph if values are available
if total_system_cost is not None and monthly_savings_rs is not None and payback_period_years is not None:
st.subheader("📊 Visual Summary")
# Prepare data for Area Chart
months = int(payback_period_years * 12)
savings_cumulative = [monthly_savings_rs * month for month in range(1, months + 1)]
fig = go.Figure()
# Area plot
fig.add_trace(go.Scatter(
x=list(range(1, months + 1)),
y=savings_cumulative,
mode='lines',
fill='tozeroy',
name='Cumulative Savings (₹)',
line=dict(color='#00CC96')
))
# Line for Total Cost
fig.add_trace(go.Scatter(
x=[1, months],
y=[total_system_cost, total_system_cost],
mode='lines',
name='Total System Cost (₹)',
line=dict(color='red', dash='dash')
))
fig.update_layout(
title="Cumulative Savings vs Total System Cost Over Time",
xaxis_title="Months",
yaxis_title="Amount (₹)",
legend_title="Legend",
template="plotly_white"
)
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.info("Please fill out all fields to get your solar project estimate.")
|