From 4c2af080d899c62b0ef280a34240fc0f2c04803c Mon Sep 17 00:00:00 2001 From: Daniel Mateos Date: Mon, 24 Nov 2025 11:19:39 +0100 Subject: [PATCH 1/4] Change output name system --- examples/scripts/run_health_metrics.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/scripts/run_health_metrics.py b/examples/scripts/run_health_metrics.py index 8efec16..ca35570 100644 --- a/examples/scripts/run_health_metrics.py +++ b/examples/scripts/run_health_metrics.py @@ -89,13 +89,13 @@ def _sync_compute_metrics(device, device_id, folder): logger.info("Raw export failed for device %s (non-fatal)", device_id) logger.info("get_nan_ratio for device %s", device_id) - device.get_nan_ratio().to_csv(f"{folder}/device_{device_id}_nan_ratios.csv.gz") + device.get_nan_ratio().to_csv(f"{folder}/{device_id}_nan_ratios.csv.gz") logger.info("get_implausible_ratio for device %s", device_id) - device.get_implausible_ratio().to_csv(f"{folder}/device_{device_id}_implausible_ratios.csv.gz") + device.get_implausible_ratio().to_csv(f"{folder}/{device_id}_implausible_ratios.csv.gz") logger.info("get_outlier_ratio for device %s", device_id) - device.get_outlier_ratio().to_csv(f"{folder}/device_{device_id}_outlier_ratios.csv.gz") + device.get_outlier_ratio().to_csv(f"{folder}/{device_id}_outlier_ratios.csv.gz") logger.info("get_top_value_ratio for device %s", device_id) - device.get_top_value_ratio().to_csv(f"{folder}/device_{device_id}_top_value_ratios.csv.gz") + device.get_top_value_ratio().to_csv(f"{folder}/{device_id}_top_value_ratios.csv.gz") except Exception: logger.exception("Synchronous metric computation failed for device %s", device_id) return False From ad26fcb54dbe0d308b7c387850a3fbdb35157fc7 Mon Sep 17 00:00:00 2001 From: Daniel Mateos Date: Thu, 4 Dec 2025 16:35:59 +0100 Subject: [PATCH 2/4] Fix unit conversion bug MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some sensors use ° (degrees symbol) while most sensors use º (ordinal indicator) to mean degrees, which was causing a lookup table fail for GB_TEMP --- scdata/tools/units.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scdata/tools/units.py b/scdata/tools/units.py index 0fa795e..3fcaa48 100644 --- a/scdata/tools/units.py +++ b/scdata/tools/units.py @@ -47,6 +47,7 @@ unit_convertion_lut = ( ['%rh', '%', 1, False], ['ºC', 'degC', 1, False], + ['°C', 'degC', 1, False], ['ppm', 'ppb', 1000, False], ['mg/m3', 'ug/m3', 1000, False], ['mgm3', 'ugm3', 1000, False], @@ -96,6 +97,7 @@ def get_units_convf(sensor, from_units): logger.info(f"Converting units for {sensor}. From {from_units} to {channel_lut[channel]}") for unit in unit_convertion_lut: # Get units + logger.debug(f"Is it {unit[0]} to {unit[1]}?") if unit[0] == from_units and unit[1] == channel_lut[channel]: factor = unit[2] requires_conc = unit[3] From 61412812a3aa6a739b98486455adc0fb6a7bc315 Mon Sep 17 00:00:00 2001 From: Daniel Mateos Date: Thu, 4 Dec 2025 16:38:28 +0100 Subject: [PATCH 3/4] Bump to 1.3.3 --- scdata/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scdata/__init__.py b/scdata/__init__.py index 483fd16..044e125 100644 --- a/scdata/__init__.py +++ b/scdata/__init__.py @@ -3,4 +3,4 @@ from .test import Test from .models import Source, TestOptions, DeviceOptions, APIParams, FileParams, CSVParams -__version__ = '1.3.2' \ No newline at end of file +__version__ = '1.3.3' \ No newline at end of file From 3dba073af1adde5e5a526d5ce5cd33310f4deaa3 Mon Sep 17 00:00:00 2001 From: Daniel Mateos Date: Thu, 4 Dec 2025 16:56:59 +0100 Subject: [PATCH 4/4] Fix type hints to hopefully fix tests --- scdata/tools/series.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scdata/tools/series.py b/scdata/tools/series.py index 6f0762d..dc0f5aa 100644 --- a/scdata/tools/series.py +++ b/scdata/tools/series.py @@ -1,9 +1,10 @@ from scdata.tools.custom_logger import logger +from typing import Optional from pandas import Series, Timedelta import numpy as np -def infer_sampling_rate(series: Series) -> int | None: +def infer_sampling_rate(series: Series) -> Optional[int]: '''Infer the sampling rate of the given timeseries, rounded to the closest minute. ''' @@ -21,7 +22,7 @@ def infer_sampling_rate(series: Series) -> int | None: return integer_minutes -def mode_ratio(series: Series, ignore_zeroes=True) -> int: +def mode_ratio(series: Series, ignore_zeroes=True) -> float: '''Count the percentage of times the most common value appears in the series, ignoring zeroes and NaNs.'''