import streamlit as st import pandas as pd import time from scholarly import scholarly import plotly.express as px # Set layout to wide st.set_page_config( page_title="Automatic Faculty Research & Publication Inspector", layout="wide", initial_sidebar_state="expanded" ) # Known Scopus publishers or identifiers SCOPUS_PUBLISHERS = ["Elsevier", "Springer", "IEEE", "Wiley", "Taylor & Francis", "SAGE"] # CSS for dark theme styling dark_theme_css = """ """ # Apply the CSS st.markdown(dark_theme_css, unsafe_allow_html=True) # Function to classify publications def classify_publications(publications): scopus_count, non_scopus_count, ieee_count, springer_count, patent_count = 0, 0, 0, 0, 0 yearly_publications = {year: 0 for year in range(2019, 2025)} # Years 2019–2024 for pub in publications: try: pub_details = scholarly.fill(pub) time.sleep(1) source = pub_details.get("bib", {}).get("source", "").lower() publisher = pub_details.get("bib", {}).get("publisher", "").lower() title = pub_details.get("bib", {}).get("title", "").lower() pub_year = pub_details.get("bib", {}).get("pub_year", None) if pub_year in yearly_publications: yearly_publications[pub_year] += 1 if "ieee" in source or "ieee" in publisher: ieee_count += 1 if "springer" in source or "springer" in publisher: springer_count += 1 if any(publisher_keyword.lower() in publisher for publisher_keyword in SCOPUS_PUBLISHERS): scopus_count += 1 elif "journal" in source or "conference" in source: scopus_count += 1 else: non_scopus_count += 1 if "patent" in title: patent_count += 1 except Exception as e: st.warning(f"Skipping publication due to error: {e}") return scopus_count, non_scopus_count, ieee_count, springer_count, patent_count, yearly_publications # Function to extract scholar data def extract_scholar_data_by_name(scholar_name): try: search_results = scholarly.search_author(scholar_name) scholar_data = None for result in search_results: scholar_data = scholarly.fill(result) time.sleep(1) break if not scholar_data: return None metrics = scholar_data.get("cites_per_year", {}) area_of_interest = scholar_data.get("interests", []) h_index = scholar_data.get("hindex", 0) i10_index = scholar_data.get("i10index", 0) scopus_pubs, non_scopus_pubs, ieee_pubs, springer_pubs, patent_count, yearly_publications = classify_publications( scholar_data.get("publications", []) ) return { "Scholar Name": scholar_data.get("name", "N/A"), "Citations": sum(metrics.values()), "h-index": h_index, "i10-index": i10_index, "Citation Impact": round(sum(metrics.values()) / len(metrics), 2) if metrics else 0, "Publications": yearly_publications, "Metrics": metrics, "Area of Interest": area_of_interest, "Scopus Publications": scopus_pubs, "Non-Scopus Publications": non_scopus_pubs, "IEEE Publications": ieee_pubs, "Springer Publications": springer_pubs, "Patents": patent_count, "Publications Data": scholar_data.get("publications", []), } except Exception as e: st.error(f"Error occurred: {e}") return None # Streamlit App st.title("🔍 **Automatic Faculty Research & Publication Inspector**") st.markdown("---") # Input field for faculty name st.subheader("**Input Faculty Name**") scholar_name = st.text_input("Enter Faculty Name:") if st.button("Fetch Data"): if scholar_name: st.info("Fetching data... Please wait.") scholar_data = extract_scholar_data_by_name(scholar_name) if scholar_data: # Display Key Metrics st.markdown("### **📊 Key Metrics**") col1, col2, col3, col4 = st.columns(4) col1.metric("📌 Total Citations", scholar_data["Citations"]) col2.metric("📌 h-index", scholar_data["h-index"]) col3.metric("📌 i10-index", scholar_data["i10-index"]) col4.metric("📌 Citation Impact", scholar_data["Citation Impact"]) # Display Trends st.markdown("### **📈 Trends**") trend_col1, trend_col2 = st.columns(2) with trend_col1: st.markdown("**Citations Over the Years**") citation_trend = pd.DataFrame(scholar_data["Metrics"].items(), columns=["Year", "Citations"]) st.bar_chart(citation_trend.set_index("Year")) with trend_col2: st.markdown("**Publications Over the Years**") publication_trend = pd.DataFrame(scholar_data["Publications"].items(), columns=["Year", "Publications"]) st.bar_chart(publication_trend.set_index("Year")) # Scholar Detailed Metrics st.markdown("### **📋 Scholar Metrics**") scholar_details_df = pd.DataFrame([{ "Scholar Name": scholar_data["Scholar Name"], "Total Citations": scholar_data["Citations"], "h-index": scholar_data["h-index"], "i10-index": scholar_data["i10-index"], "Citation Impact": scholar_data["Citation Impact"], "Scopus Publications": scholar_data["Scopus Publications"], "Non-Scopus Publications": scholar_data["Non-Scopus Publications"], "IEEE Publications": scholar_data["IEEE Publications"], "Springer Publications": scholar_data["Springer Publications"], "Patents": scholar_data["Patents"], }]) st.dataframe(scholar_details_df) # Area of Interest & Pie Charts st.markdown("### **📌 Insights**") left, middle, right = st.columns([1, 1.5, 1.5]) with left: st.markdown("**Areas of Interest**") if scholar_data["Area of Interest"]: for interest in scholar_data["Area of Interest"]: st.button(interest) else: st.info("No areas of interest available.") with middle: st.markdown("**Scopus vs Non-Scopus Publications**") scopus_data = { "Type": ["Scopus", "Non-Scopus"], "Count": [scholar_data["Scopus Publications"], scholar_data["Non-Scopus Publications"]], } fig1 = px.pie(scopus_data, names="Type", values="Count", title="Scopus vs Non-Scopus") st.plotly_chart(fig1) with right: st.markdown("**IEEE vs Springer Publications**") ieee_data = { "Type": ["IEEE", "Springer"], "Count": [scholar_data["IEEE Publications"], scholar_data["Springer Publications"]], } fig2 = px.pie(ieee_data, names="Type", values="Count", title="IEEE vs Springer") st.plotly_chart(fig2) # Display Publications Table st.markdown("### **📚 Publications**") pub_data = [] for pub in scholar_data["Publications Data"][:5]: pub_details = scholarly.fill(pub) pub_data.append({ "Publication": pub_details.get("bib", {}).get("title", "N/A"), "Citations": pub_details.get("num_citations", 0), "Year": pub_details.get("bib", {}).get("pub_year", "N/A"), }) time.sleep(1) if pub_data: pub_df = pd.DataFrame(pub_data) st.dataframe(pub_df) st.download_button( label="Download Publications Data as CSV", data=pub_df.to_csv(index=False), file_name="publications.csv", mime="text/csv", ) else: st.warning("No data found for the provided faculty name.") else: st.error("Please enter a valid faculty name.")