Spaces:
Build error
Build error
Upload 7 files
Browse files- about-page-py.py +71 -0
- app-py.py +55 -0
- css-styles-py.py +123 -0
- hydrogen-analyzer-py.py +255 -0
- landing-page-py.py +167 -0
- readme-md.txt +3 -0
- requirements-txt.txt +6 -0
about-page-py.py
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
|
| 3 |
+
def display_about_page():
|
| 4 |
+
st.title("About EcoLytics")
|
| 5 |
+
|
| 6 |
+
st.markdown("""
|
| 7 |
+
## Intelligent Hydrogen Economics Platform
|
| 8 |
+
|
| 9 |
+
EcoLytics is an AI-powered decision support system that transforms green hydrogen project planning through advanced techno-economic analysis. Using machine learning algorithms, it optimizes electrolyzer configurations, predicts ROI scenarios, and visualizes sustainable energy pathways - empowering developers, investors, and policymakers to accelerate the hydrogen economy with precision and confidence.
|
| 10 |
+
|
| 11 |
+
### Our Mission
|
| 12 |
+
|
| 13 |
+
We aim to accelerate the transition to a sustainable hydrogen economy by providing accessible, accurate, and actionable insights for hydrogen project developers, investors, and policymakers.
|
| 14 |
+
|
| 15 |
+
### Key Capabilities
|
| 16 |
+
|
| 17 |
+
- **AI-powered Analysis**: Leverage machine learning to predict costs and optimize configurations
|
| 18 |
+
- **Dynamic Modeling**: Real-time adaptation to changing market conditions and technology advancements
|
| 19 |
+
- **Visualization Tools**: Interactive dashboards for complex data interpretation
|
| 20 |
+
- **Policy Integration**: Evaluate the impact of incentives and regulations on project economics
|
| 21 |
+
|
| 22 |
+
### Technology Stack
|
| 23 |
+
|
| 24 |
+
- **Frontend**: Streamlit for interactive user experience
|
| 25 |
+
- **Data Processing**: Pandas and NumPy for efficient calculations
|
| 26 |
+
- **Machine Learning**: Scikit-learn for predictive modeling
|
| 27 |
+
- **Visualization**: Matplotlib and Seaborn for data visualization
|
| 28 |
+
""")
|
| 29 |
+
|
| 30 |
+
# Team information
|
| 31 |
+
st.markdown("### The Team")
|
| 32 |
+
|
| 33 |
+
col1, col2, col3 = st.columns(3)
|
| 34 |
+
|
| 35 |
+
with col1:
|
| 36 |
+
st.markdown("""
|
| 37 |
+
**Lead Developer**
|
| 38 |
+
|
| 39 |
+
Expertise in energy systems modeling and machine learning applications for renewable energy.
|
| 40 |
+
""")
|
| 41 |
+
|
| 42 |
+
with col2:
|
| 43 |
+
st.markdown("""
|
| 44 |
+
**Hydrogen Technologist**
|
| 45 |
+
|
| 46 |
+
Specialist in electrolyzer technologies and hydrogen production systems with 10+ years experience.
|
| 47 |
+
""")
|
| 48 |
+
|
| 49 |
+
with col3:
|
| 50 |
+
st.markdown("""
|
| 51 |
+
**Energy Economist**
|
| 52 |
+
|
| 53 |
+
Expert in techno-economic analysis of energy technologies and market forecasting.
|
| 54 |
+
""")
|
| 55 |
+
|
| 56 |
+
# Contact information
|
| 57 |
+
st.markdown("### Contact Us")
|
| 58 |
+
|
| 59 |
+
st.markdown("""
|
| 60 |
+
For more information or to provide feedback on the platform, please contact us at:
|
| 61 |
+
|
| 62 |
+
📧 info@ecolytics.example.com
|
| 63 |
+
🌐 www.ecolytics-platform.example.com
|
| 64 |
+
""")
|
| 65 |
+
|
| 66 |
+
# Acknowledgments
|
| 67 |
+
st.markdown("### Acknowledgments")
|
| 68 |
+
|
| 69 |
+
st.markdown("""
|
| 70 |
+
This platform was developed for the Green Hydrogen Hackathon 2025. We would like to thank all mentors and advisors who provided valuable insights during development.
|
| 71 |
+
""")
|
app-py.py
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
from landing_page import display_landing_page
|
| 3 |
+
from about_page import display_about_page
|
| 4 |
+
from css_styles import load_css
|
| 5 |
+
from hydrogen_analyzer import run_analyzer
|
| 6 |
+
|
| 7 |
+
# Main application function
|
| 8 |
+
def main():
|
| 9 |
+
# Set page config
|
| 10 |
+
st.set_page_config(
|
| 11 |
+
page_title="EcoLytics: Intelligent Hydrogen Economics Platform",
|
| 12 |
+
page_icon="⚡",
|
| 13 |
+
layout="wide",
|
| 14 |
+
initial_sidebar_state="expanded"
|
| 15 |
+
)
|
| 16 |
+
|
| 17 |
+
# Load custom CSS
|
| 18 |
+
load_css()
|
| 19 |
+
|
| 20 |
+
# Initialize session state for navigation
|
| 21 |
+
if "page" not in st.session_state:
|
| 22 |
+
st.session_state.page = "Home"
|
| 23 |
+
|
| 24 |
+
# Sidebar navigation
|
| 25 |
+
with st.sidebar:
|
| 26 |
+
st.markdown("# EcoLytics")
|
| 27 |
+
st.markdown("## Hydrogen Economics Platform")
|
| 28 |
+
st.markdown("---")
|
| 29 |
+
|
| 30 |
+
if st.button("Home", use_container_width=True):
|
| 31 |
+
st.session_state.page = "Home"
|
| 32 |
+
st.experimental_rerun()
|
| 33 |
+
|
| 34 |
+
if st.button("Hydrogen Analyzer", use_container_width=True):
|
| 35 |
+
st.session_state.page = "Hydrogen Analyzer"
|
| 36 |
+
st.experimental_rerun()
|
| 37 |
+
|
| 38 |
+
if st.button("About", use_container_width=True):
|
| 39 |
+
st.session_state.page = "About"
|
| 40 |
+
st.experimental_rerun()
|
| 41 |
+
|
| 42 |
+
st.markdown("---")
|
| 43 |
+
st.markdown("### EcoLytics")
|
| 44 |
+
st.markdown("Version 1.0")
|
| 45 |
+
|
| 46 |
+
# Display current page
|
| 47 |
+
if st.session_state.page == "Home":
|
| 48 |
+
display_landing_page()
|
| 49 |
+
elif st.session_state.page == "Hydrogen Analyzer":
|
| 50 |
+
run_analyzer()
|
| 51 |
+
else:
|
| 52 |
+
display_about_page()
|
| 53 |
+
|
| 54 |
+
if __name__ == "__main__":
|
| 55 |
+
main()
|
css-styles-py.py
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
|
| 3 |
+
def load_css():
|
| 4 |
+
st.markdown("""
|
| 5 |
+
<style>
|
| 6 |
+
/* Main theme colors */
|
| 7 |
+
:root {
|
| 8 |
+
--primary: #0F9D58;
|
| 9 |
+
--secondary: #1E88E5;
|
| 10 |
+
--dark: #121212;
|
| 11 |
+
--light: #f5f5f7;
|
| 12 |
+
}
|
| 13 |
+
|
| 14 |
+
/* Typography */
|
| 15 |
+
h1, h2, h3 {
|
| 16 |
+
color: var(--primary);
|
| 17 |
+
}
|
| 18 |
+
|
| 19 |
+
/* Sidebar styling */
|
| 20 |
+
.css-1d391kg {
|
| 21 |
+
background-color: #f5f5f7;
|
| 22 |
+
}
|
| 23 |
+
|
| 24 |
+
/* Button styling */
|
| 25 |
+
.stButton button {
|
| 26 |
+
background: linear-gradient(135deg, #0F9D58 0%, #1E88E5 100%);
|
| 27 |
+
color: white;
|
| 28 |
+
border: none;
|
| 29 |
+
padding: 0.5rem 1rem;
|
| 30 |
+
border-radius: 50px;
|
| 31 |
+
transition: transform 0.3s, box-shadow 0.3s;
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
.stButton button:hover {
|
| 35 |
+
transform: translateY(-2px);
|
| 36 |
+
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
|
| 37 |
+
}
|
| 38 |
+
|
| 39 |
+
/* Feature card styling */
|
| 40 |
+
.feature-card {
|
| 41 |
+
padding: 20px;
|
| 42 |
+
border-radius: 10px;
|
| 43 |
+
background: white;
|
| 44 |
+
box-shadow: 0 4px 12px rgba(0,0,0,0.05);
|
| 45 |
+
margin-bottom: 20px;
|
| 46 |
+
transition: transform 0.3s, box-shadow 0.3s;
|
| 47 |
+
border-left: 4px solid var(--primary);
|
| 48 |
+
}
|
| 49 |
+
|
| 50 |
+
.feature-card:hover {
|
| 51 |
+
transform: translateY(-5px);
|
| 52 |
+
box-shadow: 0 8px 16px rgba(0,0,0,0.1);
|
| 53 |
+
}
|
| 54 |
+
|
| 55 |
+
/* Process step styling */
|
| 56 |
+
.process-step {
|
| 57 |
+
display: flex;
|
| 58 |
+
flex-direction: column;
|
| 59 |
+
align-items: center;
|
| 60 |
+
text-align: center;
|
| 61 |
+
padding: 20px;
|
| 62 |
+
background: white;
|
| 63 |
+
border-radius: 10px;
|
| 64 |
+
box-shadow: 0 4px 12px rgba(0,0,0,0.05);
|
| 65 |
+
transition: transform 0.3s;
|
| 66 |
+
}
|
| 67 |
+
|
| 68 |
+
.process-step:hover {
|
| 69 |
+
transform: translateY(-5px);
|
| 70 |
+
}
|
| 71 |
+
|
| 72 |
+
.step-number {
|
| 73 |
+
width: 40px;
|
| 74 |
+
height: 40px;
|
| 75 |
+
background: linear-gradient(135deg, #0F9D58 0%, #1E88E5 100%);
|
| 76 |
+
border-radius: 50%;
|
| 77 |
+
display: flex;
|
| 78 |
+
align-items: center;
|
| 79 |
+
justify-content: center;
|
| 80 |
+
color: white;
|
| 81 |
+
font-weight: bold;
|
| 82 |
+
margin-bottom: 15px;
|
| 83 |
+
}
|
| 84 |
+
|
| 85 |
+
/* Metric styling */
|
| 86 |
+
.css-1xarl3l {
|
| 87 |
+
background: white;
|
| 88 |
+
padding: 20px;
|
| 89 |
+
border-radius: 10px;
|
| 90 |
+
box-shadow: 0 4px 12px rgba(0,0,0,0.05);
|
| 91 |
+
transition: transform 0.3s;
|
| 92 |
+
}
|
| 93 |
+
|
| 94 |
+
.css-1xarl3l:hover {
|
| 95 |
+
transform: translateY(-5px);
|
| 96 |
+
}
|
| 97 |
+
|
| 98 |
+
/* Tab styling */
|
| 99 |
+
.stTabs [data-baseweb="tab-list"] {
|
| 100 |
+
gap: 10px;
|
| 101 |
+
}
|
| 102 |
+
|
| 103 |
+
.stTabs [data-baseweb="tab"] {
|
| 104 |
+
background-color: white;
|
| 105 |
+
border-radius: 4px 4px 0 0;
|
| 106 |
+
padding: 10px 20px;
|
| 107 |
+
border: none;
|
| 108 |
+
}
|
| 109 |
+
|
| 110 |
+
.stTabs [aria-selected="true"] {
|
| 111 |
+
background-color: var(--primary);
|
| 112 |
+
color: white;
|
| 113 |
+
}
|
| 114 |
+
|
| 115 |
+
/* Charts styling */
|
| 116 |
+
.stPlotlyChart {
|
| 117 |
+
background: white;
|
| 118 |
+
padding: 20px;
|
| 119 |
+
border-radius: 10px;
|
| 120 |
+
box-shadow: 0 4px 12px rgba(0,0,0,0.05);
|
| 121 |
+
}
|
| 122 |
+
</style>
|
| 123 |
+
""", unsafe_allow_html=True)
|
hydrogen-analyzer-py.py
ADDED
|
@@ -0,0 +1,255 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
import pandas as pd
|
| 3 |
+
import numpy as np
|
| 4 |
+
import matplotlib.pyplot as plt
|
| 5 |
+
import seaborn as sns
|
| 6 |
+
|
| 7 |
+
def run_analyzer():
|
| 8 |
+
st.title("Hydrogen Production Analyzer")
|
| 9 |
+
st.markdown("### AI-Powered Techno-Economic Analysis Tool")
|
| 10 |
+
|
| 11 |
+
# Create tabs for different analysis sections
|
| 12 |
+
tabs = st.tabs(["Input Parameters", "Production Analysis", "Cost Analysis", "Environmental Impact"])
|
| 13 |
+
|
| 14 |
+
with tabs[0]:
|
| 15 |
+
st.subheader("System Configuration")
|
| 16 |
+
|
| 17 |
+
col1, col2 = st.columns(2)
|
| 18 |
+
|
| 19 |
+
with col1:
|
| 20 |
+
capacity = st.number_input("Electrolyzer Capacity (MW)", 1.0, 1000.0, 10.0)
|
| 21 |
+
efficiency = st.number_input("Efficiency (%)", 50.0, 100.0, 70.0)
|
| 22 |
+
lifetime = st.number_input("System Lifetime (years)", 5, 30, 20)
|
| 23 |
+
capacity_factor = st.number_input("Capacity Factor (%)", 10.0, 100.0, 90.0)
|
| 24 |
+
|
| 25 |
+
with col2:
|
| 26 |
+
tech_type = st.selectbox("Electrolyzer Technology",
|
| 27 |
+
["Alkaline", "PEM", "Solid Oxide", "AEM"])
|
| 28 |
+
|
| 29 |
+
electricity_source = st.selectbox("Electricity Source",
|
| 30 |
+
["Grid Mix", "Solar PV", "Wind", "Nuclear", "Hydropower", "Hybrid Renewable"])
|
| 31 |
+
|
| 32 |
+
electricity_cost = st.number_input("Electricity Cost ($/MWh)", 10.0, 200.0, 50.0)
|
| 33 |
+
water_cost = st.number_input("Water Cost ($/m³)", 0.5, 10.0, 2.0)
|
| 34 |
+
|
| 35 |
+
with tabs[1]:
|
| 36 |
+
st.subheader("Hydrogen Production Analysis")
|
| 37 |
+
|
| 38 |
+
# Calculate hydrogen production
|
| 39 |
+
operating_hours = capacity_factor / 100 * 8760 # hours per year
|
| 40 |
+
energy_consumption = capacity * operating_hours # MWh per year
|
| 41 |
+
|
| 42 |
+
h2_production_rate = capacity * efficiency / 100 * 18.4 # kg/h for 1 MW at 100% efficiency
|
| 43 |
+
annual_h2_production = h2_production_rate * operating_hours # kg per year
|
| 44 |
+
|
| 45 |
+
col1, col2 = st.columns(2)
|
| 46 |
+
|
| 47 |
+
with col1:
|
| 48 |
+
st.metric("Annual Hydrogen Production", f"{annual_h2_production/1000:.2f} tonnes")
|
| 49 |
+
st.metric("Energy Consumption", f"{energy_consumption:.2f} MWh")
|
| 50 |
+
|
| 51 |
+
with col2:
|
| 52 |
+
st.metric("Average Production Rate", f"{h2_production_rate:.2f} kg/hour")
|
| 53 |
+
st.metric("Operating Hours", f"{operating_hours:.0f} hours/year")
|
| 54 |
+
|
| 55 |
+
# Production over time
|
| 56 |
+
st.subheader("Production Forecast")
|
| 57 |
+
years = range(1, lifetime + 1)
|
| 58 |
+
|
| 59 |
+
# Assume slight efficiency degradation over time
|
| 60 |
+
degradation_factor = 0.5 # 0.5% per year
|
| 61 |
+
yearly_production = [annual_h2_production * (1 - degradation_factor/100 * year) for year in years]
|
| 62 |
+
|
| 63 |
+
df_production = pd.DataFrame({
|
| 64 |
+
'Year': years,
|
| 65 |
+
'Production (tonnes)': [p/1000 for p in yearly_production]
|
| 66 |
+
})
|
| 67 |
+
|
| 68 |
+
fig, ax = plt.subplots(figsize=(10, 6))
|
| 69 |
+
sns.barplot(x='Year', y='Production (tonnes)', data=df_production, ax=ax, color='#1E88E5')
|
| 70 |
+
ax.set_title('Yearly Hydrogen Production Forecast')
|
| 71 |
+
ax.set_xlabel('Year of Operation')
|
| 72 |
+
ax.set_ylabel('Hydrogen Production (tonnes)')
|
| 73 |
+
|
| 74 |
+
# Only show every other year on x-axis if more than 10 years
|
| 75 |
+
if lifetime > 10:
|
| 76 |
+
ax.set_xticks(range(0, lifetime, 2))
|
| 77 |
+
ax.set_xticklabels([str(y) for y in range(1, lifetime+1, 2)])
|
| 78 |
+
|
| 79 |
+
st.pyplot(fig)
|
| 80 |
+
|
| 81 |
+
with tabs[2]:
|
| 82 |
+
st.subheader("Cost Analysis")
|
| 83 |
+
|
| 84 |
+
# Capital costs based on technology type
|
| 85 |
+
capex_map = {
|
| 86 |
+
"Alkaline": 1000, # $/kW
|
| 87 |
+
"PEM": 1400,
|
| 88 |
+
"Solid Oxide": 2000,
|
| 89 |
+
"AEM": 1200
|
| 90 |
+
}
|
| 91 |
+
|
| 92 |
+
capex_per_kw = capex_map[tech_type]
|
| 93 |
+
total_capex = capacity * 1000 * capex_per_kw # $ (capacity in MW -> kW)
|
| 94 |
+
|
| 95 |
+
# Operating costs
|
| 96 |
+
electricity_opex_annual = electricity_cost * energy_consumption
|
| 97 |
+
water_consumption = annual_h2_production * 9 # 9 kg water per kg H2
|
| 98 |
+
water_opex_annual = water_cost * water_consumption / 1000 # Convert to m³
|
| 99 |
+
|
| 100 |
+
maintenance_cost = total_capex * 0.03 # 3% of CAPEX per year
|
| 101 |
+
labor_cost = 50000 * (1 + capacity/10) # Base + scale factor
|
| 102 |
+
|
| 103 |
+
total_opex_annual = electricity_opex_annual + water_opex_annual + maintenance_cost + labor_cost
|
| 104 |
+
|
| 105 |
+
# Financial metrics
|
| 106 |
+
discount_rate = 0.08 # 8%
|
| 107 |
+
|
| 108 |
+
# Calculate NPV and LCOH
|
| 109 |
+
cash_flows = []
|
| 110 |
+
total_production = 0
|
| 111 |
+
|
| 112 |
+
for year in range(lifetime):
|
| 113 |
+
production = yearly_production[year]
|
| 114 |
+
total_production += production / (1 + discount_rate)**year
|
| 115 |
+
opex = total_opex_annual * (1 + 0.02)**year # 2% inflation on OPEX
|
| 116 |
+
|
| 117 |
+
if year == 0:
|
| 118 |
+
cash_flow = -total_capex - opex
|
| 119 |
+
else:
|
| 120 |
+
cash_flow = -opex
|
| 121 |
+
|
| 122 |
+
cash_flows.append(cash_flow)
|
| 123 |
+
|
| 124 |
+
npv = sum(cf / (1 + discount_rate)**i for i, cf in enumerate(cash_flows))
|
| 125 |
+
lcoh = -npv / total_production # $ per kg
|
| 126 |
+
|
| 127 |
+
# Display financial metrics
|
| 128 |
+
col1, col2 = st.columns(2)
|
| 129 |
+
|
| 130 |
+
with col1:
|
| 131 |
+
st.metric("Capital Expenditure (CAPEX)", f"${total_capex:,.0f}")
|
| 132 |
+
st.metric("Annual Operating Cost (OPEX)", f"${total_opex_annual:,.0f}/year")
|
| 133 |
+
|
| 134 |
+
with col2:
|
| 135 |
+
st.metric("Levelized Cost of Hydrogen (LCOH)", f"${lcoh:.2f}/kg")
|
| 136 |
+
simple_payback = total_capex / (annual_h2_production * 3 - total_opex_annual) # Assuming $3/kg H2 sale price
|
| 137 |
+
st.metric("Simple Payback Period", f"{simple_payback:.1f} years")
|
| 138 |
+
|
| 139 |
+
# Cost breakdown
|
| 140 |
+
st.subheader("Annual Cost Breakdown")
|
| 141 |
+
|
| 142 |
+
cost_data = {
|
| 143 |
+
'Category': ['Electricity', 'Water', 'Maintenance', 'Labor'],
|
| 144 |
+
'Cost ($)': [electricity_opex_annual, water_opex_annual, maintenance_cost, labor_cost]
|
| 145 |
+
}
|
| 146 |
+
|
| 147 |
+
df_costs = pd.DataFrame(cost_data)
|
| 148 |
+
|
| 149 |
+
fig, ax = plt.subplots(figsize=(10, 6))
|
| 150 |
+
colors = ['#1E88E5', '#0F9D58', '#FFC107', '#E53935']
|
| 151 |
+
explode = (0.1, 0, 0, 0) # Explode electricity slice
|
| 152 |
+
|
| 153 |
+
ax.pie(df_costs['Cost ($)'], labels=df_costs['Category'], autopct='%1.1f%%',
|
| 154 |
+
startangle=90, colors=colors, explode=explode, shadow=True)
|
| 155 |
+
ax.axis('equal')
|
| 156 |
+
st.pyplot(fig)
|
| 157 |
+
|
| 158 |
+
# LCOH Sensitivity Analysis
|
| 159 |
+
st.subheader("LCOH Sensitivity Analysis")
|
| 160 |
+
|
| 161 |
+
# Create sensitivity data
|
| 162 |
+
electricity_range = np.linspace(electricity_cost * 0.5, electricity_cost * 1.5, 5)
|
| 163 |
+
capex_range = np.linspace(capex_per_kw * 0.5, capex_per_kw * 1.5, 5)
|
| 164 |
+
|
| 165 |
+
sensitivity_data = []
|
| 166 |
+
|
| 167 |
+
for e_cost in electricity_range:
|
| 168 |
+
for c_cost in capex_range:
|
| 169 |
+
# Recalculate with new parameters
|
| 170 |
+
new_total_capex = capacity * 1000 * c_cost
|
| 171 |
+
new_electricity_opex = e_cost * energy_consumption
|
| 172 |
+
new_total_opex = new_electricity_opex + water_opex_annual + new_total_capex * 0.03 + labor_cost
|
| 173 |
+
|
| 174 |
+
# Simple LCOH calculation for sensitivity
|
| 175 |
+
new_lcoh = (new_total_capex / lifetime + new_total_opex) / annual_h2_production
|
| 176 |
+
|
| 177 |
+
sensitivity_data.append({
|
| 178 |
+
'Electricity Cost ($/MWh)': e_cost,
|
| 179 |
+
'CAPEX ($/kW)': c_cost,
|
| 180 |
+
'LCOH ($/kg)': new_lcoh
|
| 181 |
+
})
|
| 182 |
+
|
| 183 |
+
df_sensitivity = pd.DataFrame(sensitivity_data)
|
| 184 |
+
pivot_table = df_sensitivity.pivot_table(
|
| 185 |
+
values='LCOH ($/kg)',
|
| 186 |
+
index='Electricity Cost ($/MWh)',
|
| 187 |
+
columns='CAPEX ($/kW)'
|
| 188 |
+
)
|
| 189 |
+
|
| 190 |
+
fig, ax = plt.subplots(figsize=(10, 6))
|
| 191 |
+
sns.heatmap(pivot_table, annot=True, fmt=".2f", cmap="YlGnBu", ax=ax)
|
| 192 |
+
ax.set_title('LCOH Sensitivity ($/kg)')
|
| 193 |
+
st.pyplot(fig)
|
| 194 |
+
|
| 195 |
+
with tabs[3]:
|
| 196 |
+
st.subheader("Environmental Impact Analysis")
|
| 197 |
+
|
| 198 |
+
# Emissions factors by electricity source (kg CO2e/MWh)
|
| 199 |
+
emissions_factors = {
|
| 200 |
+
"Grid Mix": 400,
|
| 201 |
+
"Solar PV": 40,
|
| 202 |
+
"Wind": 11,
|
| 203 |
+
"Nuclear": 12,
|
| 204 |
+
"Hydropower": 24,
|
| 205 |
+
"Hybrid Renewable": 30
|
| 206 |
+
}
|
| 207 |
+
|
| 208 |
+
emissions_factor = emissions_factors[electricity_source]
|
| 209 |
+
|
| 210 |
+
# Calculate emissions
|
| 211 |
+
total_emissions = energy_consumption * emissions_factor
|
| 212 |
+
emission_intensity = total_emissions / annual_h2_production
|
| 213 |
+
|
| 214 |
+
# Water consumption
|
| 215 |
+
water_intensity = water_consumption / annual_h2_production
|
| 216 |
+
|
| 217 |
+
col1, col2 = st.columns(2)
|
| 218 |
+
|
| 219 |
+
with col1:
|
| 220 |
+
st.metric("Carbon Intensity", f"{emission_intensity:.2f} kg CO₂e/kg H₂")
|
| 221 |
+
st.metric("Annual CO₂ Emissions", f"{total_emissions/1000:.2f} tonnes CO₂e")
|
| 222 |
+
|
| 223 |
+
with col2:
|
| 224 |
+
st.metric("Water Intensity", f"{water_intensity:.2f} kg H₂O/kg H₂")
|
| 225 |
+
st.metric("Annual Water Consumption", f"{water_consumption/1000:.2f} m³")
|
| 226 |
+
|
| 227 |
+
# Comparison with other production methods
|
| 228 |
+
st.subheader("Carbon Intensity Comparison")
|
| 229 |
+
|
| 230 |
+
comparison_data = {
|
| 231 |
+
'Production Method': ['Your Configuration', 'SMR without CCS', 'SMR with CCS', 'Coal Gasification'],
|
| 232 |
+
'Carbon Intensity (kg CO₂e/kg H₂)': [emission_intensity, 9.0, 2.5, 19.0]
|
| 233 |
+
}
|
| 234 |
+
|
| 235 |
+
df_comparison = pd.DataFrame(comparison_data)
|
| 236 |
+
|
| 237 |
+
fig, ax = plt.subplots(figsize=(10, 6))
|
| 238 |
+
bars = sns.barplot(x='Production Method', y='Carbon Intensity (kg CO₂e/kg H₂)',
|
| 239 |
+
data=df_comparison, ax=ax, palette=['#0F9D58', '#E53935', '#FFC107', '#1E88E5'])
|
| 240 |
+
|
| 241 |
+
# Add value labels
|
| 242 |
+
for i, bar in enumerate(bars.patches):
|
| 243 |
+
bars.text(bar.get_x() + bar.get_width()/2.,
|
| 244 |
+
bar.get_height() + 0.3,
|
| 245 |
+
f"{df_comparison['Carbon Intensity (kg CO₂e/kg H₂)'][i]:.1f}",
|
| 246 |
+
ha='center', va='bottom', color='black')
|
| 247 |
+
|
| 248 |
+
ax.set_title('Carbon Intensity Comparison')
|
| 249 |
+
ax.set_ylabel('kg CO₂e per kg H₂')
|
| 250 |
+
ax.set_ylim(0, max(df_comparison['Carbon Intensity (kg CO₂e/kg H₂)']) * 1.2)
|
| 251 |
+
|
| 252 |
+
st.pyplot(fig)
|
| 253 |
+
|
| 254 |
+
if __name__ == "__main__":
|
| 255 |
+
run_analyzer()
|
landing-page-py.py
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
import base64
|
| 3 |
+
from PIL import Image
|
| 4 |
+
import io
|
| 5 |
+
|
| 6 |
+
def display_landing_page():
|
| 7 |
+
# Hero Section
|
| 8 |
+
st.markdown("""
|
| 9 |
+
<div style="text-align: center; padding: 50px 0; background: linear-gradient(135deg, #0F9D58 0%, #1E88E5 100%); border-radius: 10px; margin-bottom: 30px;">
|
| 10 |
+
<h1 style="font-size: 4rem; color: white; margin-bottom: 20px;">EcoLytics</h1>
|
| 11 |
+
<p style="font-size: 1.5rem; color: white; margin-bottom: 30px; max-width: 800px; margin-left: auto; margin-right: auto;">
|
| 12 |
+
Intelligent Hydrogen Economics Platform powered by AI to revolutionize techno-economic analysis for green hydrogen projects.
|
| 13 |
+
</p>
|
| 14 |
+
</div>
|
| 15 |
+
""", unsafe_allow_html=True)
|
| 16 |
+
|
| 17 |
+
# Feature Cards Section
|
| 18 |
+
st.markdown("## Intelligent Analysis Features", unsafe_allow_html=True)
|
| 19 |
+
|
| 20 |
+
col1, col2 = st.columns(2)
|
| 21 |
+
|
| 22 |
+
with col1:
|
| 23 |
+
st.markdown("""
|
| 24 |
+
<div class="feature-card">
|
| 25 |
+
<h3 style="color: #0F9D58;">Predictive Cost Modeling</h3>
|
| 26 |
+
<p>ML algorithms forecast CAPEX/OPEX with 94% accuracy, accounting for technology evolution curves and market dynamics.</p>
|
| 27 |
+
</div>
|
| 28 |
+
""", unsafe_allow_html=True)
|
| 29 |
+
|
| 30 |
+
st.markdown("""
|
| 31 |
+
<div class="feature-card">
|
| 32 |
+
<h3 style="color: #0F9D58;">Configuration Optimizer</h3>
|
| 33 |
+
<p>Suggests optimal electrolyzer setup based on location, scale, and grid characteristics with dynamic sensitivity analysis.</p>
|
| 34 |
+
</div>
|
| 35 |
+
""", unsafe_allow_html=True)
|
| 36 |
+
|
| 37 |
+
with col2:
|
| 38 |
+
st.markdown("""
|
| 39 |
+
<div class="feature-card">
|
| 40 |
+
<h3 style="color: #1E88E5;">Interactive Visualization</h3>
|
| 41 |
+
<p>Dynamic dashboards for real-time ROI scenario planning and cost breakdown across the entire hydrogen value chain.</p>
|
| 42 |
+
</div>
|
| 43 |
+
""", unsafe_allow_html=True)
|
| 44 |
+
|
| 45 |
+
st.markdown("""
|
| 46 |
+
<div class="feature-card">
|
| 47 |
+
<h3 style="color: #1E88E5;">Policy Impact Simulator</h3>
|
| 48 |
+
<p>Evaluates how incentives and regulations affect project economics with regional comparison tools for global investment decisions.</p>
|
| 49 |
+
</div>
|
| 50 |
+
""", unsafe_allow_html=True)
|
| 51 |
+
|
| 52 |
+
# Electrolysis Process Visualization
|
| 53 |
+
st.markdown("## Hydrogen Electrolysis Process", unsafe_allow_html=True)
|
| 54 |
+
|
| 55 |
+
# Create a simple SVG visualization of electrolysis
|
| 56 |
+
electrolysis_svg = """
|
| 57 |
+
<svg width="800" height="400" xmlns="http://www.w3.org/2000/svg">
|
| 58 |
+
<!-- Water container -->
|
| 59 |
+
<rect x="150" y="100" width="500" height="250" fill="#E1F5FE" stroke="#1E88E5" stroke-width="2" rx="10" />
|
| 60 |
+
|
| 61 |
+
<!-- Electrodes -->
|
| 62 |
+
<rect x="200" y="80" width="20" height="290" fill="#424242" stroke="#212121" />
|
| 63 |
+
<rect x="580" y="80" width="20" height="290" fill="#424242" stroke="#212121" />
|
| 64 |
+
|
| 65 |
+
<!-- Bubbles - will be animated with CSS -->
|
| 66 |
+
<circle class="h-bubble b1" cx="210" cy="200" r="10" fill="#88ff88" opacity="0.7" />
|
| 67 |
+
<circle class="h-bubble b2" cx="205" cy="250" r="8" fill="#88ff88" opacity="0.7" />
|
| 68 |
+
<circle class="h-bubble b3" cx="215" cy="180" r="6" fill="#88ff88" opacity="0.7" />
|
| 69 |
+
<circle class="h-bubble b4" cx="200" cy="220" r="7" fill="#88ff88" opacity="0.7" />
|
| 70 |
+
|
| 71 |
+
<circle class="o-bubble b1" cx="590" cy="210" r="8" fill="#ff8888" opacity="0.7" />
|
| 72 |
+
<circle class="o-bubble b2" cx="585" cy="240" r="6" fill="#ff8888" opacity="0.7" />
|
| 73 |
+
<circle class="o-bubble b3" cx="595" cy="190" r="5" fill="#ff8888" opacity="0.7" />
|
| 74 |
+
<circle class="o-bubble b4" cx="580" cy="230" r="7" fill="#ff8888" opacity="0.7" />
|
| 75 |
+
|
| 76 |
+
<!-- Labels -->
|
| 77 |
+
<text x="210" y="60" font-family="Arial" font-size="16" fill="#0F9D58">Cathode (-)</text>
|
| 78 |
+
<text x="580" y="60" font-family="Arial" font-size="16" fill="#E53935">Anode (+)</text>
|
| 79 |
+
|
| 80 |
+
<text x="180" y="380" font-family="Arial" font-size="14" fill="#0F9D58">H₂ Gas</text>
|
| 81 |
+
<text x="580" y="380" font-family="Arial" font-size="14" fill="#E53935">O₂ Gas</text>
|
| 82 |
+
|
| 83 |
+
<!-- Power Source -->
|
| 84 |
+
<rect x="350" y="30" width="100" height="50" fill="#FFC107" stroke="#FF9800" stroke-width="2" rx="5" />
|
| 85 |
+
<text x="370" y="60" font-family="Arial" font-size="14" fill="#212121">Power Source</text>
|
| 86 |
+
|
| 87 |
+
<!-- Wires -->
|
| 88 |
+
<line x1="350" y1="55" x2="220" y2="55" stroke="#212121" stroke-width="3" />
|
| 89 |
+
<line x1="450" y1="55" x2="580" y2="55" stroke="#E53935" stroke-width="3" />
|
| 90 |
+
|
| 91 |
+
<style>
|
| 92 |
+
.h-bubble {
|
| 93 |
+
animation: rise 3s infinite;
|
| 94 |
+
}
|
| 95 |
+
.o-bubble {
|
| 96 |
+
animation: rise 4s infinite;
|
| 97 |
+
}
|
| 98 |
+
.b1 { animation-delay: 0s; }
|
| 99 |
+
.b2 { animation-delay: 0.8s; }
|
| 100 |
+
.b3 { animation-delay: 1.6s; }
|
| 101 |
+
.b4 { animation-delay: 2.4s; }
|
| 102 |
+
|
| 103 |
+
@keyframes rise {
|
| 104 |
+
0% { transform: translateY(0); }
|
| 105 |
+
100% { transform: translateY(-100px); opacity: 0; }
|
| 106 |
+
}
|
| 107 |
+
</style>
|
| 108 |
+
</svg>
|
| 109 |
+
"""
|
| 110 |
+
|
| 111 |
+
st.markdown(electrolysis_svg, unsafe_allow_html=True)
|
| 112 |
+
|
| 113 |
+
# Process Steps
|
| 114 |
+
st.markdown("## How Our Platform Works", unsafe_allow_html=True)
|
| 115 |
+
|
| 116 |
+
col1, col2, col3, col4 = st.columns(4)
|
| 117 |
+
|
| 118 |
+
with col1:
|
| 119 |
+
st.markdown("""
|
| 120 |
+
<div class="process-step">
|
| 121 |
+
<div class="step-number">1</div>
|
| 122 |
+
<h4>Input Configuration</h4>
|
| 123 |
+
<p>Define project parameters including location, capacity, and renewable energy sources.</p>
|
| 124 |
+
</div>
|
| 125 |
+
""", unsafe_allow_html=True)
|
| 126 |
+
|
| 127 |
+
with col2:
|
| 128 |
+
st.markdown("""
|
| 129 |
+
<div class="process-step">
|
| 130 |
+
<div class="step-number">2</div>
|
| 131 |
+
<h4>AI Analysis</h4>
|
| 132 |
+
<p>Our machine learning models analyze your configuration against market variables.</p>
|
| 133 |
+
</div>
|
| 134 |
+
""", unsafe_allow_html=True)
|
| 135 |
+
|
| 136 |
+
with col3:
|
| 137 |
+
st.markdown("""
|
| 138 |
+
<div class="process-step">
|
| 139 |
+
<div class="step-number">3</div>
|
| 140 |
+
<h4>Optimization</h4>
|
| 141 |
+
<p>Receive detailed recommendations for optimizing electrolyzer efficiency.</p>
|
| 142 |
+
</div>
|
| 143 |
+
""", unsafe_allow_html=True)
|
| 144 |
+
|
| 145 |
+
with col4:
|
| 146 |
+
st.markdown("""
|
| 147 |
+
<div class="process-step">
|
| 148 |
+
<div class="step-number">4</div>
|
| 149 |
+
<h4>Scenario Planning</h4>
|
| 150 |
+
<p>Explore multiple scenarios to identify the most robust configuration.</p>
|
| 151 |
+
</div>
|
| 152 |
+
""", unsafe_allow_html=True)
|
| 153 |
+
|
| 154 |
+
# Call to Action
|
| 155 |
+
st.markdown("---")
|
| 156 |
+
st.markdown("""
|
| 157 |
+
<div style="text-align: center; padding: 30px 0; background: #f5f5f7; border-radius: 10px; margin-top: 30px;">
|
| 158 |
+
<h2 style="color: #0F9D58; margin-bottom: 20px;">Ready to Transform Your Hydrogen Projects?</h2>
|
| 159 |
+
<p style="font-size: 1.2rem; margin-bottom: 30px;">Start analyzing your hydrogen project economics now.</p>
|
| 160 |
+
</div>
|
| 161 |
+
""", unsafe_allow_html=True)
|
| 162 |
+
|
| 163 |
+
col1, col2, col3 = st.columns([1,2,1])
|
| 164 |
+
with col2:
|
| 165 |
+
if st.button("Launch Hydrogen Analyzer", use_container_width=True):
|
| 166 |
+
st.session_state.page = "Hydrogen Analyzer"
|
| 167 |
+
st.experimental_rerun()
|
readme-md.txt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# EcoLytics: Intelligent Hydrogen Economics Platform
|
| 2 |
+
|
| 3 |
+
EcoLytics is an AI-powered decision support system that transforms green hydrogen project planning through advanced techno-economic analysis. Using machine learning algorithms, it optimizes electrolyzer configurations, predicts ROI scenarios, and visualizes sustainable energy pathways -
|
requirements-txt.txt
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
streamlit==1.25.0
|
| 2 |
+
pandas==1.5.3
|
| 3 |
+
numpy==1.24.3
|
| 4 |
+
matplotlib==3.7.1
|
| 5 |
+
seaborn==0.12.2
|
| 6 |
+
pillow==9.5.0
|