| import streamlit as st | |
| import pandas as pd | |
| from src.utils import streamlit_function | |
| from src.utils.logger import get_logger | |
| from src.services.mongo_db_service import retrieve_documents | |
| from src.utils.common_functions import prepare_comparison_df | |
| logger = get_logger() | |
| streamlit_function.config_homepage() | |
| st.title("π ESG Report Comparison Dashboard") | |
| METRIC_OPTIONS = { | |
| "Report Metadata": ["report_metadata"], | |
| "Environmental Parameters": [ | |
| "Emissions", "Energy Consumption", "Water Withdrawal", "Water Discharge", | |
| "Waste Generation", "Waste Disposal", "Waste Recovery" | |
| ], | |
| "Social Parameters": [ | |
| "Human Rights Training Coverage", "LTIFR", "Other Safety Incidents", | |
| "Health & Safety Training Coverage", "Grievances Reported", | |
| "Third-party Assessment Coverage", "CSR Beneficiaries", "Female Wage Share", | |
| "Wages by Location", "Well-being Cost", "Worker Well-being Coverage", | |
| "Employee Well-being Coverage", "Turnover Count", "Workforce Gender Diversity" | |
| ], | |
| "Governance Parameters": [ | |
| "Non-compliance Instances", "Disciplinary Actions", "Consumer Complaints", | |
| "Customer Data Breaches", "Governance Diversity", "Purchase Concentration", | |
| "Sales Concentration", "Related Party Transactions" | |
| ], | |
| "Materiality": ["material_topics"] | |
| } | |
| ESG_EXTRACTOR_COLLECTION = "esg_report_extracts" | |
| company_docs = retrieve_documents(collection_name=ESG_EXTRACTOR_COLLECTION) | |
| available_company_data = [doc["_id"] for doc in company_docs if "_id" in doc] | |
| selected_companies = st.multiselect( | |
| "Select up to 3 companies", | |
| options=available_company_data, | |
| max_selections=3 | |
| ) | |
| def get_all_years(docs) -> list: | |
| years = set() | |
| for doc in docs: | |
| if "esg_reports" in doc and isinstance(doc["esg_reports"], dict): | |
| years.update(doc["esg_reports"].keys()) | |
| return sorted(years, reverse=True) | |
| def highlight_missing_values(df): | |
| return df.style.map(lambda v: "background-color: #ffe6e6" if pd.isna(v) or str(v).strip() in ["", "nan", "None", "Not Available","N/A"] else "background-color: #e6ffe6") | |
| def extract_company_name_from_doc(doc, default_name): | |
| return doc.get("report_metadata", {}).get("company_legal_name", default_name) | |
| if selected_companies: | |
| all_years = get_all_years(company_docs) | |
| selected_year = st.selectbox( | |
| "Select a report year (applies to all selected companies)", | |
| options=["-- Select Year --"] + all_years, | |
| key="common_year" | |
| ) | |
| if selected_year != "-- Select Year --": | |
| tabs = st.tabs(list(METRIC_OPTIONS.keys())) | |
| metric_categories = list(METRIC_OPTIONS.keys()) | |
| for i, tab in enumerate(tabs): | |
| with tab: | |
| st.subheader(metric_categories[i]) | |
| metric_keys = METRIC_OPTIONS[metric_categories[i]] | |
| for metric in metric_keys: | |
| st.markdown(f"### {metric}") | |
| comparison_df = prepare_comparison_df( | |
| selected_companies, | |
| selected_year, | |
| metric, | |
| company_docs | |
| ) | |
| if comparison_df is not None: | |
| st.dataframe(highlight_missing_values(comparison_df), use_container_width=True) | |
| else: | |
| st.warning(f"No data found for **{metric}** in {selected_year}") | |
| else: | |
| st.info("Please select a year to view report comparisons.") | |
| else: | |
| st.info("Please select at least one company to continue.") |