CoolFace
Apppublic

Zully90/pca-pls-analysis

sourceHugging Faceupdated 1mo agoView on Hugging Face
0likes
App README

🧪 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:

  1. 1.📊 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.
  2. 2.📈 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 uv

Export 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:

bash
uv sync
uv run streamlit run streamlit_app.py

Oppure con un virtualenv standard:

bash
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
streamlit run streamlit_app.py

L'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.