| | import streamlit as st |
| | import requests |
| | import os |
| | import json |
| | import pandas as pd |
| | import plotly.graph_objects as go |
| | import plotly.express as px |
| | import time |
| | from datetime import datetime, timedelta |
| | import random |
| | import nltk |
| | from nltk.corpus import stopwords |
| | from wordcloud import WordCloud |
| | import matplotlib.pyplot as plt |
| | from streamlit_lottie import st_lottie |
| | import base64 |
| | from PIL import Image |
| | import io |
| |
|
| | |
| | nltk.download('stopwords', quiet=True) |
| | nltk.download('punkt', quiet=True) |
| |
|
| | |
| | st.set_page_config(page_title="DSEAP", page_icon="📊", layout="wide") |
| |
|
| | |
| | st.markdown(""" |
| | <style> |
| | @import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap'); |
| | |
| | .stApp { |
| | background: #f0f2f6; |
| | font-family: 'Roboto', sans-serif; |
| | } |
| | .header { |
| | font-size: 42px; |
| | font-weight: bold; |
| | color: #1e3799; |
| | text-align: center; |
| | margin-bottom: 30px; |
| | text-shadow: 2px 2px 4px rgba(0,0,0,0.1); |
| | } |
| | .subheader { |
| | font-size: 28px; |
| | font-weight: bold; |
| | color: #3c6382; |
| | text-align: center; |
| | margin-bottom: 25px; |
| | } |
| | .section { |
| | background: white; |
| | padding: 25px; |
| | border-radius: 15px; |
| | box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.1); |
| | margin-bottom: 30px; |
| | } |
| | .footer { |
| | text-align: center; |
| | font-size: 14px; |
| | color: #555; |
| | margin-top: 30px; |
| | padding: 10px; |
| | border-top: 1px solid #ddd; |
| | } |
| | .stProgress > div > div > div > div { |
| | background-image: linear-gradient(to right, #4a69bd, #6a89cc); |
| | } |
| | .stButton>button { |
| | background-color: #4a69bd; |
| | color: white; |
| | font-weight: bold; |
| | border-radius: 5px; |
| | padding: 10px 20px; |
| | transition: all 0.3s ease; |
| | } |
| | .stButton>button:hover { |
| | background-color: #1e3799; |
| | box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.2); |
| | } |
| | .animated-div { |
| | background: linear-gradient(-45deg, #4a69bd, #6a89cc, #54a0ff, #5f27cd); |
| | background-size: 400% 400%; |
| | animation: gradient 15s ease infinite; |
| | padding: 15px; |
| | border-radius: 10px; |
| | margin-bottom: 15px; |
| | color: white; |
| | font-weight: bold; |
| | } |
| | @keyframes gradient { |
| | 0% {background-position: 0% 50%;} |
| | 50% {background-position: 100% 50%;} |
| | 100% {background-position: 0% 50%;} |
| | } |
| | .info-box { |
| | background-color: #e3f2fd; |
| | border-left: 5px solid #2196f3; |
| | padding: 15px; |
| | margin-bottom: 20px; |
| | border-radius: 5px; |
| | } |
| | .warning-box { |
| | background-color: #fff3e0; |
| | border-left: 5px solid #ff9800; |
| | padding: 15px; |
| | margin-bottom: 20px; |
| | border-radius: 5px; |
| | } |
| | </style> |
| | """, unsafe_allow_html=True) |
| |
|
| | |
| | def load_lottieurl(url: str): |
| | r = requests.get(url) |
| | if r.status_code != 200: |
| | return None |
| | return r.json() |
| |
|
| | |
| | lottie_analytics = load_lottieurl("https://assets5.lottiefiles.com/packages/lf20_qp1q7mct.json") |
| | lottie_skills = load_lottieurl("https://assets5.lottiefiles.com/private_files/lf30_wqypnpu5.json") |
| |
|
| | |
| | def call_ai_model(prompt): |
| | url = "https://api.together.xyz/v1/chat/completions" |
| | payload = { |
| | "model": "NousResearch/Nous-Hermes-2-Yi-34B", |
| | "temperature": 1.05, |
| | "top_p": 0.9, |
| | "top_k": 50, |
| | "repetition_penalty": 1, |
| | "n": 1, |
| | "messages": [{"role": "user", "content": prompt}], |
| | "stream_tokens": True, |
| | } |
| |
|
| | TOGETHER_API_KEY = os.getenv('TOGETHER_API_KEY') |
| | if TOGETHER_API_KEY is None: |
| | raise ValueError("TOGETHER_API_KEY environment variable not set.") |
| | |
| | headers = { |
| | "accept": "application/json", |
| | "content-type": "application/json", |
| | "Authorization": f"Bearer {TOGETHER_API_KEY}", |
| | } |
| |
|
| | try: |
| | response = requests.post(url, json=payload, headers=headers, stream=True) |
| | response.raise_for_status() |
| | |
| | full_response = "" |
| | for line in response.iter_lines(): |
| | if line: |
| | line_content = line.decode('utf-8') |
| | if line_content.startswith("data: "): |
| | line_content = line_content[6:] |
| | try: |
| | json_data = json.loads(line_content) |
| | if "choices" in json_data: |
| | delta = json_data["choices"][0]["delta"] |
| | if "content" in delta: |
| | full_response += delta["content"] |
| | except json.JSONDecodeError: |
| | continue |
| | |
| | return full_response.strip() |
| | except requests.exceptions.RequestException as e: |
| | st.error(f"API call failed: {e}") |
| | return "An error occurred while fetching AI insights." |
| |
|
| | |
| | def generate_simulated_data(categories, count=5): |
| | return {cat: [random.randint(1, 100) for _ in range(count)] for cat in categories} |
| |
|
| | |
| | def create_word_cloud(text): |
| | stopwords = set(stopwords.words('english')) |
| | wordcloud = WordCloud(width=800, height=400, background_color='white', stopwords=stopwords).generate(text) |
| | |
| | fig, ax = plt.subplots(figsize=(10, 5)) |
| | ax.imshow(wordcloud, interpolation='bilinear') |
| | ax.axis('off') |
| | return fig |
| |
|
| | |
| | def create_excel_report(data): |
| | output = io.BytesIO() |
| | with pd.ExcelWriter(output, engine='xlsxwriter') as writer: |
| | for sheet_name, df in data.items(): |
| | df.to_excel(writer, sheet_name=sheet_name, index=False) |
| | output.seek(0) |
| | return output |
| |
|
| | |
| | def animated_progress_bar(): |
| | progress_bar = st.progress(0) |
| | status_text = st.empty() |
| | phrases = [ |
| | "Empowering youth with digital skills...", |
| | "Unlocking your potential...", |
| | "Building a brighter future...", |
| | "Connecting skills to opportunities...", |
| | "Transforming lives through technology..." |
| | ] |
| | for i in range(100): |
| | progress_bar.progress(i + 1) |
| | status_text.text(random.choice(phrases)) |
| | time.sleep(0.05) |
| | status_text.text("Ready to empower!") |
| | time.sleep(0.5) |
| | status_text.empty() |
| | progress_bar.empty() |
| |
|
| | |
| | st.markdown('<div class="header">Digital Skills and Employment Analytics Platform (DSEAP)</div>', unsafe_allow_html=True) |
| | st.markdown('<div class="subheader">Empowering Youth Through Data-Driven Insights</div>', unsafe_allow_html=True) |
| |
|
| | |
| | st.sidebar.title("Navigation") |
| | page = st.sidebar.radio("Go to", ["Home", "Skills Analysis", "Program Evaluation", "Barrier Identification", "Recommendations", "Reports"]) |
| |
|
| | if page == "Home": |
| | animated_progress_bar() |
| | col1, col2 = st.columns([2, 1]) |
| | with col1: |
| | st.markdown('<div class="section">', unsafe_allow_html=True) |
| | st.subheader("Welcome to DSEAP") |
| | st.write(""" |
| | The Digital Skills and Employment Analytics Platform (DSEAP) is an AI-driven tool designed to enhance |
| | the evaluation and improvement of digital empowerment programs in Kenya. Our platform provides comprehensive |
| | insights into the demand for digital skills, the effectiveness of existing programs, and the barriers faced |
| | by youth in accessing digital opportunities. **A study In cmputing and prgramming** |
| | """) |
| | st.markdown('</div>', unsafe_allow_html=True) |
| | with col2: |
| | st_lottie(lottie_analytics, height=300, key="analytics") |
| |
|
| | st.markdown('<div class="section">', unsafe_allow_html=True) |
| | st.subheader("Key Features") |
| | col1, col2, col3 = st.columns(3) |
| | with col1: |
| | st.markdown("### 📊 Skills Demand Analysis") |
| | st.write("Analyze job market trends and identify in-demand digital skills.") |
| | with col2: |
| | st.markdown("### 📈 Program Effectiveness") |
| | st.write("Evaluate the impact of digital empowerment programs on youth employment.") |
| | with col3: |
| | st.markdown("### 🚧 Barrier Identification") |
| | st.write("Identify and address obstacles to digital skill acquisition and employment.") |
| | st.markdown('</div>', unsafe_allow_html=True) |
| |
|
| | st.markdown('<div class="info-box">', unsafe_allow_html=True) |
| | st.info("📌 **Tip:** Use the sidebar to navigate through different sections of the platform.") |
| | st.markdown('</div>', unsafe_allow_html=True) |
| |
|
| | elif page == "Skills Analysis": |
| | animated_progress_bar() |
| | st.markdown('<div class="section">', unsafe_allow_html=True) |
| | st.subheader("Digital Skills Demand Analysis") |
| | |
| | col1, col2 = st.columns([3, 1]) |
| | with col1: |
| | skills = st.multiselect("Select skills to analyze:", |
| | ["Data Analysis", "Web Development", "Digital Marketing", "Cybersecurity", "Cloud Computing", "AI/Machine Learning", "Mobile App Development", "UI/UX Design"]) |
| | regions = st.multiselect("Select regions:", |
| | ["Kisii", "Nyamira", "Nairobi", "Mombasa", "Kisumu", "Nakuru", "Eldoret", "Thika", "Malindi", "Kitale"]) |
| | time_period = st.selectbox("Select time period:", ["Last 3 months", "Last 6 months", "Last year"]) |
| | with col2: |
| | st_lottie(lottie_skills, height=200, key="skills") |
| | |
| | if st.button("Analyze Skills Demand"): |
| | with st.spinner("Analyzing skills demand..."): |
| | |
| | demand_data = {skill: [random.randint(1, 100) for _ in regions] for skill in skills} |
| | |
| | |
| | df = pd.DataFrame(demand_data, index=regions) |
| | fig = px.bar(df, barmode='group', title="Digital Skills Demand by Region") |
| | st.plotly_chart(fig, use_container_width=True) |
| | |
| | |
| | ai_prompt = f"Briefly analyze the demand for {', '.join(skills)} in {', '.join(regions)} over the {time_period}. You can be negative on some skills too, just be free. Provide key insights on trends and gaps. Each region with its analysis and use percentages sometimes" |
| | try: |
| | with st.spinner("Generating AI insights..."): |
| | ai_insights = call_ai_model(ai_prompt) |
| | st.markdown("### AI Insights") |
| | st.write(ai_insights) |
| | except Exception as e: |
| | st.error(f"Failed to generate AI insights: {str(e)}") |
| | |
| | |
| | if st.checkbox("Generate Word Cloud"): |
| | word_cloud_text = " ".join(skills + regions + ai_insights.split()) |
| | st.markdown("### Skills Demand Word Cloud") |
| | st.pyplot(create_word_cloud(word_cloud_text)) |
| | |
| | |
| | st.markdown("### Skills Growth Projection") |
| | growth_data = {skill: [random.uniform(0, 15) for _ in range(2)] for skill in skills} |
| | years = [datetime.now().year, datetime.now().year + 5] |
| | df_growth = pd.DataFrame(growth_data, index=years) |
| | fig_growth = px.line(df_growth, title="Projected Skills Growth (5 Year Projection)") |
| | st.plotly_chart(fig_growth, use_container_width=True) |
| | |
| | st.markdown('</div>', unsafe_allow_html=True) |
| | |
| |
|
| |
|
| | elif page == "Program Evaluation": |
| | animated_progress_bar() |
| | st.markdown('<div class="section">', unsafe_allow_html=True) |
| | st.subheader("Digital Empowerment Program Evaluation") |
| | |
| | programs = st.multiselect("Select programs to evaluate:", |
| | ["Ajira Digital", "Remotasks", "Upwork", "Fiverr", "Andela", "Emobiles", "snaphub", "iBizAfrica"]) |
| | metrics = st.multiselect("Select evaluation metrics:", |
| | ["Employment Rate", "Income Increase", "Skill Proficiency", "Program Completion Rate", "Job Satisfaction", "Career Advancement"]) |
| | |
| | if st.button("Evaluate Programs"): |
| | with st.spinner("Evaluating programs..."): |
| | |
| | evaluation_data = generate_simulated_data(programs) |
| | |
| | |
| | df = pd.DataFrame(evaluation_data) |
| | fig = px.line(df, x=df.index, y=df.columns, labels={'index': 'Time (months)', 'value': 'Performance'}, title="Program Performance Over Time") |
| | fig.update_layout(legend_title_text='Programs') |
| | st.plotly_chart(fig) |
| | |
| | |
| | ai_prompt = f"Evaluate the effectiveness of {', '.join(programs)} based on {', '.join(metrics)}. Provide a detailed analysis of each program's performance, strengths, weaknesses, and recommendations for improvement." |
| | ai_insights = call_ai_model(ai_prompt) |
| | st.markdown("### AI-Powered Evaluation Insights") |
| | st.write(ai_insights) |
| | |
| | |
| | impact_data = {prog: random.uniform(0, 1) for prog in programs} |
| | fig = px.pie(values=list(impact_data.values()), names=list(impact_data.keys()), title="Program Impact Distribution") |
| | st.plotly_chart(fig) |
| | |
| | |
| | st.markdown("### Comparative Analysis") |
| | comp_data = pd.DataFrame({metric: [random.uniform(0, 100) for _ in programs] for metric in metrics}, index=programs) |
| | fig = px.imshow(comp_data, text_auto=True, aspect="auto", title="Program Performance Heatmap") |
| | st.plotly_chart(fig) |
| | |
| | st.markdown('</div>', unsafe_allow_html=True) |
| |
|
| | elif page == "Barrier Identification": |
| | animated_progress_bar() |
| | st.markdown('<div class="section">', unsafe_allow_html=True) |
| | st.subheader("Digital Skills Acquisition Barriers") |
| | |
| | barrier_categories = ["Access to Technology", "Digital Literacy", "Financial Constraints", "Cultural Factors", "Education System", "Gender Disparity", "Infrastructure", "Language Barriers"] |
| | selected_barriers = st.multiselect("Select barrier categories to analyze:", barrier_categories) |
| | |
| | if st.button("Identify Barriers"): |
| | with st.spinner("Analyzing barriers..."): |
| | |
| | barrier_data = generate_simulated_data(selected_barriers) |
| |
|
| | |
| | fig = go.Figure(data=[go.Scatterpolar( |
| | r=[max(barrier_data[cat]) for cat in selected_barriers], |
| | theta=selected_barriers, |
| | fill='toself' |
| | )]) |
| | fig.update_layout( |
| | polar=dict( |
| | radialaxis=dict(visible=True), |
| | ), |
| | showlegend=False |
| | ) |
| | fig.update_layout(title="Barrier Intensity Analysis") |
| | st.plotly_chart(fig) |
| | |
| | |
| | ai_prompt = f"with a precise answer, not so long and well structured for easy understanding. Analyze the barriers to digital skills acquisition in Kenya, focusing on {', '.join(selected_barriers)}. Provide a comprehensive breakdown of each barrier, its impact, and potential solutions." |
| | ai_insights = call_ai_model(ai_prompt) |
| | st.markdown("### AI-Generated Barrier Analysis") |
| | st.write(ai_insights) |
| | |
| | |
| | st.markdown("### Recommended Interventions") |
| | interventions = { |
| | "Access to Technology": "Implement mobile learning programs and community technology centers", |
| | "Digital Literacy": "Integrate digital skills into primary and secondary education curricula", |
| | "Financial Constraints": "Provide scholarships and low-interest loans for digital skills training", |
| | "Cultural Factors": "Develop culturally sensitive training materials and awareness campaigns", |
| | "Education System": "Partner with local schools for early digital education integration", |
| | "Gender Disparity": "Create women-focused digital skills programs and mentorship opportunities", |
| | "Infrastructure": "Invest in rural broadband expansion and solar-powered internet kiosks", |
| | "Language Barriers": "Develop multilingual digital learning resources and interfaces" |
| | } |
| | for barrier in selected_barriers: |
| | st.write(f"- **{barrier}:** {interventions.get(barrier, 'Customized intervention based on specific barrier characteristics')}") |
| | |
| | |
| | st.markdown("### Projected Barrier Impact Over Time") |
| | years = [datetime.now().year + i for i in range(5)] |
| | impact_data = {barrier: [random.uniform(0, 100) for _ in range(5)] for barrier in selected_barriers} |
| | fig = go.Figure() |
| | for barrier, impact in impact_data.items(): |
| | fig.add_trace(go.Scatter(x=years, y=impact, mode='lines+markers', name=barrier)) |
| | fig.update_layout(title="Projected Barrier Impact (Next 5 Years)", xaxis_title="Year", yaxis_title="Impact Score") |
| | st.plotly_chart(fig) |
| | |
| | st.markdown('</div>', unsafe_allow_html=True) |
| |
|
| | elif page == "Recommendations": |
| | animated_progress_bar() |
| | st.markdown('<div class="section">', unsafe_allow_html=True) |
| | st.subheader("Personalized Recommendations") |
| | |
| | |
| | st.write("Enter your profile information to receive personalized recommendations:") |
| | age = st.slider("Age", 15, 35, 25) |
| | education = st.selectbox("Highest Education Level", ["High School", "Diploma", "Bachelor's", "Master's", "PhD"]) |
| | current_skills = st.multiselect("Current Digital Skills", |
| | ["Basic Computer Use", "Office Software", "Web Browsing", "Social Media", |
| | "Programming", "Data Analysis", "Graphic Design", "Digital Marketing"]) |
| | career_goal = st.text_input("Career Goal") |
| | location = st.selectbox("Current Location", ["Nairobi", "Mombasa", "Kisumu", "Nakuru", "Eldoret", "Kisii", "Nyamira"]) |
| | |
| | if st.button("Get Recommendations"): |
| | with st.spinner("Generating personalized recommendations..."): |
| | |
| | ai_prompt = f"""Generate personalized digital skills recommendations for a {age}-year-old with {education} education, |
| | skills in {', '.join(current_skills)}, located in {location}, aiming for a career in {career_goal}. |
| | Provide a detailed learning path, skill priorities, job market insights, and potential challenges to overcome. Well structured for easy understanding""" |
| | recommendations = call_ai_model(ai_prompt) |
| | |
| | st.markdown("### Your Personalized Digital Skills Roadmap") |
| | st.write(recommendations) |
| | |
| | |
| | st.markdown("### Skill Gap Analysis") |
| | all_skills = ["Data Analysis", "Web Development", "Digital Marketing", "Cybersecurity", "Cloud Computing", |
| | "AI/Machine Learning", "Mobile App Development", "UI/UX Design"] |
| | skill_gaps = [skill for skill in all_skills if skill not in current_skills] |
| | gap_scores = [random.randint(1, 100) for _ in skill_gaps] |
| | fig = go.Figure(go.Bar( |
| | x=skill_gaps, |
| | y=gap_scores, |
| | marker_color=['#1e3799', '#4a69bd', '#6a89cc', '#54a0ff', '#48dbfb'] |
| | )) |
| | fig.update_layout(title="Skill Gap Analysis", xaxis_title="Skills", yaxis_title="Proficiency Gap") |
| | st.plotly_chart(fig) |
| | |
| | |
| | st.markdown("### Job Market Alignment") |
| | job_matches = ["Data Analyst", "Digital Marketing Specialist", "Front-end Developer", "UX Researcher", "Cybersecurity Analyst"] |
| | match_scores = [random.uniform(0.5, 1) for _ in job_matches] |
| | fig = px.bar(x=job_matches, y=match_scores, labels={'x': 'Job Titles', 'y': 'Match Score'}, title="Top Job Matches") |
| | st.plotly_chart(fig) |
| | |
| | |
| | st.markdown("### Recommended Learning Resources") |
| | resources = [ |
| | {"name": "Coursera", "type": "Online Courses", "link": "https://www.coursera.org/"}, |
| | {"name": "edX", "type": "Online Courses", "link": "https://www.edx.org/"}, |
| | {"name": "Udacity", "type": "Nanodegree Programs", "link": "https://www.udacity.com/"}, |
| | {"name": "FreeCodeCamp", "type": "Coding Tutorials", "link": "https://www.freecodecamp.org/"}, |
| | {"name": "Codecademy", "type": "Interactive Coding Lessons", "link": "https://www.codecademy.com/"} |
| | ] |
| | for resource in resources: |
| | st.write(f"- [{resource['name']}]({resource['link']}) - {resource['type']}") |
| | |
| | st.markdown('</div>', unsafe_allow_html=True) |
| |
|
| | elif page == "Reports": |
| | animated_progress_bar() |
| | st.markdown('<div class="section">', unsafe_allow_html=True) |
| | st.subheader("Generate Custom Reports") |
| | |
| | report_type = st.selectbox("Select Report Type", ["Skills Demand", "Program Effectiveness", "Barrier Analysis"]) |
| | date_range = st.date_input("Select Date Range", [datetime.now() - timedelta(days=30), datetime.now()]) |
| | |
| | if st.button("Generate Report"): |
| | with st.spinner("Generating report..."): |
| | |
| | if report_type == "Skills Demand": |
| | skills = ["Data Analysis", "Web Development", "Digital Marketing", "Cybersecurity", "Cloud Computing"] |
| | demand_data = pd.DataFrame({ |
| | "Skill": skills, |
| | "Demand Score": [random.randint(50, 100) for _ in skills], |
| | "Growth Rate": [random.uniform(0.5, 15) for _ in skills] |
| | }) |
| | |
| | st.markdown("### Skills Demand Report") |
| | st.dataframe(demand_data) |
| | |
| | fig = px.scatter(demand_data, x="Demand Score", y="Growth Rate", size="Demand Score", |
| | color="Skill", hover_name="Skill", size_max=60) |
| | fig.update_layout(title="Skills Demand vs Growth Rate") |
| | st.plotly_chart(fig) |
| | |
| | elif report_type == "Program Effectiveness": |
| | programs = ["Ajira Digital", "DigiTruck", "eMobilis", "KamiLimu", "Andela"] |
| | metrics = ["Employment Rate", "Income Increase", "Skill Proficiency", "Program Completion Rate"] |
| | effectiveness_data = pd.DataFrame({ |
| | metric: [random.uniform(60, 95) for _ in programs] for metric in metrics |
| | }, index=programs) |
| | |
| | st.markdown("### Program Effectiveness Report") |
| | st.dataframe(effectiveness_data) |
| | |
| | fig = px.imshow(effectiveness_data, text_auto=True, aspect="auto", |
| | title="Program Effectiveness Heatmap") |
| | st.plotly_chart(fig) |
| | |
| | elif report_type == "Barrier Analysis": |
| | barriers = ["Access to Technology", "Digital Literacy", "Financial Constraints", "Cultural Factors"] |
| | impact_data = pd.DataFrame({ |
| | "Barrier": barriers, |
| | "Impact Score": [random.uniform(3, 9) for _ in barriers], |
| | "Affected Population (%)": [random.uniform(10, 50) for _ in barriers] |
| | }) |
| | |
| | st.markdown("### Barrier Analysis Report") |
| | st.dataframe(impact_data) |
| | |
| | fig = px.bar(impact_data, x="Barrier", y="Impact Score", color="Affected Population (%)", |
| | title="Barrier Impact Analysis") |
| | st.plotly_chart(fig) |
| | |
| | |
| | excel_data = { |
| | "Report": pd.DataFrame({"Report Type": [report_type], "Date Range": [f"{date_range[0]} to {date_range[1]}"]}) |
| | } |
| | if report_type == "Skills Demand": |
| | excel_data["Skills Demand"] = demand_data |
| | elif report_type == "Program Effectiveness": |
| | excel_data["Program Effectiveness"] = effectiveness_data |
| | elif report_type == "Barrier Analysis": |
| | excel_data["Barrier Analysis"] = impact_data |
| | |
| | excel_report = create_excel_report(excel_data) |
| | st.download_button( |
| | label="Download Excel Report", |
| | data=excel_report, |
| | file_name=f"DSEAP_{report_type}_Report_{date_range[0]}_{date_range[1]}.xlsx", |
| | mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" |
| | ) |
| | |
| | st.markdown('</div>', unsafe_allow_html=True) |
| |
|
| | |
| | st.markdown('<div class="footer">© 2024 Digital Skills and Employment Analytics Platform (DSEAP) </div>', unsafe_allow_html=True) |
| |
|
| | |
| | st.markdown('<div class="warning-box">', unsafe_allow_html=True) |
| | st.warning("**Note:** This is a prototype version Developed by Teresa Abuya, COD SIST") |
| | st.markdown('</div>', unsafe_allow_html=True) |