import streamlit as st
import json
import pandas as pd
import streamlit.components.v1 as components
# Initialize session state for tracking the last clicked row
if 'last_clicked_row' not in st.session_state:
st.session_state['last_clicked_row'] = None
# Function to load JSONL file into a DataFrame
def load_jsonl(file_path):
data = []
with open(file_path, 'r') as f:
for line in f:
data.append(json.loads(line))
return pd.DataFrame(data)
# Function to filter DataFrame by keyword
def filter_by_keyword(df, keyword):
return df[df.apply(lambda row: row.astype(str).str.contains(keyword).any(), axis=1)]
# Function to generate HTML with textarea
def generate_html_with_textarea(text_to_speak):
return f'''
Read It Aloud
π Read It Aloud
'''
# Streamlit App π
st.title("2πMedπ‘Speech")
# Dropdown for file selection
file_option = st.selectbox("Select file:", ["usmle_16.2MB.jsonl", "usmle_2.08MB.jsonl"])
st.write(f"You selected: {file_option}")
# Load data
large_data = load_jsonl("usmle_16.2MB.jsonl")
small_data = load_jsonl("usmle_2.08MB.jsonl")
data = large_data if file_option == "usmle_16.2MB.jsonl" else small_data
# Top 20 healthcare terms for USMLE
top_20_terms = ['Melanoma', 'carcinoma','Constipation', 'Colon', 'Muscle', 'Rehabilitation', 'Heart', 'Lung', 'Pain', 'Memory', 'Kidney', 'Diabetes', 'Cancer', 'Infection', 'Virus', 'Bacteria', 'Gastrointestinal', 'Skin', 'Blood', 'Surgery']
# Create Expander and Columns UI for terms
with st.expander("Search by Common Terms π"):
cols = st.columns(4)
for term in top_20_terms:
with cols[top_20_terms.index(term) % 4]:
if st.button(f"{term}"):
filtered_data = filter_by_keyword(data, term)
st.write(f"Filter on '{term}' π")
with st.sidebar:
st.dataframe(filtered_data)
if not filtered_data.empty:
html_blocks = []
for idx, row in filtered_data.iterrows():
# Extracting fields from the row
question_number = idx + 1 # Assuming idx represents the question number
question = row.get("question", "No question field")
answer = row.get("answer", "No answer field")
options = row.get("options", {})
# Formatting options dictionary into a string
options_text = "".join([f"{key}: {value}" for key, value in options.items()])
# Concatenating with labels
question_text = (f"QuestionNumber: {question_number}\r\n"
f"Question: {question}\r\n"
f"Options: {options_text}\r\n"
f"Answer: {answer}")
# Generating HTML content
documentHTML5 = generate_html_with_textarea(question_text)
html_blocks.append(documentHTML5)
all_html = ''.join(html_blocks)
components.html(all_html, width=1280, height=1024)
# Text input for search keyword
search_keyword = st.text_input("Or, enter a keyword to filter data:")
if st.button("Search π΅οΈββοΈ"):
filtered_data = filter_by_keyword(data, search_keyword)
st.write(f"Filtered Dataset by '{search_keyword}' π")
st.dataframe(filtered_data)
if not filtered_data.empty:
html_blocks = []
for idx, row in filtered_data.iterrows():
question_text = row.get("question", "No question field")
documentHTML5 = generate_html_with_textarea(question_text)
html_blocks.append(documentHTML5)
all_html = ''.join(html_blocks)
components.html(all_html, width=1280, height=1024)
# Inject HTML5 and JavaScript for styling
st.markdown("""
""", unsafe_allow_html=True)
# Markdown and emojis for the case presentation
st.markdown("# π₯ Case Study: 32-year-old Woman's Wellness Check")
st.markdown("## π Patient Information")
st.markdown("""
- **Age**: 32
- **Gender**: Female
- **Past Medical History**: Asthma, Hypertension, Anxiety
- **Current Medications**: Albuterol, Fluticasone, Hydrochlorothiazide, Lisinopril, Fexofenadine
- **Vitals**
- **Temperature**: 99.5Β°F (37.5Β°C)
- **Blood Pressure**: 165/95 mmHg
- **Pulse**: 70/min
- **Respirations**: 15/min
- **Oxygen Saturation**: 98% on room air
""")
# Clinical Findings
st.markdown("## π Clinical Findings")
st.markdown("""
- Cardiac exam reveals a S1 and S2 heart sound with a normal rate.
- Pulmonary exam is clear to auscultation bilaterally with good air movement.
- Abdominal exam reveals a bruit, normoactive bowel sounds, and an audible borborygmus.
- Neurological exam reveals cranial nerves II-XII as grossly intact with normal strength and reflexes in the upper and lower extremities.
""")
# Next Step Options
st.markdown("## π€ What is the best next step in management?")
# Multiple Choice
options = ["Blood Test", "MRI Scan", "Ultrasound with Doppler", "Immediate Surgery"]
choice = st.selectbox("", options)
# Explanation
if st.button("Submit"):
if choice == "Ultrasound with Doppler":
st.success("Correct! π")
st.markdown("""
### Explanation
The patient's high blood pressure coupled with an abdominal bruit suggests the possibility of renal artery stenosis.
An **Ultrasound with Doppler** is the best next step for assessing blood flow and evaluating for renal artery stenosis.
""")
else:
st.error("Incorrect. π")
st.markdown("""
The best next step is **Ultrasound with Doppler**.
""")