Zully90/pca-pls-analysis
🧪 Chemo Suite — PCA + PLS
Applicazione Streamlit per l'analisi chemiometrica di spettri FT-IR / NIR. Riunisce in un'unica GUI multipagina i due step della pipeline:
- 📊 PCA + Outlier detection — preprocessing (SNV, derivate, mean-centering), PCA con Hotelling T² e Q-residuals per la novelty detection, esclusione campioni e predizione su nuovi spettri.
- 📈 Regressione PLS — cross-validation per il numero di componenti, validazione delle assunzioni, metriche (R², RMSE, RPD…), VIP scores, interpretazione delle componenti e diagnostica dei coefficienti.
Le due pagine condividono lo stato (st.session_state): il dataset ripulito nella pagina PCA è subito disponibile per la regressione PLS.
Caso d'uso d'esempio incluso: spettri FT-IR di vino per la predizione del contenuto di alcol (data/Dataset vino - Alcol.xlsx).App online
🔗 https://huggingface.co/spaces/Zully90/pca-pls-analysis
L'interfaccia Streamlit è protetta da login email+password (chemo/auth.py, se sono configurate credenziali). Nota: se lo Space è pubblico, i file presenti nel repository (es. data/) restano visibili/scaricabili su Hugging Face: non includere dati sensibili oppure rendi lo Space privato.
Struttura del progetto
streamlit_app.py # home / entry point multipagina
pages/
1_PCA_Outlier_Detection.py # GUI PCA + T²/Q + export bundle standalone
2_PLS_Regression.py # GUI regressione PLS + export bundle standalone
chemo/ # libreria chemiometrica
auth.py # login gate email+password condiviso tra le pagine
io.py # caricamento dataset (CSV/Excel, autodetect colonne)
preprocessing.py # SNV, derivate, mean-center, pipeline
pipeline.py # dataset attivo condiviso PCA→PLS (esclusioni + preprocessing)
pca_model.py # PCA + T²/Q + contributi
pca_outlier.py # PCA outlier detection (versione script/notebook)
pca_export.py # export standalone del modello PCA (.pkl + predict_pca.py)
plots.py # grafici PCA (Plotly)
state.py # helper su session_state
pls/ # motore PLS
analysis.py # orchestrazione analisi PLS completa
diagnostics.py # VIP, significatività, interpretazione
plots.py # grafici PLS (matplotlib/seaborn)
plotly_plots.py # grafici PLS in Plotly (stile pagina PCA)
metrics.py # metriche di performance, outlier/influence
assumptions.py # test sulle assunzioni (normalità, omoschedasticità…)
export.py # export standalone del modello PLS (.pkl + predict.py)
semaforo_compat.py # preprocessing condiviso con la repo steroglass-semaforo
data/ # dataset di esempio + nuovi campioni
notebooks/ # notebook esplorativo
requirements.txt # dipendenze per il deploy
pyproject.toml / uv.lock # ambiente locale gestito con uvExport dei modelli (standalone)
Sia la pagina PCA che la pagina PLS permettono di scaricare un bundle .pkl + script di predizione (predict_pca.py / predict.py) che funziona senza il pacchetto chemo (solo numpy/scikit-learn/joblib, + scipy se si usa Savitzky-Golay). Il bundle PCA è inoltre compatibile con il preprocessing condiviso in semaforo_compat.py, usato dalla repo steroglass-semaforo per caricare il modello ed eseguire la novelty detection (T²/Q) in produzione.
Esecuzione in locale
Con uv:
uv sync
uv run streamlit run streamlit_app.pyOppure con un virtualenv standard:
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
streamlit run streamlit_app.pyL'app sarà su http://localhost:8501.
Deploy (Hugging Face Spaces)
Lo Space (Zully90/pca-pls-analysis, SDK docker, porta 7860, pubblico) si aggiorna automaticamente ad ogni push su main tramite la GitHub Action .github/workflows/deploy-hf.yml (huggingface_hub.upload_folder, serve il secret HF_TOKEN con permessi write su HF). L'app gira via Dockerfile, non tramite l'SDK Streamlit nativo di HF (non più accettato in creazione via API); l'accesso è comunque protetto dal login interno email+password, non dalla visibilità dello Space.
Per ricreare da zero: crea lo Space su https://huggingface.co/new-space → SDK Docker (o lascia che lo crei la action stessa, che lo fa solo se non esiste già), aggiungi il secret HF_TOKEN nel repo GitHub, poi push su main.
In alternativa il repo funziona anche su Streamlit Community Cloud (Main file path: streamlit_app.py), senza passare dal Dockerfile.