Hackathon1 / hydrogen_analyzer.py
mjolnir1122's picture
Rename hydrogen-analyzer.py to hydrogen_analyzer.py
d3dee11 verified
import streamlit as st
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
def run_analyzer():
st.title("Hydrogen Production Analyzer")
st.markdown("### AI-Powered Techno-Economic Analysis Tool")
# Create tabs for different analysis sections
tabs = st.tabs(["Input Parameters", "Production Analysis", "Cost Analysis", "Environmental Impact"])
with tabs[0]:
st.subheader("System Configuration")
col1, col2 = st.columns(2)
with col1:
capacity = st.number_input("Electrolyzer Capacity (MW)", 1.0, 1000.0, 10.0)
efficiency = st.number_input("Efficiency (%)", 50.0, 100.0, 70.0)
lifetime = st.number_input("System Lifetime (years)", 5, 30, 20)
capacity_factor = st.number_input("Capacity Factor (%)", 10.0, 100.0, 90.0)
with col2:
tech_type = st.selectbox("Electrolyzer Technology",
["Alkaline", "PEM", "Solid Oxide", "AEM"])
electricity_source = st.selectbox("Electricity Source",
["Grid Mix", "Solar PV", "Wind", "Nuclear", "Hydropower", "Hybrid Renewable"])
electricity_cost = st.number_input("Electricity Cost ($/MWh)", 10.0, 200.0, 50.0)
water_cost = st.number_input("Water Cost ($/m³)", 0.5, 10.0, 2.0)
with tabs[1]:
st.subheader("Hydrogen Production Analysis")
# Calculate hydrogen production
operating_hours = capacity_factor / 100 * 8760 # hours per year
energy_consumption = capacity * operating_hours # MWh per year
h2_production_rate = capacity * efficiency / 100 * 18.4 # kg/h for 1 MW at 100% efficiency
annual_h2_production = h2_production_rate * operating_hours # kg per year
col1, col2 = st.columns(2)
with col1:
st.metric("Annual Hydrogen Production", f"{annual_h2_production/1000:.2f} tonnes")
st.metric("Energy Consumption", f"{energy_consumption:.2f} MWh")
with col2:
st.metric("Average Production Rate", f"{h2_production_rate:.2f} kg/hour")
st.metric("Operating Hours", f"{operating_hours:.0f} hours/year")
# Production over time
st.subheader("Production Forecast")
years = range(1, lifetime + 1)
# Assume slight efficiency degradation over time
degradation_factor = 0.5 # 0.5% per year
yearly_production = [annual_h2_production * (1 - degradation_factor/100 * year) for year in years]
df_production = pd.DataFrame({
'Year': years,
'Production (tonnes)': [p/1000 for p in yearly_production]
})
fig, ax = plt.subplots(figsize=(10, 6))
sns.barplot(x='Year', y='Production (tonnes)', data=df_production, ax=ax, color='#1E88E5')
ax.set_title('Yearly Hydrogen Production Forecast')
ax.set_xlabel('Year of Operation')
ax.set_ylabel('Hydrogen Production (tonnes)')
# Only show every other year on x-axis if more than 10 years
if lifetime > 10:
ax.set_xticks(range(0, lifetime, 2))
ax.set_xticklabels([str(y) for y in range(1, lifetime+1, 2)])
st.pyplot(fig)
with tabs[2]:
st.subheader("Cost Analysis")
# Capital costs based on technology type
capex_map = {
"Alkaline": 1000, # $/kW
"PEM": 1400,
"Solid Oxide": 2000,
"AEM": 1200
}
capex_per_kw = capex_map[tech_type]
total_capex = capacity * 1000 * capex_per_kw # $ (capacity in MW -> kW)
# Operating costs
electricity_opex_annual = electricity_cost * energy_consumption
water_consumption = annual_h2_production * 9 # 9 kg water per kg H2
water_opex_annual = water_cost * water_consumption / 1000 # Convert to m³
maintenance_cost = total_capex * 0.03 # 3% of CAPEX per year
labor_cost = 50000 * (1 + capacity/10) # Base + scale factor
total_opex_annual = electricity_opex_annual + water_opex_annual + maintenance_cost + labor_cost
# Financial metrics
discount_rate = 0.08 # 8%
# Calculate NPV and LCOH
cash_flows = []
total_production = 0
for year in range(lifetime):
production = yearly_production[year]
total_production += production / (1 + discount_rate)**year
opex = total_opex_annual * (1 + 0.02)**year # 2% inflation on OPEX
if year == 0:
cash_flow = -total_capex - opex
else:
cash_flow = -opex
cash_flows.append(cash_flow)
npv = sum(cf / (1 + discount_rate)**i for i, cf in enumerate(cash_flows))
lcoh = -npv / total_production # $ per kg
# Display financial metrics
col1, col2 = st.columns(2)
with col1:
st.metric("Capital Expenditure (CAPEX)", f"${total_capex:,.0f}")
st.metric("Annual Operating Cost (OPEX)", f"${total_opex_annual:,.0f}/year")
with col2:
st.metric("Levelized Cost of Hydrogen (LCOH)", f"${lcoh:.2f}/kg")
simple_payback = total_capex / (annual_h2_production * 3 - total_opex_annual) # Assuming $3/kg H2 sale price
st.metric("Simple Payback Period", f"{simple_payback:.1f} years")
# Cost breakdown
st.subheader("Annual Cost Breakdown")
cost_data = {
'Category': ['Electricity', 'Water', 'Maintenance', 'Labor'],
'Cost ($)': [electricity_opex_annual, water_opex_annual, maintenance_cost, labor_cost]
}
df_costs = pd.DataFrame(cost_data)
fig, ax = plt.subplots(figsize=(10, 6))
colors = ['#1E88E5', '#0F9D58', '#FFC107', '#E53935']
explode = (0.1, 0, 0, 0) # Explode electricity slice
ax.pie(df_costs['Cost ($)'], labels=df_costs['Category'], autopct='%1.1f%%',
startangle=90, colors=colors, explode=explode, shadow=True)
ax.axis('equal')
st.pyplot(fig)
# LCOH Sensitivity Analysis
st.subheader("LCOH Sensitivity Analysis")
# Create sensitivity data
electricity_range = np.linspace(electricity_cost * 0.5, electricity_cost * 1.5, 5)
capex_range = np.linspace(capex_per_kw * 0.5, capex_per_kw * 1.5, 5)
sensitivity_data = []
for e_cost in electricity_range:
for c_cost in capex_range:
# Recalculate with new parameters
new_total_capex = capacity * 1000 * c_cost
new_electricity_opex = e_cost * energy_consumption
new_total_opex = new_electricity_opex + water_opex_annual + new_total_capex * 0.03 + labor_cost
# Simple LCOH calculation for sensitivity
new_lcoh = (new_total_capex / lifetime + new_total_opex) / annual_h2_production
sensitivity_data.append({
'Electricity Cost ($/MWh)': e_cost,
'CAPEX ($/kW)': c_cost,
'LCOH ($/kg)': new_lcoh
})
df_sensitivity = pd.DataFrame(sensitivity_data)
pivot_table = df_sensitivity.pivot_table(
values='LCOH ($/kg)',
index='Electricity Cost ($/MWh)',
columns='CAPEX ($/kW)'
)
fig, ax = plt.subplots(figsize=(10, 6))
sns.heatmap(pivot_table, annot=True, fmt=".2f", cmap="YlGnBu", ax=ax)
ax.set_title('LCOH Sensitivity ($/kg)')
st.pyplot(fig)
with tabs[3]:
st.subheader("Environmental Impact Analysis")
# Emissions factors by electricity source (kg CO2e/MWh)
emissions_factors = {
"Grid Mix": 400,
"Solar PV": 40,
"Wind": 11,
"Nuclear": 12,
"Hydropower": 24,
"Hybrid Renewable": 30
}
emissions_factor = emissions_factors[electricity_source]
# Calculate emissions
total_emissions = energy_consumption * emissions_factor
emission_intensity = total_emissions / annual_h2_production
# Water consumption
water_intensity = water_consumption / annual_h2_production
col1, col2 = st.columns(2)
with col1:
st.metric("Carbon Intensity", f"{emission_intensity:.2f} kg CO₂e/kg H₂")
st.metric("Annual CO₂ Emissions", f"{total_emissions/1000:.2f} tonnes CO₂e")
with col2:
st.metric("Water Intensity", f"{water_intensity:.2f} kg H₂O/kg H₂")
st.metric("Annual Water Consumption", f"{water_consumption/1000:.2f} m³")
# Comparison with other production methods
st.subheader("Carbon Intensity Comparison")
comparison_data = {
'Production Method': ['Your Configuration', 'SMR without CCS', 'SMR with CCS', 'Coal Gasification'],
'Carbon Intensity (kg CO₂e/kg H₂)': [emission_intensity, 9.0, 2.5, 19.0]
}
df_comparison = pd.DataFrame(comparison_data)
fig, ax = plt.subplots(figsize=(10, 6))
bars = sns.barplot(x='Production Method', y='Carbon Intensity (kg CO₂e/kg H₂)',
data=df_comparison, ax=ax, palette=['#0F9D58', '#E53935', '#FFC107', '#1E88E5'])
# Add value labels
for i, bar in enumerate(bars.patches):
bars.text(bar.get_x() + bar.get_width()/2.,
bar.get_height() + 0.3,
f"{df_comparison['Carbon Intensity (kg CO₂e/kg H₂)'][i]:.1f}",
ha='center', va='bottom', color='black')
ax.set_title('Carbon Intensity Comparison')
ax.set_ylabel('kg CO₂e per kg H₂')
ax.set_ylim(0, max(df_comparison['Carbon Intensity (kg CO₂e/kg H₂)']) * 1.2)
st.pyplot(fig)
if __name__ == "__main__":
run_analyzer()