Releases¶
All notable changes to ECGDataKit are documented here.
v1.0.0 - Stable Release¶
New features¶
Per-lead normalization —
normalize_minmax,normalize_zscore, andnormalize_amplitudenow accept alist[Lead]and return alist[Lead], normalizing each lead independently. Passrecord.leadsdirectly instead of looping manuallyResampling and normalization (min-max, z-score, amplitude) now support batch processing across all leads (independently) of an ECG record
v0.0.9 - ADC resolution pipeline¶
Breaking changes¶
sample_raterenamed tosampling_rateinLeadandSignalCharacteristicsLead.unitssemantics changed — now empty ("") whenis_raw=True(raw ADC counts); set to the physical unit (voltages) only afterto_physical()or when data is already in physical unitsLead.is_rawis now auto-detected — parsers no longer hardcodeis_raw=True; insteadis_raw = not (resolution == 1.0 and offset == 0.0)
New features¶
Automatic ADC-to-physical scaling —
FileParser.parse(auto_scale=True)(default) converts raw ADC samples to mV viato_physical()+convert_units("mV"). Disable withauto_scale=FalseLead.to_physical()— converts raw ADC samples usingphysical = samples × resolution + offsetLead.convert_units(target)— converts between voltage units (uV, mV, V)ECGRecord.to_physical()/ECGRecord.convert_units(target)— batch conversion for all leads and median beatsFileParser.supported_formats()— returns format metadata for all 12 parsersECGRecord.__repr__()andECGRecord.plot()— YAML-style console display and quick plottingMulti-lead numpy array support —
plot_leads,plot_12lead,iplot_leads,iplot_12leadaccept raw numpy arrays withfs=parameterLeadsLiketype alias — for multi-lead inputs (list of Lead, ECGRecord, 2D array, list of arrays)
New Lead fields¶
resolution_unit— unit of the resolution scale factor (e.g."uV","mV"); what samples will be in afterto_physical()adc_resolution— original ADC resolution as stored in the source file (e.g.153.0for 153 nV/count in ISHNE)adc_resolution_unit— unit ofadc_resolutionas defined by the format (e.g."nV"for ISHNE and SCP-ECG)
Improvements¶
Simplified multi-lead plots: full signal by default with configurable
rows/colsgrid layoutplot_12leadandiplot_12leadassign standard 12-lead names to unnamed inputsStatic plots no longer force matplotlib Agg backend
v0.0.8¶
Visualization¶
Multi-lead plotting functions (
plot_leads,plot_12lead,plot_quality,iplot_leads,iplot_12lead) now accept raw numpy arrays directly withfs=parameter — pass a 2D array (n_leads × n_samples) or a list of 1D arrays alongside the sample rateNew
LeadsLiketype alias for multi-lead inputs:list[Lead] | ECGRecord | NDArray | list[NDArray]Static plots no longer force the
Aggbackend — plots display inline in Jupyter and GUI environments by default
v0.0.7 - Signal Characteristics, Flexible Inputs & Sphinx Docs Latest¶
Parsing¶
New
SignalCharacteristicsdataclass onECGRecord— captures bits per sample, data encoding, compression, signed/unsigned, channel counts, electrode placement, and signal processing flagsAll 12 parsers now populate
record.signalwith format-specific signal characteristicsNew
DeviceInfo.namefield (distinct frommodel)Expanded metadata extraction across all parsers:
recording.technician— now extracted from Sierra XML, GE MUSE, DICOM, GE MAC 2000recording.referring_physician— now extracted from Sierra XML, EDF, GE MUSE, GE MAC 2000patient.weight— now extracted from SCP-ECG, BeneHeart R12, GE MAC 2000patient.height— now extracted from BeneHeart R12, GE MAC 2000patient.race— now extracted from HL7 aECG, Mortara EL250, GE MAC 2000patient.clinical_history— now extracted from WFDB comment linesfilters.notch_active— now properly set when notch filter is present (all parsers)measurements.rr_interval— now extracted from Mortara EL250, BeneHeart R12, GE MAC 2000measurements.qrs_count— now extracted from Mortara EL250, BeneHeart R12, GE MAC 2000device.serial_number— now extracted from HL7 aECG, GE MAC 2000device.institution— now extracted from HL7 aECG
Fix: BeneHeart R12 no longer assigns device name to non-existent
RecordingInfo.devicefieldFix: SCP-ECG now reads patient weight from Tag 12
Visualization¶
Static plots now auto-display by default (
show=True); passshow=Falseto get the figure without displayingNew
x_axisparameter on single-lead plots:"time"(default, seconds) or"samples"(sample indices)Reduced plot margins and borders
X-axis time labels now use integer seconds
Processing & Plotting¶
All processing and plotting functions now accept raw numpy arrays directly with
fs=(sample rate) parameter, in addition toLeadobjects
v0.0.6 — Initial Release¶
Release date: March 2, 2026
The first public release of ECGDataKit.
Parsing¶
12 ECG format parsers: HL7 aECG, Philips Sierra XML, ISHNE Holter, Mortara EL250, EDF/EDF+, SCP-ECG, GE MUSE XML, DICOM Waveform, WFDB (PhysioNet), MFER, Mindray BeneHeart R12, GE MAC 2000
Unified
ECGRecorddata model across all formatsAuto-detection of file format via
FileParserBatch parsing with
parse_batch()and multiprocessing supportJSON serialization via
ECGRecord.to_json()
Signal Processing¶
Butterworth filters: lowpass, highpass, bandpass, notch, baseline removal
Diagnostic (0.05–150 Hz) and monitoring (0.67–40 Hz) filter presets
R-peak detection: Pan-Tompkins and Shannon energy algorithms
Heart rate, RR intervals, instantaneous heart rate
HRV analysis: time-domain (SDNN, RMSSD, pNN50), frequency-domain (VLF/LF/HF), Poincaré (SD1/SD2)
FFT, power spectral density, beat segmentation, ensemble averaging
Signal quality index (SQI) and SNR estimation
Lead derivation (III, aVR/aVL/aVF, full 12-lead assembly)
Resampling and normalization (min-max, z-score, amplitude)
ECG cleaning: built-in, BioSPPy, NeuroKit2, combined pipelines
DeepFADE denoising autoencoder — a symmetric DenseNet encoder-decoder trained on a large private ECG database with noise augmentations, with pre-trained weights bundled
Visualization¶
Static plots (matplotlib): single lead, multi-lead, 12-lead grid, R-peak annotations, beat overlay, averaged beat, spectrum, spectrogram, RR tachogram, Poincaré plot, HRV dashboard, signal quality chart, full ECG report
Interactive plots (plotly): all of the above with zoom, pan, hover, and range slider
Infrastructure¶
Documentation site at ecgdatakit.ummisco.fr
GitHub Actions CI: tests across Python 3.10–3.13
Apache 2.0 license