Vai al contenuto

Sanità e ricerca clinicaBI, AI e ML per l'azienda

Parametri vitali: dal rumore all'episodio

I monitor del reparto registrano saturazione, battito e respiro ogni pochi secondi, insieme a molti allarmi che non sono episodi veri. In Muvia una funzione Python toglie il rumore letto per letto, l'Analisi sovrappone le desaturazioni vere e il personale annota sul grafico cosa è successo.

Scenario illustrativo: descrive un caso tipo, non il progetto di un cliente.

Un monitor che suona troppo spesso smette di essere ascoltato.

Un sensore che si sposta, un paziente che si gira, un dito freddo: molti allarmi di saturazione non sono desaturazioni vere. Il personale lo sa, ma rivedere a posteriori le notti di un reparto, letto per letto, sui dati grezzi è quasi impossibile.

Ripulire i segnali in modo dichiarato e sempre uguale, e mettere gli episodi veri uno sopra l'altro, permette di capire quante cadute sono reali, quando accadono e cosa cambia dopo un intervento. Muvia non sostituisce il monitor né i suoi allarmi: lavora sui dati esportati, per la revisione.

Per chi
Coordinatori infermieristici e direttori di reparto, rischio clinico, ingegneria clinica e ricercatori.
Le esportazioni della centrale di monitoraggio via SFTP, letti e degenze da un database Oracle e le soglie del reparto in Excel entrano in Muvia, dove una funzione del team toglie il rumore dai segnali; escono i segnali puliti, l'Analisi delle desaturazioni con le note del reparto e un notebook per la revisione.

In Muvia, passo per passo

Schermate vere del prodotto, registrate su un progetto con dati di esempio.

1 di 5

Il video · I monitor del reparto registrano saturazione, battito e respiro ogni pochi secondi, insieme a molti allarmi che non sono episodi veri. In Muvia una funzione Python toglie il rumore letto per letto, l'Analisi sovrappone le desaturazioni vere e il personale annota sul grafico cosa è successo.

Cosa ottieni

Episodi veri, non rumore
Le cadute dovute al sensore restano fuori; quelle che rimangono si possono contare e confrontare.
Ogni episodio accanto agli altri
Le desaturazioni sovrapposte mostrano quanto durano e quanto scendono, letto per letto e notte per notte.
Le note del reparto restano
Ciò che il personale ha osservato è scritto sul grafico, all'ora giusta, e si ritrova nella revisione.
Un filtro dichiarato
Come vengono puliti i segnali è scritto nella funzione: cambiarlo è una nuova versione, provata prima in un'esecuzione che non scrive nulla.

Per il team tecnico

Come si costruisce in Muvia

  1. 1

    Porta in Muvia i segnali dei monitor

    Le esportazioni della centrale di monitoraggio arrivano come file via SFTP e si aggiungono alla tabella dei segnali; letti e degenze sono copiati su programma. Una query li unisce letto per letto.

  2. 2

    Togli il rumore in Python

    Una funzione applica una mediana mobile e un filtro a fase zero di scipy a ogni segnale, letto per letto, e scrive i segnali puliti in una tabella gestita. Un flusso la esegue su programma.

  3. 3

    Trova le desaturazioni vere

    In Analisi una condizione individua le cadute sotto il 90 % che durano abbastanza da essere reali; la vista Strati le sovrappone sull'istante d'inizio e la distribuzione mostra quanto durano.

  4. 4

    Annota sul grafico

    Il personale segna sul grafico cosa è successo, per esempio l'inizio di una ventilazione: le note restano accanto ai dati, all'ora giusta.

  5. 5

    Scrivi la revisione del reparto

    Un notebook con testo, numeri e grafici riassume le notti della settimana e diventa un PDF per la riunione di reparto.

Funzione Python

import pandas as pd
from scipy.signal import butter, filtfilt, medfilt

SEGNALI = ["spo2", "battito", "respiro"]

def transform(inputs, params, ctx):
    df = inputs["rows"].sort_values(["letto", "istante"])
    b, a = butter(2, params["taglio"], btype="low")
    puliti = []
    for _, g in df.groupby("letto"):
        g = g.copy()
        for col in SEGNALI:
            x = medfilt(g[col].interpolate().bfill().to_numpy(), kernel_size=5)
            g[col + "_pulito"] = filtfilt(b, a, x) if len(x) > 12 else x
        puliti.append(g)
    out = pd.concat(puliti)
    out["sotto_soglia"] = out["spo2_pulito"] < params["soglia_spo2"]
    ctx.logger.info("letti elaborati: %d", out["letto"].nunique())
    return {"rows": out}
Il rumore tolto in modo dichiarato, letto per letto: una mediana mobile per gli spike e un filtro a fase zero che non sposta gli episodi nel tempo.
I dati che servono
  • Saturazione, frequenza cardiaca e respiratoria per letto, un campione ogni pochi secondi, esportati dalla centrale di monitoraggio via SFTP
  • Letti e degenze, da un database Oracle
  • Soglie del reparto e presidi in uso per letto, da un file Excel
Le parti di Muvia usate

Portaci una domanda a cui oggi non sai rispondere.

Partiamo da una domanda vera della tua azienda e ti mostriamo il percorso dalla fonte al cruscotto, con i tuoi sistemi e non con quelli di una demo.