Healthcare and clinical researchBI, AI and ML for the business
Vital signs: from noise to episode
Ward monitors record oxygen saturation, heart rate and breathing every few seconds, along with many alarms that are not real episodes. In Muvia a Python function removes the noise bed by bed, Analysis overlays the real desaturations and staff note on the chart what happened.
Illustrative scenario: it describes a typical case, not a customer project.
A monitor that sounds too often stops being heard.
A sensor that slips, a patient who turns over, a cold finger: many saturation alarms are not real desaturations. Staff know it, but reviewing a ward's nights afterwards, bed by bed, on raw data is close to impossible.
Cleaning the signals in a declared, consistent way and stacking the real episodes on top of each other shows how many drops are real, when they happen and what changes after an intervention. Muvia does not replace the monitor or its alarms: it works on exported data, for review.
- Who it's for
- Nursing coordinators and ward directors, clinical risk, clinical engineering and researchers.
In Muvia, step by step
Real product screens, recorded on a project with sample data.
The video · Ward monitors record oxygen saturation, heart rate and breathing every few seconds, along with many alarms that are not real episodes. In Muvia a Python function removes the noise bed by bed, Analysis overlays the real desaturations and staff note on the chart what happened.
What you get
- Real episodes, not noise
- Drops caused by the sensor stay out; the ones left can be counted and compared.
- Every episode next to the others
- Overlaid desaturations show how long they last and how deep they go, bed by bed and night by night.
- The ward's notes stay
- What staff observed is written on the chart, at the right time, and comes back in the review.
- A declared filter
- How the signals are cleaned is written in the function: changing it is a new version, tried first in a run that writes nothing.
For the technical team
How it is built in Muvia
- 1
Bring the monitor signals into Muvia
Exports from the central monitoring station arrive as files over SFTP and are appended to the signals table; beds and stays are copied on a schedule. A query joins them bed by bed.
- 2
Remove the noise in Python
A function applies a rolling median and a zero-phase scipy filter to each signal, bed by bed, and writes the clean signals to a managed table. A flow runs it on a schedule.
- 3
Find the real desaturations
In Analysis a condition picks out drops below 90% that last long enough to be real; the Layers view overlays them on their start and the distribution shows how long they last.
- 4
Annotate the chart
Staff mark on the chart what happened, such as the start of ventilation: the notes stay next to the data, at the right time.
- 5
Write the ward review
A notebook with text, numbers and charts sums up the week's nights and becomes a PDF for the ward meeting.
Python function
import pandas as pd
from scipy.signal import butter, filtfilt, medfilt
SIGNALS = ["spo2", "heart_rate", "resp_rate"]
def transform(inputs, params, ctx):
df = inputs["rows"].sort_values(["bed", "instant"])
b, a = butter(2, params["cutoff"], btype="low")
clean = []
for _, g in df.groupby("bed"):
g = g.copy()
for col in SIGNALS:
x = medfilt(g[col].interpolate().bfill().to_numpy(), kernel_size=5)
g[col + "_clean"] = filtfilt(b, a, x) if len(x) > 12 else x
clean.append(g)
out = pd.concat(clean)
out["below_threshold"] = out["spo2_clean"] < params["spo2_threshold"]
ctx.logger.info("beds processed: %d", out["bed"].nunique())
return {"rows": out}- The data it needs
- Oxygen saturation, heart rate and respiratory rate per bed, one sample every few seconds, exported from the central monitoring station over SFTP
- Beds and stays, from an Oracle database
- Ward thresholds and devices in use per bed, from an Excel file
More cases in this line
All use cases- Emergency department: arrivals, waits and bedsEvery arrival at the emergency department leaves a time, a triage code and a wait, and the wards know how many beds they have free. Muvia brings it all together hour by hour: you see the surge coming, you know when people arrive, and the ward screen updates by itself.
- Clinical trial: the interim analysisA trial's visits, measurements and adverse events come from the data capture system, the randomisation list from a file. Muvia joins them patient by patient, a Python function reruns the statistical comparison at every visit, and the interim report for the committee is always up to date.
- Screening programmes by districtA screening programme's invitations, uptake and tests sit in the invitation system, the laboratory's results and the clinics' schedules. Muvia joins them district by district: who takes part least, where the follow-up test takes longest, and Athena explaining why and saving the analysis.
Bring us a question you can't answer today.
We start from a real question your business has and walk the path from source to dashboard with your systems, not a demo dataset.