SciTrends / main.py
hadasak's picture
Update main.py
4fc596d
import gradio as gr
import numpy as np
import pandas as pd
from save_prediction import save_data_with_prediction
import datetime
import plotly.express as px
# global variables
data = pd.DataFrame()
last_term = ""
terms = []
shared_output = None
def create_plot(data):
today = datetime.date.today()
year = today.year - 1
fig = px.scatter(data, x='Year', y='norm_publications_count', color='Term',
title='Scatter Plot with Color and Symbols')
fig.update_layout(
title="Outbreak in ",
xaxis_title="year",
yaxis_title="normalized publication count",
)
# Add a horizontal line at y=15
fig.add_shape(type="line", x0=year + 0.5, x1=year + 0.5, y0=0, y1=data['norm_publications_count'].max(),
line=dict(color="blue", width=2, dash="dot"))
return fig
def add_term_to_plot(custom_term,choice):
global shared_output
global last_term
global terms
global data # Indicate that you want to work with the global 'data' variable
term=""
print("choice")
print(choice)
print("last_term")
print(terms)
if not custom_term or custom_term in terms:
if not choice:
#raise gr.Error("You didn't insert new term")
return create_plot(data)
if choice in terms:
#raise gr.Error("Your choice is already in the graph")
return create_plot(data)
else:
term = choice
print ("term is choice "+term)
elif not choice or choice in terms:
if custom_term in terms:
#raise gr.Error("The term you inserted is already in the graph")
return create_plot(data)
else:
term = custom_term
print ("term is custom_term "+term)
#if both new
if not term:
#raise gr.Error("you inserted new terms in both options, the custom term is shown")
term = custom_term
print(term)
if len(terms)>10:
#raise gr.Error("The maximum terms number is 10")
return create_plot(data)
else:
last_term = term
terms = terms+[term]
(print(terms))
# get year
today = datetime.date.today()
year = today.year - 1
no_space_term = term.replace(" ", "_")
print(no_space_term)
path = "model_data/data_with_predictions_" + no_space_term + str(year) + ".csv"
try:
save_data_with_prediction(no_space_term)
except:
raise gr.Error("There is no data about your term in Pubmed. "
"Please enter another term and the trend graph will be displayed")
new_term_df = pd.read_csv(path)
data = pd.concat([data, new_term_df], ignore_index=True) # Concatenate DataFrames
data = data[data['Year'] >= (year-40)]
fig = create_plot(data)
shared_output = fig
# update_choice2.update()
return fig
def delete_term(term):
global shared_output
global terms
global data
if term in terms:
terms.remove(term)
data = data[data["Term"] != term]
fig = create_plot(data)
shared_output = fig
return fig
else:
raise gr.Error(term + " is not exist in the graph!")
def clear_all():
global shared_output
global terms
global data
if len(terms) > 0:
terms = []
data = pd.DataFrame(columns=["Term","Year","norm_publications_count","Data"])
fig = create_plot(data)
shared_output = fig
return fig
else:
raise gr.Error("The trends graph is already empty")
return None
predefined_terms = [(term, term) for term in np.unique(pd.read_csv("training_data_all.csv")["Term"].to_numpy())]
description= "Welcome to the predictor of trends in science!\n\n\n" \
"This tool predicts the popularity of fields in science for the next 6 years.\n" \
"Get predictions of scientific popularity for any term!\n"\
"Up to 10 terms can be inserted into the same graph.\n\n" \
"Popularity of a term is defined as the number of publications in PubMed per year for this term, \n" \
"normalized to 100, 000 publications..\n\n"\
"For details of the model and methodology see our paper. If you use us, please cite us!:\n"\
"Ofer D, Kaufman H, Linial, M. Whats next? Forecasting scientific research trends. Helyion (Dec 2023).\n Available from:\n"\
"https://doi.org/10.1016/j.heliyon.2023.e23781\n\n"\
"contact us at:\n"\
"Hadasa.kaufman@mail.huji.ac.il\n\n\n"\
"Developed by Hadasa Kaufman & Dan Ofer"
with gr.Blocks() as demo:
# Create a Row component to divide the interface into two columns
with gr.Row():
# Create a Column for the left side (description)
with gr.Column():
gr.Image("logo_SciTrends.png")
gr.Text(description,label="App Description")
# Create a Column for the right side (input components and plot)
with gr.Column():
favicon="logo_SciTrends.png" # Specify the path to your logo image
txt1 = gr.components.Textbox(label="Insert a term")
choice1 = gr.components.Dropdown(label="or choose an example term", choices=predefined_terms)
btn = gr.Button(value="Submit")
out1 = gr.Plot(label="plot")
btn.click(add_term_to_plot, inputs=[txt1, choice1], outputs=out1 )
remove_term = gr.components.Textbox(label="Insert a term to remove")
btn = gr.Button(value="Remove term")
btn.click(delete_term, inputs=remove_term, outputs=out1)
btn = gr.Button(value="clear all")
btn.click(clear_all, outputs=out1)
live = True
if __name__ == "__main__":
demo.launch(share=True)