|
|
import streamlit as st |
|
|
import pandas as pd |
|
|
import time |
|
|
from scholarly import scholarly |
|
|
import plotly.express as px |
|
|
|
|
|
|
|
|
st.set_page_config( |
|
|
page_title="Automatic Faculty Research & Publication Inspector", |
|
|
layout="wide", |
|
|
initial_sidebar_state="expanded" |
|
|
) |
|
|
|
|
|
|
|
|
SCOPUS_PUBLISHERS = ["Elsevier", "Springer", "IEEE", "Wiley", "Taylor & Francis", "SAGE"] |
|
|
|
|
|
|
|
|
dark_theme_css = """ |
|
|
<style> |
|
|
body { |
|
|
background-color: #121212; |
|
|
color: #E0E0E0; |
|
|
} |
|
|
h1, h2, h3, h4, h5, h6 { |
|
|
color: #BB86FC; |
|
|
} |
|
|
.stApp { |
|
|
background-color: #121212; |
|
|
color: #E0E0E0; |
|
|
} |
|
|
.stMetric { |
|
|
background-color: #1F1B24; |
|
|
border: 1px solid #BB86FC; |
|
|
border-radius: 8px; |
|
|
padding: 10px; |
|
|
color: #E0E0E0; |
|
|
box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.5); |
|
|
} |
|
|
.stButton > button { |
|
|
background-color: #BB86FC; |
|
|
color: #121212; |
|
|
border: none; |
|
|
border-radius: 8px; |
|
|
padding: 10px 20px; |
|
|
cursor: pointer; |
|
|
transition: transform 0.2s ease; |
|
|
} |
|
|
.stButton > button:hover { |
|
|
transform: scale(1.1); |
|
|
background-color: #3700B3; |
|
|
} |
|
|
.stDataFrame { |
|
|
background-color: #1F1B24; |
|
|
border: 1px solid #BB86FC; |
|
|
border-radius: 8px; |
|
|
color: #E0E0E0; |
|
|
} |
|
|
.stMarkdown { |
|
|
color: #E0E0E0; |
|
|
} |
|
|
</style> |
|
|
""" |
|
|
|
|
|
|
|
|
st.markdown(dark_theme_css, unsafe_allow_html=True) |
|
|
|
|
|
|
|
|
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)} |
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
st.title("π **Automatic Faculty Research & Publication Inspector**") |
|
|
st.markdown("---") |
|
|
|
|
|
|
|
|
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: |
|
|
|
|
|
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"]) |
|
|
|
|
|
|
|
|
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")) |
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
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.") |
|
|
|