разбор метрик HAE: фикстуры, канонизация, парсер
- tmp/research/fixtures.py собирает фикстуры из архива, вычищая измерения и сохраняя порядок ключей, форму литералов, выравнивание меток и невидимые символы; шесть фикстур в internal/hae/testdata - internal/canon — общий дом канонической формы, полноты и хеша: числа читаются литералом через json.Number, округление до 12 значащих цифр - internal/hae — разбор секции metrics, вывод слоя по метрике, разделение схем сна, координаты интервалом; recover внутри Parse, фаззинг - миграция bucket и docs/database.md
This commit is contained in:
Vendored
+314
@@ -0,0 +1,314 @@
|
||||
{
|
||||
"data": {
|
||||
"metrics": [
|
||||
{
|
||||
"name": "apple_stand_hour",
|
||||
"units": "count",
|
||||
"data": [
|
||||
{
|
||||
"qty": 8,
|
||||
"source": "Device A",
|
||||
"date": "2025-06-05 07:00:00 +0300"
|
||||
},
|
||||
{
|
||||
"source": "Device A",
|
||||
"date": "2025-06-05 08:00:00 +0300",
|
||||
"qty": 8
|
||||
},
|
||||
{
|
||||
"date": "2025-06-05 09:00:00 +0300",
|
||||
"source": "Device A",
|
||||
"qty": 8
|
||||
},
|
||||
{
|
||||
"date": "2025-06-05 10:00:00 +0300",
|
||||
"qty": 8,
|
||||
"source": "Device A"
|
||||
},
|
||||
{
|
||||
"source": "Device A",
|
||||
"qty": 8,
|
||||
"date": "2025-06-05 12:00:00 +0300"
|
||||
},
|
||||
{
|
||||
"qty": 8,
|
||||
"date": "2025-06-05 13:00:00 +0300",
|
||||
"source": "Device A"
|
||||
},
|
||||
{
|
||||
"qty": 8,
|
||||
"date": "2025-06-05 15:00:00 +0300",
|
||||
"source": "Device A"
|
||||
},
|
||||
{
|
||||
"qty": 8,
|
||||
"date": "2025-06-05 19:00:00 +0300",
|
||||
"source": "Device A"
|
||||
},
|
||||
{
|
||||
"qty": 8,
|
||||
"source": "Device A",
|
||||
"date": "2025-06-05 20:00:00 +0300"
|
||||
},
|
||||
{
|
||||
"date": "2025-06-05 21:00:00 +0300",
|
||||
"source": "Device A",
|
||||
"qty": 8
|
||||
},
|
||||
{
|
||||
"source": "Device A",
|
||||
"qty": 8,
|
||||
"date": "2025-06-06 02:00:00 +0300"
|
||||
},
|
||||
{
|
||||
"date": "2025-06-06 08:00:00 +0300",
|
||||
"source": "Device A",
|
||||
"qty": 8
|
||||
},
|
||||
{
|
||||
"date": "2025-06-06 09:00:00 +0300",
|
||||
"qty": 8,
|
||||
"source": "Device A"
|
||||
},
|
||||
{
|
||||
"source": "Device A",
|
||||
"qty": 8,
|
||||
"date": "2025-06-06 10:00:00 +0300"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"units": "hr",
|
||||
"data": [
|
||||
{
|
||||
"sleepEnd": "2025-06-05 05:22:26 +0300",
|
||||
"inBedStart": "2025-06-04 22:34:34 +0300",
|
||||
"core": 6.2052788381114499,
|
||||
"rem": 0.89195271872064281,
|
||||
"date": "2025-06-05 00:00:00 +0300",
|
||||
"totalSleep": 4.0716939170300220,
|
||||
"sleepStart": "2025-06-04 22:34:34 +0300",
|
||||
"awake": 4.3396901109717361,
|
||||
"inBed": 0,
|
||||
"deep": 0.68835541253715609,
|
||||
"source": "Device A ",
|
||||
"inBedEnd": "2025-06-05 05:22:26 +0300",
|
||||
"asleep": 0
|
||||
},
|
||||
{
|
||||
"source": "Device A ",
|
||||
"date": "2025-06-06 00:00:00 +0300",
|
||||
"asleep": 0,
|
||||
"core": 5.152708504451071,
|
||||
"inBed": 0,
|
||||
"totalSleep": 4.4003075324079272,
|
||||
"rem": 0.43532011302795238,
|
||||
"inBedEnd": "2025-06-06 07:57:39 +0300",
|
||||
"sleepStart": "2025-06-05 22:43:20 +0300",
|
||||
"awake": 9.638151247778914,
|
||||
"deep": 0.38341974910703597,
|
||||
"sleepEnd": "2025-06-06 07:57:39 +0300",
|
||||
"inBedStart": "2025-06-05 22:43:20 +0300"
|
||||
}
|
||||
],
|
||||
"name": "sleep_analysis"
|
||||
},
|
||||
{
|
||||
"units": "kJ",
|
||||
"name": "active_energy",
|
||||
"data": [
|
||||
{
|
||||
"source": "Device A ",
|
||||
"qty": 0.94633004162661996,
|
||||
"date": "2025-06-05 00:24:00 +0300"
|
||||
},
|
||||
{
|
||||
"date": "2025-06-05 00:25:00 +0300",
|
||||
"source": "Device A ",
|
||||
"qty": 0.22385813552875930
|
||||
},
|
||||
{
|
||||
"source": "Device A ",
|
||||
"date": "2025-06-05 00:26:00 +0300",
|
||||
"qty": 0.22385813552875930
|
||||
},
|
||||
{
|
||||
"qty": 0.27046667301884517,
|
||||
"source": "Device A ",
|
||||
"date": "2025-06-05 00:27:00 +0300"
|
||||
},
|
||||
{
|
||||
"date": "2025-06-05 00:28:00 +0300",
|
||||
"qty": 0.23659841288096517,
|
||||
"source": "Device A "
|
||||
},
|
||||
{
|
||||
"qty": 0.23659841288096517,
|
||||
"date": "2025-06-05 00:29:00 +0300",
|
||||
"source": "Device A "
|
||||
},
|
||||
{
|
||||
"source": "Device A ",
|
||||
"date": "2025-06-05 00:30:00 +0300",
|
||||
"qty": 0.23659841288096517
|
||||
},
|
||||
{
|
||||
"date": "2025-06-06 11:47:00 +0300",
|
||||
"source": "Device A ",
|
||||
"qty": 4.3538077885409284
|
||||
},
|
||||
{
|
||||
"source": "Device A ",
|
||||
"date": "2025-06-06 11:48:00 +0300",
|
||||
"qty": 4.3538077885409284
|
||||
},
|
||||
{
|
||||
"date": "2025-06-06 11:49:00 +0300",
|
||||
"qty": 4.3538077885409284,
|
||||
"source": "Device A "
|
||||
},
|
||||
{
|
||||
"date": "2025-06-06 11:50:00 +0300",
|
||||
"source": "Device A ",
|
||||
"qty": 2.1847867270334114
|
||||
},
|
||||
{
|
||||
"source": "Device A ",
|
||||
"qty": 2.1847867270334114,
|
||||
"date": "2025-06-06 11:51:00 +0300"
|
||||
},
|
||||
{
|
||||
"date": "2025-06-06 11:52:00 +0300",
|
||||
"source": "Device A ",
|
||||
"qty": 3.3347070079576802
|
||||
},
|
||||
{
|
||||
"qty": 0.96620370889283594,
|
||||
"date": "2025-06-06 11:53:00 +0300",
|
||||
"source": "Device A "
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": [
|
||||
{
|
||||
"date": "2025-06-05 00:00:00 +0300",
|
||||
"qty": 96,
|
||||
"source": "Device A "
|
||||
},
|
||||
{
|
||||
"source": "Device A ",
|
||||
"date": "2025-06-06 00:02:00 +0300",
|
||||
"qty": 60
|
||||
}
|
||||
],
|
||||
"name": "resting_heart_rate",
|
||||
"units": "count/min"
|
||||
},
|
||||
{
|
||||
"units": "count/min",
|
||||
"data": [
|
||||
{
|
||||
"Min": 67,
|
||||
"date": "2025-06-05 00:00:53 +0300",
|
||||
"source": "Device A ",
|
||||
"Avg": 67,
|
||||
"Max": 67
|
||||
},
|
||||
{
|
||||
"source": "Device A ",
|
||||
"Avg": 18,
|
||||
"Min": 18,
|
||||
"date": "2025-06-05 00:02:37 +0300",
|
||||
"Max": 18
|
||||
},
|
||||
{
|
||||
"Max": 18,
|
||||
"date": "2025-06-05 00:05:25 +0300",
|
||||
"source": "Device A |Device B",
|
||||
"Min": 18,
|
||||
"Avg": 18
|
||||
},
|
||||
{
|
||||
"date": "2025-06-05 00:11:01 +0300",
|
||||
"source": "Device A |Device B",
|
||||
"Max": 18,
|
||||
"Min": 18,
|
||||
"Avg": 18
|
||||
},
|
||||
{
|
||||
"date": "2025-06-05 00:12:30 +0300",
|
||||
"Min": 18,
|
||||
"Avg": 18,
|
||||
"source": "Device A |Device B",
|
||||
"Max": 18
|
||||
},
|
||||
{
|
||||
"Max": 82.669907989920684,
|
||||
"Min": 82.669907989920684,
|
||||
"Avg": 82.669907989920684,
|
||||
"source": "Device A |Device B",
|
||||
"date": "2025-06-05 00:16:36 +0300"
|
||||
},
|
||||
{
|
||||
"Avg": 67,
|
||||
"source": "Device A |Device B",
|
||||
"Max": 67,
|
||||
"date": "2025-06-05 00:18:54 +0300",
|
||||
"Min": 67
|
||||
},
|
||||
{
|
||||
"date": "2025-06-06 11:30:12 +0300",
|
||||
"Max": 33,
|
||||
"Min": 33,
|
||||
"source": "Device A |Device B",
|
||||
"Avg": 33
|
||||
},
|
||||
{
|
||||
"date": "2025-06-06 11:30:20 +0300",
|
||||
"source": "Device A |Device B",
|
||||
"Max": 88,
|
||||
"Min": 88,
|
||||
"Avg": 88
|
||||
},
|
||||
{
|
||||
"Avg": 37.044306705474884,
|
||||
"date": "2025-06-06 11:30:35 +0300",
|
||||
"source": "Device A |Device B",
|
||||
"Max": 37.044306705474884,
|
||||
"Min": 37.044306705474884
|
||||
},
|
||||
{
|
||||
"date": "2025-06-06 11:33:33 +0300",
|
||||
"Min": 33,
|
||||
"source": "Device A |Device B",
|
||||
"Max": 33,
|
||||
"Avg": 33
|
||||
},
|
||||
{
|
||||
"source": "Device A |Device B",
|
||||
"Avg": 16,
|
||||
"date": "2025-06-06 11:36:55 +0300",
|
||||
"Min": 16,
|
||||
"Max": 16
|
||||
},
|
||||
{
|
||||
"Min": 45,
|
||||
"date": "2025-06-06 11:44:45 +0300",
|
||||
"source": "Device A |Device B",
|
||||
"Max": 45,
|
||||
"Avg": 45
|
||||
},
|
||||
{
|
||||
"Avg": 64,
|
||||
"date": "2025-06-06 11:51:40 +0300",
|
||||
"Max": 64,
|
||||
"source": "Device A |Device B",
|
||||
"Min": 64
|
||||
}
|
||||
],
|
||||
"name": "heart_rate"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user