Spaces:
Sleeping
Sleeping
File size: 8,545 Bytes
01f8a8c 972688e 01f8a8c 723d673 01f8a8c 723d673 01f8a8c 723d673 01f8a8c 723d673 6dd1918 4572e8b 6dd1918 74989d0 723d673 74989d0 aa39642 1858b46 723d673 aa39642 6dd1918 723d673 6dd1918 723d673 1858b46 4a96b97 723d673 1858b46 4a96b97 723d673 4a96b97 723d673 4a96b97 723d673 4a96b97 972688e 723d673 972688e 723d673 53b9d1f 723d673 53b9d1f 723d673 a2acbd6 723d673 53b9d1f 1858b46 723d673 53b9d1f 2587cb1 723d673 53b9d1f 2587cb1 723d673 53b9d1f 723d673 53b9d1f 723d673 53b9d1f 723d673 53b9d1f 723d673 53b9d1f 1858b46 723d673 53b9d1f 723d673 53b9d1f 723d673 4a96b97 4572e8b 53b9d1f |
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 |
import streamlit as st
import pandas as pd
import plotly.express as px
# Set page configurations
st.set_page_config(page_title="GreenLens-AI", layout="wide")
# Page title and description
st.markdown("<h1 style='text-align: center; color: #4CAF50;'>GreenLens-AI</h1>", unsafe_allow_html=True)
st.markdown(
"""
<p style='text-align: center; color: #4CAF50;'>
A Tool for Calculating Water, Energy, and Carbon Footprints of Textile Products 🌍
</p>
""",
unsafe_allow_html=True,
)
# Sidebar for file upload
st.sidebar.header("Step 1: Upload Dataset")
uploaded_file = st.sidebar.file_uploader("Upload your Excel file (.xlsx)", type=["xlsx"])
# Initialize data containers
fiber_impact_data = None
transport_impact_data = None
washing_impact_data = None
# Function to process the uploaded Excel file
@st.cache_data
def process_excel(file):
try:
excel_content = pd.ExcelFile(file)
fiber_data = pd.read_excel(file, sheet_name="Fiber Impact Data")
transport_data = pd.read_excel(file, sheet_name="Transport Impact Data")
washing_data = pd.read_excel(file, sheet_name="Washing Data")
# Convert into dictionaries for dynamic calculations
fiber_impact_data = fiber_data.set_index("Fiber Type")[["Water (L/kg)", "Energy (MJ/kg)", "Carbon (kg CO2e/kg)"]].to_dict(orient="index")
transport_impact_data = transport_data.set_index("Transport Mode")["CFP (kg CO2e/km)"].to_dict()
washing_impact_data = washing_data.set_index("Washing Temperature")[["Water (L/kg)", "Energy Use (MJ/wash)", "Carbon (kg CO2e/wash)", "Dryer CFP (kg CO2e/cycle)"]].to_dict(orient="index")
return fiber_impact_data, transport_impact_data, washing_impact_data
except Exception as e:
st.error(f"Error processing the file: {e}")
return None, None, None
# Process uploaded file
if uploaded_file:
fiber_impact_data, transport_impact_data, washing_impact_data = process_excel(uploaded_file)
# Function to calculate footprints
def calculate_footprints(weight, composition, lifecycle_inputs):
water_fp, energy_fp, carbon_fp = 0, 0, 0
for fiber, percentage in composition.items():
if fiber in fiber_impact_data:
data = fiber_impact_data[fiber]
fraction = percentage / 100
water_fp += data["Water (L/kg)"] * weight * fraction
energy_fp += data["Energy (MJ/kg)"] * weight * fraction
carbon_fp += data["Carbon (kg CO2e/kg)"] * weight * fraction
if lifecycle_inputs["transport_mode"] in transport_impact_data:
carbon_fp += transport_impact_data[lifecycle_inputs["transport_mode"]] * lifecycle_inputs["transport_distance"] * weight
if lifecycle_inputs["washing_temperature"] in washing_impact_data:
washing_data = washing_impact_data[lifecycle_inputs["washing_temperature"]]
washing_water = washing_data["Water (L/kg)"] * lifecycle_inputs["washing_cycles"]
washing_energy = washing_data["Energy Use (MJ/wash)"] * lifecycle_inputs["washing_cycles"]
washing_carbon = washing_data["Carbon (kg CO2e/wash)"] * lifecycle_inputs["washing_cycles"]
dryer_carbon = washing_data["Dryer CFP (kg CO2e/cycle)"] if lifecycle_inputs["use_dryer"] else 0
water_fp += washing_water
energy_fp += washing_energy
carbon_fp += washing_carbon + (dryer_carbon * lifecycle_inputs["washing_cycles"])
# Convert water footprint from liters to kiloliters for visualization
water_fp_kL = water_fp / 1000 # Convert liters to kiloliters
return water_fp_kL, energy_fp, carbon_fp
# Sidebar inputs for all scenarios
def get_inputs(key_prefix):
product_weight = st.sidebar.number_input(f"{key_prefix} - Product Weight (kg)", min_value=0.01, step=0.01, value=0.5, key=f"{key_prefix}_weight")
st.sidebar.subheader(f"{key_prefix} - Material Composition (%)")
cotton = st.sidebar.number_input("Conventional Cotton (%)", min_value=0, max_value=100, value=50, step=1, key=f"{key_prefix}_cotton")
polyester = st.sidebar.number_input("Polyester (%)", min_value=0, max_value=100, value=30, step=1, key=f"{key_prefix}_polyester")
nylon = st.sidebar.number_input("Nylon 6 (%)", min_value=0, max_value=100, value=10, step=1, key=f"{key_prefix}_nylon")
acrylic = st.sidebar.number_input("Acrylic (%)", min_value=0, max_value=100, value=5, step=1, key=f"{key_prefix}_acrylic")
viscose = st.sidebar.number_input("Viscose (%)", min_value=0, max_value=100, value=5, step=1, key=f"{key_prefix}_viscose")
total_percentage = cotton + polyester + nylon + acrylic + viscose
if total_percentage != 100:
st.sidebar.error(f"Total composition for {key_prefix} must be 100%!")
composition = {
"Conventional Cotton": cotton,
"Polyester": polyester,
"Nylon 6": nylon,
"Acrylic": acrylic,
"Viscose": viscose,
}
st.sidebar.subheader(f"{key_prefix} - Lifecycle Inputs")
washing_cycles = st.sidebar.number_input(f"{key_prefix} - Washing Cycles", min_value=0, step=1, value=30, key=f"{key_prefix}_wash_cycles")
washing_temperature = st.sidebar.selectbox(f"{key_prefix} - Washing Temperature", list(washing_impact_data.keys()), key=f"{key_prefix}_wash_temp")
use_dryer = st.sidebar.checkbox(f"{key_prefix} - Use Tumble Dryer?", key=f"{key_prefix}_use_dryer")
transport_mode = st.sidebar.selectbox(f"{key_prefix} - Transport Mode", list(transport_impact_data.keys()), key=f"{key_prefix}_transport_mode")
transport_distance = st.sidebar.number_input(f"{key_prefix} - Transport Distance (km)", min_value=0, step=10, value=100, key=f"{key_prefix}_transport_distance")
lifecycle_inputs = {
"washing_temperature": washing_temperature,
"washing_cycles": washing_cycles,
"use_dryer": use_dryer,
"transport_mode": transport_mode,
"transport_distance": transport_distance,
}
return product_weight, composition, lifecycle_inputs
# Main interface
if uploaded_file and fiber_impact_data and transport_impact_data and washing_impact_data:
comparison_mode = st.sidebar.checkbox("Enable Comparison Mode")
if comparison_mode:
# Input for two assessments
col1, col2 = st.columns(2)
with col1:
st.subheader("Assessment 1")
product_weight_1, composition_1, lifecycle_inputs_1 = get_inputs("Assessment 1")
with col2:
st.subheader("Assessment 2")
product_weight_2, composition_2, lifecycle_inputs_2 = get_inputs("Assessment 2")
# Calculations for both assessments
water_fp_1, energy_fp_1, carbon_fp_1 = calculate_footprints(product_weight_1, composition_1, lifecycle_inputs_1)
water_fp_2, energy_fp_2, carbon_fp_2 = calculate_footprints(product_weight_2, composition_2, lifecycle_inputs_2)
# Combined visualization with line chart
st.subheader("Comparison of Assessments")
assessment_data = pd.DataFrame({
"Footprint Type": ["Water (kL)", "Energy (MJ)", "Carbon (kg CO2e)"],
"Assessment 1": [water_fp_1, energy_fp_1, carbon_fp_1],
"Assessment 2": [water_fp_2, energy_fp_2, carbon_fp_2],
})
fig = px.line(
assessment_data.melt(id_vars="Footprint Type", var_name="Assessment", value_name="Value"),
x="Footprint Type",
y="Value",
color="Assessment",
markers=True,
title="Footprint Trends: Assessment 1 vs. Assessment 2"
)
st.plotly_chart(fig)
else:
# Input for single calculation
product_weight, composition, lifecycle_inputs = get_inputs("")
water_fp, energy_fp, carbon_fp = calculate_footprints(product_weight, composition, lifecycle_inputs)
# Display results
st.subheader("Results")
st.markdown(f"- **Water Footprint**: {water_fp:.2f} kL")
st.markdown(f"- **Energy Footprint**: {energy_fp:.2f} MJ")
st.markdown(f"- **Carbon Footprint**: {carbon_fp:.2f} kg CO2e")
# Visualization for single scenario
result_data = pd.DataFrame({
"Footprint Type": ["Water (kL)", "Energy (MJ)", "Carbon (kg CO2e)"],
"Value": [water_fp, energy_fp, carbon_fp],
})
fig = px.line(result_data, x="Footprint Type", y="Value", markers=True, title="Footprint Trends")
st.plotly_chart(fig)
else:
st.info("Please upload a dataset to proceed.")
|