fix: 按最大干扰值去重CGI

This commit is contained in:
2026-08-07 16:50:45 +08:00
parent 232b7c8b25
commit e6ceae74ca
4 changed files with 61 additions and 23 deletions
+36 -23
View File
@@ -43,7 +43,7 @@ class PipelineTest(unittest.TestCase):
self.assertTrue(summary_bytes.startswith(b"\xef\xbb\xbf"))
with summary_path.open(encoding="utf-8-sig", newline="") as file:
rows = list(csv.DictReader(file))
self.assertEqual(len(rows), 7)
self.assertEqual(len(rows), 2)
self.assertEqual(
list(rows[0]),
[
@@ -60,34 +60,29 @@ class PipelineTest(unittest.TestCase):
"prev_nearby_count",
],
)
rows_by_type = {row["cell_name"].removesuffix("-小区"): row for row in rows}
self.assertEqual(rows_by_type["5G干扰监控"]["network_type"], "2.6G")
self.assertEqual(rows_by_type["700M干扰监控"]["network_type"], "700M")
self.assertEqual(rows_by_type["SDR_FDD干扰监控"]["network_type"], "4G")
rows_by_cgi = {row["cgi"]: row for row in rows}
self.assertEqual(rows_by_cgi["460-00-200-1"]["network_type"], "2.6G")
self.assertTrue(all(row["metric_time"] == "2026-07-31 10:00:00" for row in rows))
self.assertEqual(rows_by_type["5G干扰监控"]["cgi"], "460-00-200-1")
self.assertEqual(rows_by_type["700M干扰监控"]["cgi"], "460-00-200-1")
for source_type in set(main.EXPECTED_TYPES) - {"5G干扰监控", "700M干扰监控"}:
self.assertEqual(rows_by_type[source_type]["cgi"], "460-00-100-1")
self.assertEqual(rows_by_cgi["460-00-200-1"]["cell_name"], "5G干扰监控-小区")
self.assertTrue(all(row["interference_dbm"] == "-100.5" for row in rows))
self.assertTrue(all(row["prev_interference_dbm"] == "" for row in rows))
self.assertTrue(all(row["prev_nearby_count"] == "" for row in rows))
self.assertEqual(rows_by_type["5G干扰监控"]["longitude"], "113.123456")
self.assertEqual(rows_by_type["5G干扰监控"]["latitude"], "22.654321")
self.assertEqual(rows_by_type["5G干扰监控"]["azimuth"], "30")
self.assertEqual(rows_by_type["5G干扰监控"]["nearby_count"], "1")
self.assertEqual(rows_by_type["700M干扰监控"]["nearby_count"], "1")
self.assertTrue(all(not row["longitude"] and not row["latitude"] for row in rows if row["cgi"] == "460-00-100-1"))
self.assertTrue(all(row["azimuth"] == "0" for row in rows if row["cgi"] == "460-00-100-1"))
self.assertTrue(all(row["nearby_count"] == "0" for row in rows if row["cgi"] == "460-00-100-1"))
self.assertEqual(rows_by_cgi["460-00-200-1"]["longitude"], "113.123456")
self.assertEqual(rows_by_cgi["460-00-200-1"]["latitude"], "22.654321")
self.assertEqual(rows_by_cgi["460-00-200-1"]["azimuth"], "30")
self.assertEqual(rows_by_cgi["460-00-200-1"]["nearby_count"], "0")
self.assertEqual(rows_by_cgi["460-00-100-1"]["nearby_count"], "0")
self.assertFalse(rows_by_cgi["460-00-100-1"]["longitude"])
self.assertEqual(rows_by_cgi["460-00-100-1"]["azimuth"], "0")
manifest = json.loads((result / "manifest.json").read_text(encoding="utf-8"))
self.assertEqual(manifest["source_file_count"], 7)
self.assertEqual(manifest["cell_data_file_count"], 5)
self.assertEqual(manifest["summary_rows"], 7)
self.assertEqual(manifest["summary_rows"], 2)
self.assertEqual(manifest["threshold_filtered_rows"], 0)
self.assertEqual(manifest["coordinate_matched_rows"], 2)
self.assertEqual(manifest["coordinate_unmatched_rows"], 5)
self.assertEqual(manifest["duplicate_cgi_rows"], 5)
self.assertEqual(manifest["coordinate_matched_rows"], 1)
self.assertEqual(manifest["coordinate_unmatched_rows"], 1)
self.assertEqual(manifest["metric_time"], "2026-07-31 10:00:00")
self.assertNotIn("hour_start", manifest)
self.assertNotIn("hour_end", manifest)
@@ -95,11 +90,11 @@ class PipelineTest(unittest.TestCase):
self.assertTrue(all("source_type" not in item and "source_path" not in item for item in manifest["files"]))
self.assertIn("2026073110091100", [item["source_window"] for item in manifest["files"]])
self.assertEqual(manifest["database"]["metric_time"], "2026-07-31 10:00:00")
self.assertEqual(len(store.rows), 7)
self.assertEqual(len(store.rows), 2)
self.assertEqual(history.path, "/history/2026-07-31/干扰数据处理结果_20260731100000.csv")
archived_rows = list(csv.DictReader(io.StringIO(history.payload.decode("gbk"))))
self.assertEqual(list(archived_rows[0]), list(main.SUMMARY_HEADER))
self.assertEqual(len(archived_rows), 7)
self.assertEqual(len(archived_rows), 2)
def test_interference_thresholds_remove_only_lower_values(self) -> None:
for network_type, threshold in (("2.6G", "-107"), ("700M", "-110"), ("4G", "-110")):
@@ -120,8 +115,9 @@ class PipelineTest(unittest.TestCase):
result = main.process(main.LocalSource(root), Path(temp) / "output", 3)
manifest = json.loads((result / "manifest.json").read_text(encoding="utf-8"))
self.assertEqual(manifest["summary_rows"], 6)
self.assertEqual(manifest["summary_rows"], 2)
self.assertEqual(manifest["threshold_filtered_rows"], 1)
self.assertEqual(manifest["duplicate_cgi_rows"], 4)
def test_latest_incomplete_group_waits_without_falling_back(self) -> None:
with tempfile.TemporaryDirectory() as temp:
@@ -245,6 +241,23 @@ class PipelineTest(unittest.TestCase):
self.assertEqual(rows[1]["prev_interference_dbm"], "")
self.assertEqual(rows[1]["prev_nearby_count"], "")
def test_duplicate_cgi_keeps_maximum_interference(self) -> None:
rows = [database_row(), database_row(), database_row()]
rows[0]["cgi"] = "duplicate"
rows[0]["interference_dbm"] = "-108.5"
rows[1]["cgi"] = "duplicate"
rows[1]["interference_dbm"] = "-101.25"
rows[2]["cgi"] = "unique"
removed = main.deduplicate_by_cgi(rows)
self.assertEqual(removed, 1)
self.assertEqual(len(rows), 2)
self.assertEqual({row["cgi"]: row["interference_dbm"] for row in rows}, {
"duplicate": "-101.25",
"unique": "-100.5",
})
def test_gbk_history_csv_normalizes_non_breaking_spaces(self) -> None:
payload = main.dict_csv_bytes(
("cell_name",),