bano1's picture
Update app.py
4240ebc verified
Raw
History Blame Contribute Delete
2.99 kB
import streamlit as st
import pandas as pd
import os
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from utils.summarizer import summarize_genes
from utils.ml_model import train_model, get_top_biomarkers
from utils.preprocess import normalize_counts
st.title("🧬 ML-based Biomarker Discovery from RNA-seq")
uploaded_file = st.file_uploader(
"Upload RNA-seq CSV file",
type=["csv"]
)
if uploaded_file:
df = pd.read_csv(uploaded_file)
st.write("### Dataset Preview")
st.dataframe(df.head())
if "type" not in df.columns:
st.error(
"Dataset must contain 'type' column with labels"
)
else:
# ----------------------------
# Separate labels
# ----------------------------
labels = df["type"].tolist()
counts = df.drop(columns=["type"])
# ----------------------------
# Normalize RNA counts
# ----------------------------
normalized = normalize_counts(
counts
)
st.write("### Normalized Data")
st.dataframe(normalized.head())
# ----------------------------
# Train ML Model
# ----------------------------
model, feature_importance = train_model(
normalized,
labels
)
st.write("### Top Biomarker Genes")
top_genes = get_top_biomarkers(
feature_importance,
top_n=20
)
st.dataframe(top_genes)
# ----------------------------
# PCA Visualization
# ----------------------------
X = normalized.T
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
pca = PCA(
n_components=2
)
X_pca = pca.fit_transform(
X_scaled
)
pca_df = pd.DataFrame(
X_pca,
columns=[
"PC1",
"PC2"
]
)
pca_df["label"] = labels
st.write("### PCA Plot")
st.scatter_chart(
pca_df,
x="PC1",
y="PC2",
color="label"
)
# ----------------------------
# Groq Gene Explanation
# ----------------------------
groq_api_key = os.environ.get(
"GROQ_API_KEY"
)
if groq_api_key:
summaries = summarize_genes(
top_genes["Gene"].tolist(),
groq_api_key
)
st.write(
"### AI Biomarker Explanation"
)
for gene, summary in summaries.items():
st.markdown(
f"**{gene}**: {summary}"
)
else:
st.warning(
"Groq API key not found"
)