Skip to content

Commit 3fbd2bb

Browse files
committed
feat: improve data coercion functions for sensor transfer processing
1 parent 1c66db9 commit 3fbd2bb

2 files changed

Lines changed: 48 additions & 18 deletions

File tree

tests/test_sensor_transfer.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1+
from transfers.sensor_transfer import _coerce_wi_mic_gain, _coerce_wi_int
12
import numpy as np
23
import pandas as pd
34

4-
from transfers.sensor_transfer import _coerce_wi_mic_gain
5-
65

76
def test_coerce_wi_mic_gain_numeric():
87
assert _coerce_wi_mic_gain(1) is True
@@ -22,3 +21,22 @@ def test_coerce_wi_mic_gain_handles_none_like():
2221
assert _coerce_wi_mic_gain(" ") is None
2322
assert _coerce_wi_mic_gain(pd.NA) is None
2423
assert _coerce_wi_mic_gain(np.nan) is None
24+
25+
26+
def test_coerce_wi_int_numeric():
27+
assert _coerce_wi_int(1) == 1
28+
assert _coerce_wi_int(1.9) == 1
29+
assert _coerce_wi_int(0.0) == 0
30+
31+
32+
def test_coerce_wi_int_strings():
33+
assert _coerce_wi_int("2") == 2
34+
assert _coerce_wi_int(" 3.0 ") == 3
35+
assert _coerce_wi_int("true") is None
36+
37+
38+
def test_coerce_wi_int_none_like():
39+
assert _coerce_wi_int(None) is None
40+
assert _coerce_wi_int(" ") is None
41+
assert _coerce_wi_int(pd.NA) is None
42+
assert _coerce_wi_int(np.nan) is None

transfers/sensor_transfer.py

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -48,24 +48,36 @@
4848
}
4949

5050

51+
def _coerce_wi_int(value):
52+
if value is None or (isinstance(value, str) and not value.strip()):
53+
return None
54+
if isinstance(value, bool):
55+
return int(value)
56+
try:
57+
if pd.isna(value):
58+
return None
59+
except TypeError:
60+
pass
61+
try:
62+
return int(float(value))
63+
except (TypeError, ValueError):
64+
return None
65+
66+
5167
def _coerce_wi_mic_gain(value):
5268
if value is None or (isinstance(value, str) and not value.strip()):
5369
return None
5470
if isinstance(value, str):
5571
value = value.strip()
56-
if pd.isna(value):
57-
return None
58-
if isinstance(value, bool):
59-
return value
72+
try:
73+
if pd.isna(value):
74+
return None
75+
except TypeError:
76+
pass
6077
try:
6178
return bool(int(float(value)))
62-
except (ValueError, TypeError):
63-
lowered = str(value).strip().lower()
64-
if lowered in {"true", "t", "yes", "y"}:
65-
return True
66-
if lowered in {"false", "f", "no", "n"}:
67-
return False
68-
return None
79+
except (TypeError, ValueError):
80+
return None
6981

7082

7183
class SensorTransferer(ThingBasedTransferer):
@@ -238,12 +250,12 @@ def _group_step(self, session: Session, row: pd.Series, db_item: Base):
238250
hanging_cable_length=row.HangingCableLength,
239251
hanging_point_height=row.HangingPointHgt,
240252
hanging_point_description=row.HangingPointDescription,
241-
nma_WI_Duration=row.WI_Duration,
242-
nma_WI_EndFrequency=row.WI_EndFrequency,
243-
nma_WI_Magnitude=row.WI_Magnitude,
253+
nma_WI_Duration=_coerce_wi_int(row.WI_Duration),
254+
nma_WI_EndFrequency=_coerce_wi_int(row.WI_EndFrequency),
255+
nma_WI_Magnitude=_coerce_wi_int(row.WI_Magnitude),
244256
nma_WI_MicGain=_coerce_wi_mic_gain(row.WI_MicGain),
245-
nma_WI_MinSoundDepth=row.WI_MinSoundDepth,
246-
nma_WI_StartFrequency=row.WI_StartFrequency,
257+
nma_WI_MinSoundDepth=_coerce_wi_int(row.WI_MinSoundDepth),
258+
nma_WI_StartFrequency=_coerce_wi_int(row.WI_StartFrequency),
247259
)
248260
session.add(deployment)
249261
logger.info(

0 commit comments

Comments
 (0)