fix: 按最大干扰值去重CGI
This commit is contained in:
+36
-23
@@ -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",),
|
||||
|
||||
Reference in New Issue
Block a user