This release is a pre-release and may not be stable for production use.
ICOschema
Backend-agnostic data model for sensor/hardware recordings and their derived computations.
Install
uv venv --allow-existing
uv sync --all-extras
Usage
Note: In the example below we assume you installed Matplotlib:
uv pip install matplotlib
Other codebases should only import Recording/DatasetBundle from the top-level package:
from icoschema import Recording, DatasetBundle
import matplotlib.pyplot as plt
recording = Recording.from_hdf5("test/test_with_sensors.hdf5")
df = recording.to_dataframe()
plt.plot(recording.timestamps, recording.channel1)
plt.show()
recording.to_hdf5("some_file.hdf5")
bundle = DatasetBundle.from_hdf5("some_file.hdf5") # recording + any DerivedDataset computations
# Note: The code below does not work, since `derived` is not defined
# Adding the code for `derived` from the example below will not work,
# since then `my_wavelet_transform` is not defined.
bundle = bundle.with_computation("wavelet_coefficients/channel1/details", derived)
bundle.to_hdf5("some_file.hdf5")
Example use cases
Inspect a recording without loading a full DataFrame:
recording = Recording.from_hdf5("some_file.hdf5")
print(recording.signal_loss_percentage)
print(recording.summary()) # JSON-encodable dict: per-channel min/max/mean/std, sensor info
Add a derived computation and persist it alongside the recording:
from icoschema.schema.generated.python.dataset import DerivedDataset
bundle = DatasetBundle.from_hdf5("some_file.hdf5")
coeffs = my_wavelet_transform(bundle.recording.channel1)
derived = DerivedDataset(
key="wavelet_coefficients/channel1/details",
values=coeffs.flatten().tolist(),
shape=list(coeffs.shape),
dtype=str(coeffs.dtype),
produced_by="wavelet_transform@1.0.0",
)
bundle = bundle.with_computation(derived.key, derived)
bundle.to_hdf5("processed_file.hdf5")
Replace a recording after cleanup, keeping existing computations:
bundle = DatasetBundle.from_hdf5("some_file.hdf5")
filled = fill_dropped_packets(bundle.recording) # some dataloss fill logic
bundle = bundle.with_recording(filled)
bundle.to_hdf5("some_file.hdf5")
Development
Regenerate the Python dataclasses after editing the schema:
uv run gen-python .\ICOschema\schema\linkml\dataset.yaml > .\ICOschema\schema\generated\python\dataset.py
Run the tests:
uv run pytest
Schema
classDiagram
class Recording {
+HardwareMetadata hardware_metadata
+RecordingMetadata recording_metadata
+RecordingData recording_data
}
class RecordingMetadata {
+string start_time
}
class RecordingData {
+int[] timestamp
+int[] counter
+float[] channel1
+float[] channel2
+float[] channel3
}
class HardwareMetadata {
+string revision
+string adc_reference_voltage
+ChannelMetadata channel1_metadata
+ChannelMetadata channel2_metadata
+ChannelMetadata channel3_metadata
}
class ChannelMetadata {
+Sensor sensor
+Compensation[] compensations
}
class Sensor {
+string sensor_id
+string sensor_type
+string name
+string unit
+string dimension
+float phys_min
+float phys_max
+float volt_min
+float volt_max
}
class Compensation {
<<abstract>>
+int order
}
class Conversion {
<<abstract>>
}
class NoConversion
class LinearConversion {
+float gain
+float offset
}
class PolynomialConversion {
+float[] coefficients
}
class FrequencyCompensation {
<<abstract>>
}
class DerivedDataset {
+string key
+float[] values
+int[] shape
+string dtype
+string unit
+string produced_by
+string produced_at
+string params
+string description
}
class DatasetBundle {
+Recording recording
+Map~string, DerivedDataset~ computations
}
Compensation <|-- Conversion
Compensation <|-- FrequencyCompensation
Conversion <|-- NoConversion
Conversion <|-- LinearConversion
Conversion <|-- PolynomialConversion
Recording *-- HardwareMetadata
Recording *-- RecordingMetadata
Recording *-- RecordingData
HardwareMetadata *-- "1" ChannelMetadata : channel1_metadata
HardwareMetadata o-- "0..1" ChannelMetadata : channel2_metadata
HardwareMetadata o-- "0..1" ChannelMetadata : channel3_metadata
ChannelMetadata *-- Sensor
ChannelMetadata *-- "1..*" Compensation : compensations
DatasetBundle *-- Recording
DatasetBundle o-- "0..*" DerivedDataset : computations
Open questions
- All channels in a
RecordingDatashare onetimestamp/counterarray set, i.e. one sample rate per recording. Mixing sensors with different data rates on different channels isn't representable yet — would likely need a per-channel rate/timestamp instead of one shared pair.
Development
In the text below we assume that you installed:
and that you want to release version <VERSION> of the package. Please just replace this version number with the version that you want to release (e.g. 0.1.0).
Release
-
Change the version number and commit your changes:
just release <VERSION>
Note: GitHub Actions will publish a package based on the tagged commit and upload it to PyPi.
-
Create a new release here
- Insert the version number
<VERSION>into the tag field - For the release title use “Version
<VERSION>” - Paste the release notes for the lastest release into the main text field
- Click on “Publish Release”
Note: Alternatively you can also use the
ghcommand:gh release create <VERSION>
to create the release notes.
- Insert the version number
Metadata
Release files for icoschema 0.1.0b2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| icoschema-0.1.0b2.tar.gz | 197.7 kB | With provenance | Details for icoschema-0.1.0b2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| icoschema-0.1.0b2-py3-none-any.whl | Python 3 | none | any | Details for icoschema-0.1.0b2-py3-none-any.whl |
Total release size: 217.6 kB
Release files / icoschema-0.1.0b2.tar.gz
| Download URL | icoschema-0.1.0b2.tar.gz |
|---|---|
| Size | 197.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dabfe6d51cf51367137bdcf2887eaa9500ed182eec9f735b45e6195178996207
|
|
BLAKE2b-256 checksum How to use checksums |
6b9af440d88014540b33f5543834d8a85d12b2fffe23f7791079529715e8150d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / icoschema-0.1.0b2-py3-none-any.whl
| Download URL | icoschema-0.1.0b2-py3-none-any.whl |
|---|---|
| Size | 19.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c902beb3247ad0da265087189f1f60285108c905f41765b104acf0065b7c6e74
|
|
BLAKE2b-256 checksum How to use checksums |
4ed524ef1ef7927dacda15e146323573fe75c1ac5e241874d79f589ae624fa1a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logSecurity for icoschema 0.1.0b2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for icoschema-0.1.0b2.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.