|
""" |
|
Page to analyse the link between crs codes, countries and organizations |
|
""" |
|
|
|
|
|
|
|
|
|
import streamlit as st |
|
import pandas as pd |
|
import utils.crs_table as crs_table |
|
import utils.sdg_table as sdg_table |
|
import utils.filter_modules as filter_modules |
|
""" |
|
from importlib.machinery import SourceFileLoader |
|
crs_overlap = SourceFileLoader("crs_overlap", "data/models/crs_overlap.py").load_module() |
|
sdg_overlap = SourceFileLoader("sdg_overlap", "data/models/sdg_overlap.py").load_module() |
|
CONSTANTS = SourceFileLoader("CONSTANTS", "config/CONSTANTS.py").load_module() |
|
|
|
# CHACHE DATA |
|
# FETCH NEEDED DATA AND STORE IN CHACHE MEMORY TO SAVE LOADING TIME |
|
@st.cache_data |
|
def getCRS3(): |
|
# Read in CRS3 CODELISTS |
|
crs3_df = pd.read_csv('app/src/codelists/crs3_codes.csv') |
|
CRS3_CODES = crs3_df['code'].tolist() |
|
CRS3_NAME = crs3_df['name'].tolist() |
|
CRS3_MERGED = {f"{name} - {code}": code for name, code in zip(CRS3_NAME, CRS3_CODES)} |
|
|
|
return CRS3_MERGED |
|
|
|
@st.cache_data |
|
def getCRS5(): |
|
# Read in CRS3 CODELISTS |
|
crs5_df = pd.read_csv('app/src/codelists/crs5_codes.csv') |
|
CRS5_CODES = crs5_df['code'].tolist() |
|
CRS5_NAME = crs5_df['name'].tolist() |
|
CRS5_MERGED = {code: [f"{name} - {code}"] for name, code in zip(CRS5_NAME, CRS5_CODES)} |
|
|
|
return CRS5_MERGED |
|
|
|
@st.cache_data |
|
def getSDG(): |
|
# Read in SDG CODELISTS |
|
sdg_df = pd.read_csv('app/src/codelists/sdg_goals.csv') |
|
SDG_NAMES = sdg_df['name'].tolist() |
|
|
|
return SDG_NAMES |
|
|
|
@st.cache_data |
|
def getCountry(): |
|
# Read in countries from codelist |
|
country_df = pd.read_csv('app/src/codelists/country_codes_ISO3166-1alpha-2.csv') |
|
COUNTRY_CODES = country_df['Alpha-2 code'].tolist() |
|
COUNTRY_NAMES = country_df['Country'].tolist() |
|
|
|
return country_df, COUNTRY_CODES, COUNTRY_NAMES |
|
|
|
CRS3_MERGED = getCRS3() |
|
CRS5_MERGED = getCRS5() |
|
SDG_NAMES = getSDG() |
|
country_df, COUNTRY_CODES, COUNTRY_NAMES = getCountry() |
|
|
|
# SPECIAL SELECTIONS |
|
## COUNTRY |
|
SPECIAL_COUNTRY_SLECTIONS = ["All"] |
|
SHOW_ALL_COUNTRIES = False # If all countries should be showed in matching |
|
|
|
## ORGANIZATION |
|
SPECIAL_ORGA_SLECTIONS = ["All"] |
|
SHOW_ALL_ORGAS = False |
|
""" |
|
|
|
|
|
|
|
def show_page(): |
|
|
|
""" |
|
def show_crs(): |
|
# SESSION STATES |
|
st.session_state.crs5_option_disabled = True |
|
|
|
# SELECTION FIELDS |
|
col1, col2 = st.columns([1, 1]) |
|
with col1: |
|
##################### |
|
# CRS 3 CODE SELECT # |
|
##################### |
|
crs3_option = st.multiselect( |
|
'CRS 3', |
|
CRS3_MERGED, |
|
placeholder="Select" |
|
) |
|
|
|
##################### |
|
# CRS 5 CODE SELECT # |
|
##################### |
|
# Only enable crs5 select field when crs3 code is selected |
|
if crs3_option != []: |
|
st.session_state.crs5_option_disabled = False |
|
|
|
# define list of crs5 codes dependend on crs3 codes |
|
crs5_list = [txt[0].replace('"', "") for crs3_item in crs3_option for code, txt in CRS5_MERGED.items() if str(code)[:3] == str(crs3_item)[-3:]] |
|
|
|
# crs5 select field |
|
crs5_option = st.multiselect( |
|
'CRS 5', |
|
crs5_list, |
|
placeholder="Select", |
|
disabled=st.session_state.crs5_option_disabled |
|
) |
|
|
|
with col2: |
|
# COUNTRY SELECTION |
|
country_option = filter_modules.country_option(SPECIAL_COUNTRY_SLECTIONS, COUNTRY_NAMES) |
|
|
|
# ORGA SELECTION |
|
orga_option = filter_modules.orga_option(SPECIAL_ORGA_SLECTIONS, CONSTANTS.ORGA_SEARCH) |
|
|
|
################ |
|
# SHOW RESULTS # |
|
################ |
|
# Extract Orgas from multiselect |
|
if "All" in orga_option: |
|
SHOW_ALL_ORGAS = True |
|
selected_orgas = [] |
|
else: |
|
SHOW_ALL_ORGAS = False |
|
selected_orgas = [str(o).replace(")", "").lower().split("(")[1] for o in orga_option] |
|
|
|
if country_option != []: |
|
# all selection |
|
if "All" in country_option: |
|
SHOW_ALL_COUNTRIES = True |
|
country_option.remove("All") |
|
else: |
|
SHOW_ALL_COUNTRIES = False |
|
|
|
if crs3_option != []: |
|
# CRS 3 codes from option |
|
crs3_list = [i[-3:] for i in crs3_option] |
|
|
|
# get country codes from multiselect |
|
country_names = [str(c) for c in country_option] |
|
country_codes = [ |
|
country_df[country_df['Country'] == c]['Alpha-2 code'].values[0].replace('"', "").strip(" ") |
|
for c in country_names |
|
] |
|
|
|
result_df = crs_overlap.calc_crs3(crs3_list, country_codes, selected_orgas, SHOW_ALL_COUNTRIES, SHOW_ALL_ORGAS) |
|
|
|
if crs5_option != []: |
|
# CRS 5 codes from option |
|
crs5_list = [i[-5:] for i in crs5_option] |
|
result_df = crs_overlap.calc_crs5(crs5_list, country_codes, selected_orgas, SHOW_ALL_COUNTRIES, SHOW_ALL_ORGAS) |
|
|
|
# TABLE FOR CRS OVERLAP |
|
crs_table.show_table(result_df) |
|
|
|
def show_sdg(): |
|
# SELECTION |
|
col1, col2 = st.columns([1, 1]) |
|
with col1: |
|
# CRS3 CODE SELECT |
|
sdg_option = st.selectbox( |
|
label = 'SDG', |
|
index = None, |
|
placeholder = "Select SDG", |
|
options = SDG_NAMES, |
|
) |
|
|
|
with col2: |
|
# COUNTRY SELECTION |
|
country_option = filter_modules.country_option(SPECIAL_COUNTRY_SLECTIONS, COUNTRY_NAMES) |
|
|
|
# ORGA SELECTION |
|
orga_option = filter_modules.orga_option(SPECIAL_ORGA_SLECTIONS, CONSTANTS.ORGA_SEARCH) |
|
|
|
|
|
# SHOW RESULTS |
|
if sdg_option != None: |
|
sdg_int = int(sdg_option.split(" ")[0].replace(".", "")) |
|
# Extract Orgas from multiselect |
|
if "All" in orga_option: |
|
SHOW_ALL_ORGAS = True |
|
selected_orgas = [] |
|
else: |
|
SHOW_ALL_ORGAS = False |
|
selected_orgas = [str(o).replace(")", "").lower().split("(")[1] for o in orga_option] |
|
|
|
if country_option != []: |
|
# all selection |
|
if "All" in country_option: |
|
SHOW_ALL_COUNTRIES = True |
|
country_option.remove("All") |
|
else: |
|
SHOW_ALL_COUNTRIES = False |
|
|
|
country_names = [str(c) for c in country_option] |
|
country_codes = [ |
|
country_df[country_df['Country'] == c]['Alpha-2 code'].values[0].replace('"', "").strip(" ") |
|
for c in country_names |
|
] |
|
|
|
result_df = sdg_overlap.calc_crs3(sdg_int, country_codes, selected_orgas, SHOW_ALL_COUNTRIES, SHOW_ALL_ORGAS) |
|
|
|
# TABLE FOR SDG OVERLAP |
|
sdg_table.show_table(result_df) |
|
|
|
# SELECT IF CRS or SDG Match |
|
match_option = st.selectbox( |
|
label = 'Matching Method', |
|
index = 0, |
|
placeholder = "Select", |
|
options = ["CRS", "SDG"], |
|
) |
|
|
|
st.write("------------------") |
|
|
|
if match_option == "CRS": |
|
show_crs() |
|
elif match_option == "SDG": |
|
show_sdg() |
|
|
|
""" |
|
|
|
|