From 2a6126e0643ad4017ecd5bf78e44077c2b9e31cf Mon Sep 17 00:00:00 2001 From: Andre Manoel Date: Fri, 6 Nov 2026 16:39:52 -0300 Subject: [PATCH] chore: remove NANPA screening from phone sampling data Signed-off-by: Andre Manoel --- .../entities/assets/zip_area_code_map.NOTICE | 14 +- .../entities/assets/zip_area_code_map.parquet | Bin 382447 -> 382226 bytes .../entities/test_phone_number_data.py | 7 +- scripts/person_data/README.md | 59 +++-- .../person_data/area_code_reconciliation.csv | 228 +++++++++--------- scripts/person_data/build_report.json | 71 ++---- scripts/person_data/excluded_localities.csv | 93 ------- scripts/person_data/rebuild.py | 12 +- scripts/person_data/sources.json | 9 - 9 files changed, 179 insertions(+), 314 deletions(-) delete mode 100644 scripts/person_data/excluded_localities.csv diff --git a/packages/data-designer-engine/src/data_designer/engine/sampling_gen/entities/assets/zip_area_code_map.NOTICE b/packages/data-designer-engine/src/data_designer/engine/sampling_gen/entities/assets/zip_area_code_map.NOTICE index aca1a9dc6..2bd7fef93 100644 --- a/packages/data-designer-engine/src/data_designer/engine/sampling_gen/entities/assets/zip_area_code_map.NOTICE +++ b/packages/data-designer-engine/src/data_designer/engine/sampling_gen/entities/assets/zip_area_code_map.NOTICE @@ -16,18 +16,18 @@ without attribution or share-alike requirements. https://www.wikidata.org/wiki/Wikidata:Licensing https://creativecommons.org/publicdomain/zero/1.0/ -Transformation: normalize locality statements, remove curated exclusions, -prefer nearby same-state literal postal-code associations, and otherwise use +Transformation: normalize locality statements, prefer nearby same-state +literal postal-code associations, and otherwise use the nearest same-state locality point. Retain the candidate codes at that point. Sample ZIPs by Census population, then choose uniformly among their candidates. Candidates are locality-level approximations, not exact telephone boundaries or measured telephone market shares. Each ZIP's population weight is stored once. -NANPA's 2026-11-06 NPA report was consulted only as a screening reference. -No explicit open-data license was established for that report. It is not -redistributed and is not required to rebuild from the pinned snapshots. +Future data improvements include finding additional permissively licensed +numbering references to validate active status, geographic use, and state +assignments. -Source snapshots, queries, exclusions, and permissions (immutable input revision): -https://github.com/NVIDIA-NeMo/DataDesigner/tree/eae83186b32d7c62ee880c6f538bda46a6831c72/scripts/person_data +Wikidata source snapshots (immutable revision): +https://github.com/NVIDIA-NeMo/DataDesigner/tree/43b49ab5cb4353d8a16f0cb9813bc20fc0eea1b8/scripts/person_data/snapshots The parquet key-value metadata contains the source manifest, its SHA-256, the rebuild script SHA-256, and the sampling policy under data_designer.provenance. diff --git a/packages/data-designer-engine/src/data_designer/engine/sampling_gen/entities/assets/zip_area_code_map.parquet b/packages/data-designer-engine/src/data_designer/engine/sampling_gen/entities/assets/zip_area_code_map.parquet index 1388ab213f29fcf75654084fd0c3c44d757fda85..ba5f53843183a7c799c561bfec651f3768397390 100644 GIT binary patch delta 33639 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 D$pQBI delta 33720 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 z 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 H4Wj=8`?ihk diff --git a/packages/data-designer-engine/tests/engine/sampling_gen/entities/test_phone_number_data.py b/packages/data-designer-engine/tests/engine/sampling_gen/entities/test_phone_number_data.py index 1b8534720..e75028aab 100644 --- a/packages/data-designer-engine/tests/engine/sampling_gen/entities/test_phone_number_data.py +++ b/packages/data-designer-engine/tests/engine/sampling_gen/entities/test_phone_number_data.py @@ -35,14 +35,11 @@ def test_phone_data_provenance() -> None: assert lineage["format_version"] == 2 assert lineage["candidate_selection"] == "population_weighted_zip_then_uniform_area_code" assert lineage["source_manifest"] == json.loads(manifest_bytes) + assert set(lineage["source_manifest"]) == {"sources"} assert lineage["source_manifest_sha256"] == hashlib.sha256(manifest_bytes).hexdigest() - assert ( - lineage["source_manifest"]["excluded_localities_sha256"] - == hashlib.sha256((PROVENANCE / "excluded_localities.csv").read_bytes()).hexdigest() - ) assert lineage["rebuild_script_sha256"] == hashlib.sha256((PROVENANCE / "rebuild.py").read_bytes()).hexdigest() assert re.fullmatch( - r"https://github.com/NVIDIA-NeMo/DataDesigner/tree/[0-9a-f]{40}/scripts/person_data", + r"https://github.com/NVIDIA-NeMo/DataDesigner/tree/[0-9a-f]{40}/scripts/person_data/snapshots", lineage["source_revision_url"], ) assert lineage["source_revision_url"] in ASSET.with_suffix(".NOTICE").read_text() diff --git a/scripts/person_data/README.md b/scripts/person_data/README.md index 91463460f..5ae702939 100644 --- a/scripts/person_data/README.md +++ b/scripts/person_data/README.md @@ -28,15 +28,7 @@ are not used. These data permissions impose no noncommercial or share-alike restriction on the generated lookup. The repository's Apache-2.0 license covers the rebuild code; it does not replace the source-data terms. -The [NANPA NPA database](https://www.nanpa.com/reports/npa-reports) was consulted -on 2026-11-06 to screen locality associations against country, in-service status, -and state. No explicit open-data license was established for that report, so -it is **not described as CC0 or public domain**. The report is not redistributed -and is not an input required by the rebuild. Its URL, date, and checksum are -recorded as a validation reference. `excluded_localities.csv` records the 92 -rejected Wikidata rows using Wikidata fields and Census-derived states, rather -than copying the NANPA database. Regeneration reproduces this pinned curation; -it does not recheck current numbering assignments. +The lookup is derived from the Census and Wikidata inputs listed above. No third-party GitHub ZIP/area-code compilation is used. @@ -46,7 +38,7 @@ No third-party GitHub ZIP/area-code compilation is used. 2. Assign states using the full Census state polygons. A reader for the pinned Polygon/DBF format and a NumPy point-in-polygon calculation handle multipart polygons, holes, and boundaries without additional geometry packages. Normalize - Wikidata three-digit dialing codes and coordinates, then remove the exclusions. + Wikidata three-digit dialing codes and coordinates. 3. Prefer literal five-digit Wikidata postal-code associations when the locality lies in the same state and within 50 km of the ZCTA point. Postal-code ranges and wildcards are not expanded. @@ -62,28 +54,35 @@ No third-party GitHub ZIP/area-code compilation is used. among its candidates. An exact-ZIP request skips the ZIP draw. Having more candidates does not increase a ZIP's probability of being sampled. -The checked-in build has 18,749 explicit postal-code associations and 15,023 -nearest-locality fallbacks. All ZIP identifiers, representative codes, and population -weights match the initial rebuild in this PR. Candidate lists contain 37,239 -ZIP/code associations, and 2,322 ZIPs have more than one candidate. Agreement with -the original repository asset is not an accuracy measure. +The checked-in build has 18,786 explicit postal-code associations and 14,986 +nearest-locality fallbacks. All ZIP identifiers and population weights match the +previous build. Candidate lists change for 213 ZIPs (0.63%) and representative +codes change for 152 ZIPs. Candidate lists contain 37,294 +ZIP/code associations, and 2,374 ZIPs have more than one candidate. Agreement with +the previous asset is not an accuracy measure. This is a regional approximation for synthetic data, not a telephone service-area or address lookup. A city's candidate list can contain both overlays and geographic splits. Candidates are plausible at the chosen locality point, not verified for each postal address or exact ZIP boundary. Uniform candidate selection does not -estimate actual telephone market shares. There are 348 fallback ZIPs +estimate actual telephone market shares. There are 335 fallback ZIPs more than 50 km from their donor locality; the largest distance is about 231 km. -State-level screening does not establish ZIP-level accuracy. Population estimates -and numbering statements reflect the pinned source dates. +Population estimates and numbering statements reflect the pinned source dates. The code-level reconciliation counts 386 distinct three-digit source values, -358 codes with retained localities, 355 with localities in the covered ZCTA -states/territories, and 333 represented in candidate lists. Retaining alternatives -recovers 56 codes previously discarded, including 332, 726, and Chicago's 773 and -872. There are still 22 eligible but unselected codes. They have no selected -locality point under this method. These omissions are reported, not treated as -evidence that the codes are invalid. +386 codes with retained localities, 377 with localities in the covered ZCTA +states/territories, and 352 represented in candidate lists. There are 25 source +codes with covered localities but no selected locality point under this method. +These counts account for source statements; they do not establish numbering +validity. Omissions are reported without treating the codes as invalid. + +## Future data improvements + +Find additional permissively licensed numbering references to validate dialing +codes for active status, geographic use, and state assignments. Further work +includes refining ZIP-level boundaries, improving code coverage, and estimating +candidate usage proportions. Each additional reference needs documented terms, +provenance, and reproducible input snapshots. ## Rebuild @@ -135,14 +134,14 @@ The recorded build used Python 3.12, NumPy 2.4.3, pandas 3.0.5, SciPy 1.17.1, and PyArrow 24.0.0. The parquet's `data_designer.provenance` key-value metadata embeds the complete -source manifest (URLs, hashes, permissions, and screening reference), the manifest -SHA-256, the rebuild script SHA-256, and the ZIP/candidate sampling policy. The packaged NOTICE links to the immutable -input revision, so an older wheel retains a stable source reference. Refresh that -link and `SOURCE_REVISION_URL` when adopting a new committed input revision. +source manifest (URLs, hashes, and permissions), the manifest SHA-256, the rebuild +script SHA-256, and the ZIP/candidate sampling policy. The packaged NOTICE links +to the immutable Wikidata snapshot revision; Census source URLs and hashes are in +the embedded manifest. Refresh that link and `SOURCE_REVISION_URL` when adopting +new committed Wikidata snapshots. To update sources, rerun the two `.sparql` queries, replace their compressed -snapshots and hashes, review the exclusions against a newly recorded numbering -reference, and update the Census URLs/hashes if changing vintage. Rebuild, +snapshots and hashes, and update the Census URLs/hashes if changing vintage. Rebuild, inspect lineage and coverage, and update the build report and data notice. ## Source acknowledgment diff --git a/scripts/person_data/area_code_reconciliation.csv b/scripts/person_data/area_code_reconciliation.csv index 436ba55af..92194718b 100644 --- a/scripts/person_data/area_code_reconciliation.csv +++ b/scripts/person_data/area_code_reconciliation.csv @@ -1,46 +1,46 @@ area_code,input_records,retained_locality_records,eligible_locality_records,output_zipcodes,output_population,status -201,30,29,29,98,1695304.0,selected +201,30,30,30,99,1696158.0,selected 202,30,30,30,57,672079.0,selected 203,68,68,68,87,1393767.0,selected -205,168,168,168,188,1534246.0,selected +205,168,168,168,186,1532089.0,selected 206,41,41,41,42,567041.5,selected -207,852,852,852,427,1377734.0,selected -208,249,247,247,280,1893304.0,selected +207,852,852,852,425,1354799.0,selected +208,249,249,249,284,1891552.5,selected 209,101,101,101,137,1880553.0,selected 210,9,9,9,69,1156174.0,selected -212,55,55,55,70,638189.25,selected +212,55,55,55,70,585866.75,selected 213,3,3,3,63,377714.5,selected 214,7,7,7,73,850862.6666666666,selected 215,18,18,18,171,2108491.0,selected -216,29,28,28,41,995011.0,selected +216,29,29,29,42,995276.0,selected 217,136,136,136,350,1048108.5,selected -218,232,232,232,292,797314.0,selected +218,232,232,232,291,797049.0,selected 219,72,72,72,68,840925.0,selected 220,1,1,1,4,6160.5,selected 223,4,4,4,61,222153.0,selected 224,4,4,4,13,161519.5,selected -225,44,43,43,89,864103.5,selected +225,44,44,44,91,895223.5,selected 228,29,29,29,27,403017.0,selected -229,109,109,109,128,714067.0,selected +229,109,109,109,127,712886.0,selected 231,48,48,48,136,687894.0,selected 234,2,2,2,25,150196.5,selected 235,1,1,1,2,1246.0,selected -236,1,0,0,0,0.0,no_retained_locality +236,1,1,0,0,0.0,outside_zcta_states 239,62,62,62,58,1206864.0,selected 240,91,91,91,172,1261527.8,selected 248,30,30,30,73,1374096.75,selected -250,1,0,0,0,0.0,no_retained_locality +250,1,1,0,0,0.0,outside_zcta_states 251,84,84,84,104,749718.0,selected 252,147,147,147,198,1070963.0,selected 253,62,62,62,58,1269771.0,selected 254,89,89,89,131,1003984.0,selected -256,137,137,137,179,1564460.0,selected -257,1,0,0,0,0.0,no_retained_locality +256,137,137,137,177,1554385.0,selected +257,1,1,0,0,0.0,outside_zcta_states 260,66,66,66,93,732688.0,selected 262,85,85,85,103,1216795.0,selected 267,3,3,3,55,830644.0,selected 269,31,31,31,98,857116.0,selected -270,70,70,70,221,941466.5,selected +270,70,70,70,219,923062.5,selected 272,2,2,2,13,61779.0,selected 274,1,1,1,0,0.0,not_selected 276,51,51,51,125,465373.0,selected @@ -48,33 +48,33 @@ area_code,input_records,retained_locality_records,eligible_locality_records,outp 281,47,47,47,157,3072186.7,selected 283,1,1,1,0,0.0,not_selected 301,121,121,121,231,1811124.8,selected -302,78,77,77,68,1006247.0,selected -303,26,26,26,118,2077404.6666666667,selected +302,78,78,78,69,1007401.0,selected +303,26,26,26,118,1877619.6666666667,selected 304,217,217,217,738,1705155.0,selected 305,74,74,74,95,2029129.0,selected 307,203,203,203,176,564413.0,selected 308,71,71,71,193,360503.0,selected 309,80,80,80,205,975700.5,selected -310,16,16,16,107,1448462.1666666667,selected -312,4,3,3,56,897075.3333333334,selected +310,16,16,16,106,1416289.1666666667,selected +312,4,4,4,57,929248.3333333334,selected 313,18,18,18,49,1161381.0,selected 314,56,56,56,54,1115598.0,selected -315,204,204,204,314,1440713.0,selected +315,204,204,204,307,1409089.0,selected 316,26,26,26,58,612536.0,selected -317,53,53,53,82,1827586.0,selected -318,169,168,168,209,1125622.0,selected -319,64,64,64,175,793459.0,selected +317,53,53,53,82,1338174.5,selected +318,169,169,169,219,1165208.0,selected +319,64,64,64,168,779574.0,selected 320,162,162,162,160,581609.0,selected 321,29,29,29,63,1154504.0,selected 323,16,16,16,87,1252435.1666666667,selected -325,55,54,54,103,461764.0,selected +325,55,55,55,105,466286.0,selected 326,1,1,1,1,284.0,selected 327,1,1,1,0,0.0,not_selected 329,1,1,1,0,0.0,not_selected 330,25,25,25,205,1631919.5,selected 331,1,1,1,15,235152.0,selected 332,1,1,1,56,326286.25,selected -334,150,149,149,185,1205713.0,selected +334,150,150,150,187,1224117.0,selected 336,71,71,71,145,1847267.0,selected 337,70,70,70,112,949012.0,selected 339,4,4,4,19,172263.5,selected @@ -82,24 +82,24 @@ area_code,input_records,retained_locality_records,eligible_locality_records,outp 341,1,1,1,0,0.0,not_selected 346,3,3,3,97,658946.7,selected 347,7,7,7,57,812461.3333333334,selected -349,1,0,0,0,0.0,no_retained_locality +349,1,1,1,1,853.0,selected 350,1,1,1,1,2253.0,selected 352,120,120,120,126,1677904.0,selected 357,1,1,1,0,0.0,not_selected -360,525,524,524,216,2249084.5,selected +360,525,525,525,216,2249084.5,selected 361,62,62,62,116,774012.0,selected -363,6,6,6,19,164028.5,selected +363,6,6,6,18,155177.0,selected 364,7,7,7,27,213848.5,selected 380,1,1,1,0,0.0,not_selected -384,1,0,0,0,0.0,no_retained_locality +384,1,1,1,1,12467.0,selected 385,19,19,19,53,682646.0,selected -386,58,58,58,70,950185.0,selected -393,2,0,0,0,0.0,no_retained_locality +386,58,58,58,69,937718.0,selected +393,2,2,2,4,19780.0,selected 401,43,43,43,81,1095391.0,selected -402,135,133,133,393,1454988.0,selected +402,135,135,135,392,1462920.0,selected 404,9,9,9,51,628465.3333333334,selected -405,116,116,116,183,1912177.0,selected -406,184,183,183,369,1105740.0,selected +405,116,116,116,181,1909732.0,selected +406,184,184,184,372,1119723.5,selected 407,65,65,65,66,1631275.0,selected 408,16,16,16,49,1149360.0,selected 409,45,45,45,67,642668.0,selected @@ -116,7 +116,7 @@ area_code,input_records,retained_locality_records,eligible_locality_records,outp 430,4,4,4,6,33844.0,selected 432,33,33,33,60,479969.0,selected 434,46,46,46,140,721434.0,selected -435,189,189,189,215,850174.0,selected +435,189,189,189,214,849658.0,selected 436,1,1,1,3,12930.5,selected 440,26,26,26,74,1127433.5,selected 442,2,2,2,1,0.0,selected @@ -124,10 +124,10 @@ area_code,input_records,retained_locality_records,eligible_locality_records,outp 445,2,2,2,5,39226.0,selected 447,2,2,2,11,72250.5,selected 448,36,36,36,14,22591.0,selected -453,1,0,0,0,0.0,no_retained_locality -456,1,0,0,0,0.0,no_retained_locality +453,1,1,1,1,516.0,selected +456,1,1,1,2,3085.0,selected 457,1,1,1,0,0.0,not_selected -458,550,548,548,119,426747.5,selected +458,550,550,550,121,426880.1666666667,selected 463,1,1,1,0,0.0,not_selected 464,1,1,1,0,0.0,not_selected 469,5,5,5,69,652393.6666666666,selected @@ -138,30 +138,30 @@ area_code,input_records,retained_locality_records,eligible_locality_records,outp 480,22,22,22,97,2301780.25,selected 483,1,1,1,0,0.0,not_selected 484,2,2,2,21,157124.83333333334,selected -486,1,0,0,0,0.0,no_retained_locality -501,111,110,110,121,990765.0,selected +486,1,1,1,38,489411.5,selected +501,111,111,111,122,990929.0,selected 502,55,55,55,101,1260079.0,selected -503,418,416,416,155,1482247.0,selected +503,418,418,418,155,1482247.0,selected 504,13,13,13,52,689834.5,selected -505,41,41,41,157,1370689.0,selected -507,237,236,236,240,839753.0,selected +505,41,41,41,155,1367345.0,selected +507,237,237,237,243,841163.0,selected 508,11,11,11,164,1540428.0,selected -509,462,461,461,248,1862724.0,selected +509,462,462,462,247,1861448.0,selected 510,31,31,31,55,1686242.0,selected 512,33,33,33,91,2309709.0,selected -513,18,18,18,93,1606474.0,selected +513,18,18,18,91,1592918.0,selected 515,53,53,53,140,892496.0,selected -516,20,20,20,75,1398673.5,selected +516,20,20,20,74,1389822.0,selected 517,28,28,28,109,961533.75,selected -518,183,183,183,322,1379116.0,selected -519,1,0,0,0,0.0,no_retained_locality +518,183,183,183,319,1369327.0,selected +519,1,1,1,3,9789.0,selected 520,173,173,173,147,1909131.25,selected -530,134,133,133,238,1352133.5,selected +530,134,134,134,238,1352133.5,selected 531,2,2,2,25,151362.0,selected -534,1,1,1,33,76022.5,selected +534,1,1,1,21,41275.5,selected 539,11,11,11,76,375014.0,selected 540,76,76,76,274,2094068.0,selected -541,769,767,767,273,1301254.5,selected +541,769,769,769,275,1301387.1666666667,selected 551,2,2,2,7,52179.0,selected 557,1,1,1,0,0.0,not_selected 559,98,98,98,111,1777565.0,selected @@ -173,62 +173,62 @@ area_code,input_records,retained_locality_records,eligible_locality_records,outp 570,96,96,96,366,1510942.0,selected 571,5,5,5,65,886610.5,selected 572,1,1,1,0,0.0,not_selected -573,168,168,168,315,1196797.0,selected +573,168,168,168,312,1193295.0,selected 574,64,64,64,86,722612.0,selected -575,45,44,44,216,746106.0,selected +575,45,45,45,216,746106.0,selected 580,270,270,270,353,1050387.0,selected 582,2,2,2,19,25907.0,selected 585,92,92,92,141,1062260.0,selected 586,14,14,14,40,864477.0,selected -590,1,0,0,0,0.0,no_retained_locality +590,1,1,1,1,1276.0,selected 601,113,113,113,165,1358123.0,selected -602,3,2,2,43,363748.25,selected -603,216,216,216,246,1387500.0,selected -605,378,371,371,375,897979.0,selected +602,3,3,3,43,363748.25,selected +603,216,216,216,245,1386360.0,selected +605,378,378,378,402,968556.0,selected 606,97,97,97,364,897133.0,selected -607,138,138,138,206,831766.0,selected -608,360,360,360,318,1749167.0,selected -609,44,43,43,112,1304381.5,selected -610,29,28,28,226,2581691.8333333335,selected -611,2,0,0,0,0.0,no_retained_locality -612,6,5,5,34,797400.0,selected +607,138,138,138,204,828299.0,selected +608,360,360,360,291,1674504.0,selected +609,44,44,44,118,1310794.5,selected +610,29,29,29,227,2588973.8333333335,selected +611,2,2,2,0,0.0,not_selected +612,6,6,6,34,797400.0,selected 614,25,25,25,69,1723175.0,selected 615,55,55,55,107,1850092.0,selected 616,17,17,17,52,1029901.0,selected 617,7,7,7,72,1458474.5,selected 618,127,127,127,318,1191996.5,selected 619,27,27,27,73,1578285.0,selected -620,221,220,220,265,609661.0,selected +620,221,221,221,264,591305.0,selected 621,1,1,1,94,616910.2,selected -622,1,0,0,0,0.0,no_retained_locality +622,1,1,1,2,1873.0,selected 623,18,18,18,80,1573589.25,selected 624,1,1,1,1,1046.5,selected 626,35,35,35,42,1403788.0,selected -627,1,0,0,0,0.0,no_retained_locality +627,1,1,1,1,17703.0,selected 628,2,2,2,29,418160.5,selected 629,1,1,1,6,113114.0,selected -630,9,8,8,58,1379779.0,selected +630,9,9,9,59,1391175.5,selected 631,23,23,23,110,1525226.0,selected -635,1,0,0,0,0.0,no_retained_locality +635,1,1,1,1,11396.5,selected 636,42,42,42,65,976996.0,selected -639,1,0,0,0,0.0,no_retained_locality +639,1,1,1,1,104.0,selected 640,1,1,1,9,31807.5,selected 641,72,72,72,250,470730.0,selected -642,1,0,0,0,0.0,no_retained_locality +642,1,1,1,1,446.0,selected 646,17,17,17,58,333885.25,selected 650,36,36,36,39,954535.0,selected 651,70,70,70,69,1181181.0,selected -655,1,0,0,0,0.0,no_retained_locality +655,1,1,1,2,2649.0,selected 657,1,1,1,4,87538.0,selected 659,1,1,1,0,0.0,not_selected 660,167,167,167,229,434415.0,selected 661,55,55,55,60,1512997.0,selected -662,181,181,181,235,1158482.0,selected +662,181,181,181,233,1156609.0,selected 667,4,4,4,54,421944.13333333336,selected 669,3,3,3,32,553094.0,selected -670,2,0,0,0,0.0,no_retained_locality +670,2,2,0,0,0.0,outside_zcta_states 671,1,1,0,0,0.0,outside_zcta_states -672,1,0,0,0,0.0,no_retained_locality +672,1,1,0,0,0.0,outside_zcta_states 678,4,4,4,45,420698.6666666667,selected 679,2,2,2,0,0.0,not_selected 680,3,3,3,2,8683.0,selected @@ -236,33 +236,33 @@ area_code,input_records,retained_locality_records,eligible_locality_records,outp 682,2,2,2,46,573491.1666666666,selected 684,2,2,0,0,0.0,outside_zcta_states 689,1,1,1,0,0.0,not_selected -701,401,400,400,388,778556.0,selected -702,21,20,20,76,2141300.0,selected +701,401,401,401,396,791295.0,selected +702,21,21,21,90,2341085.0,selected 703,7,7,7,79,1293539.5,selected 704,71,71,71,122,2467616.0,selected -706,134,132,132,197,1998223.0,selected -707,118,118,118,151,1473463.0,selected +706,134,134,134,202,2018900.0,selected +707,118,118,118,151,1473359.0,selected 708,82,82,82,83,1601918.0,selected 712,87,87,87,270,556654.0,selected 713,15,15,15,110,1251121.7,selected 714,9,9,9,44,1712647.0,selected -715,7,7,7,109,644854.5,selected +715,7,7,7,94,602449.5,selected 716,64,64,64,149,1304519.5,selected 717,19,19,19,196,1508027.0,selected -718,13,13,13,121,4335015.333333333,selected +718,13,13,13,121,4209775.333333333,selected 719,119,119,119,168,1148368.0,selected -720,7,6,6,62,1175307.6666666667,selected -722,1,0,0,0,0.0,no_retained_locality +720,7,7,7,64,1177085.6666666667,selected +722,1,1,1,11,197327.0,selected 724,39,39,39,353,1515985.6666666667,selected -725,5,4,4,12,152483.0,selected +725,5,5,5,13,174564.0,selected 726,1,1,1,59,927090.0,selected 727,45,45,45,56,1197710.0,selected 730,1,1,1,4,1828.5,selected -731,85,85,85,112,518297.0,selected -732,30,29,29,109,1948107.5,selected +731,85,85,85,110,515212.0,selected +732,30,30,30,113,2073347.5,selected 734,26,26,26,55,1106111.0,selected 737,1,1,1,0,0.0,not_selected -740,38,38,38,291,1319218.5,selected +740,38,38,38,289,1314808.5,selected 747,5,5,5,88,843052.5,selected 748,1,1,1,1,512.0,selected 754,1,1,1,7,172985.0,selected @@ -270,20 +270,20 @@ area_code,input_records,retained_locality_records,eligible_locality_records,outp 760,79,79,79,135,1989949.0,selected 762,3,3,3,9,105422.0,selected 763,55,55,55,37,674605.0,selected -765,201,201,201,213,1127447.0,selected +765,201,201,201,212,1126436.0,selected 769,3,3,3,4,31695.0,selected -770,86,85,85,203,4998632.666666667,selected -772,29,29,29,31,672502.0,selected +770,86,86,86,203,4998632.666666667,selected +772,29,29,29,20,475175.0,selected 773,3,3,3,56,897075.3333333334,selected -774,3,2,2,35,250527.0,selected -775,57,56,56,104,846876.0,selected -778,1,0,0,0,0.0,no_retained_locality +774,3,3,3,36,251708.0,selected +775,57,57,57,104,846610.6666666666,selected +778,1,1,0,0,0.0,outside_zcta_states 779,3,3,3,9,10350.5,selected 781,7,7,7,59,978996.5,selected -785,231,231,231,307,780902.0,selected -786,5,3,3,61,977257.0,selected +785,231,231,231,306,780456.0,selected +786,5,5,5,62,1015015.5,selected 787,9,9,9,132,3006915.5,selected -800,1,0,0,0,0.0,no_retained_locality +800,1,1,1,0,0.0,not_selected 801,52,52,52,85,1811644.0,selected 802,256,256,256,265,645254.0,selected 803,110,110,110,149,1756437.0,selected @@ -292,14 +292,14 @@ area_code,input_records,retained_locality_records,eligible_locality_records,outp 806,121,121,121,180,881959.0,selected 808,148,148,148,97,1445635.0,selected 810,22,22,22,62,670089.75,selected -812,190,190,190,265,1345239.5,selected +812,190,190,190,264,1345149.5,selected 813,48,48,48,65,1780976.0,selected 814,96,96,96,436,1297365.0,selected -815,59,58,58,259,1663801.5,selected +815,59,59,59,271,1710331.5,selected 816,87,87,87,154,1389068.0,selected 817,44,44,44,93,1767122.1666666667,selected 818,14,14,14,126,1823383.5,selected -820,4,1,1,3,29686.5,selected +820,4,4,4,5,30787.5,selected 821,2,2,2,2,3900.5,selected 828,89,89,89,130,1186881.0,selected 830,82,82,82,122,866123.0,selected @@ -325,18 +325,18 @@ area_code,input_records,retained_locality_records,eligible_locality_records,outp 862,2,2,2,10,163822.5,selected 863,72,72,72,65,1136410.0,selected 864,65,65,65,121,1543525.5,selected -865,32,32,32,72,1028755.0,selected -870,329,328,328,379,1106081.0,selected +865,32,32,32,69,1013248.0,selected +870,329,329,329,378,1105915.0,selected 872,2,2,2,56,897075.3333333334,selected -877,1,0,0,0,0.0,no_retained_locality +877,1,1,1,1,7282.0,selected 878,2,2,2,60,261775.66666666666,selected -885,1,0,0,0,0.0,no_retained_locality -888,1,0,0,0,0.0,no_retained_locality +885,1,1,1,3,15507.0,selected +888,1,1,1,0,0.0,not_selected 901,25,25,25,55,1026506.0,selected 903,153,153,153,222,1428434.0,selected 904,39,39,39,63,1650501.0,selected -906,26,26,26,135,310975.0,selected -907,98,97,97,245,733346.0,selected +906,26,26,26,129,304562.0,selected +907,98,98,98,245,733346.0,selected 908,23,23,23,79,1009658.0,selected 909,34,34,34,68,1904719.3333333333,selected 910,136,136,136,158,1682177.0,selected @@ -346,19 +346,19 @@ area_code,input_records,retained_locality_records,eligible_locality_records,outp 915,25,25,25,55,882756.0,selected 916,17,17,17,63,1803153.0,selected 917,12,12,12,112,1103007.5833333333,selected -918,14,14,14,114,657650.0,selected +918,14,14,14,113,645553.0,selected 919,49,49,49,100,1949247.5,selected -920,218,218,218,216,1256190.0,selected +920,218,218,218,203,1241039.0,selected 924,1,1,1,0,0.0,not_selected 925,46,46,46,36,1127028.0,selected -927,1,0,0,0,0.0,no_retained_locality +927,1,1,1,10,44442.0,selected 928,393,393,393,178,1118343.0,selected 929,3,3,3,8,212049.0,selected 930,6,6,6,20,215254.5,selected 931,72,72,72,143,1030631.0,selected 934,1,1,1,4,52147.0,selected 936,58,58,58,101,890746.0,selected -937,30,30,30,179,1441585.0,selected +937,30,30,30,173,1415109.0,selected 938,1,1,1,0,0.0,not_selected 939,2,2,2,20,247969.5,selected 940,74,74,74,95,701461.0,selected @@ -369,14 +369,14 @@ area_code,input_records,retained_locality_records,eligible_locality_records,outp 951,22,22,22,53,2064580.3333333333,selected 952,40,40,40,49,842300.0,selected 954,3,3,3,29,957846.0,selected -956,70,70,70,72,1681656.0,selected +956,70,70,70,68,1663292.0,selected 959,8,8,8,15,120711.5,selected -970,145,144,144,212,1334473.0,selected -971,352,350,350,104,1028588.0,selected +970,145,145,145,212,1334473.0,selected +971,352,352,352,104,1028588.0,selected 972,68,68,68,158,3500046.6666666665,selected -973,27,25,25,116,1703324.5,selected +973,27,27,27,116,1703324.5,selected 975,1,1,1,0,0.0,not_selected -977,1,0,0,0,0.0,no_retained_locality +977,1,1,1,7,13885.0,selected 978,9,9,9,91,1417452.0,selected 979,58,58,58,91,726456.0,selected 980,2,2,2,2,16174.0,selected @@ -384,4 +384,4 @@ area_code,input_records,retained_locality_records,eligible_locality_records,outp 984,3,3,3,21,364074.5,selected 985,41,41,41,101,992006.0,selected 986,1,1,1,1,18.0,selected -989,52,52,52,192,1015622.0,selected +989,52,52,52,191,992829.0,selected diff --git a/scripts/person_data/build_report.json b/scripts/person_data/build_report.json index f6f252c54..edca502ad 100644 --- a/scripts/person_data/build_report.json +++ b/scripts/person_data/build_report.json @@ -2,55 +2,31 @@ "rows": 33772, "population_total": 335555510.0, "methods": { - "explicit_postcode_association": 18749, - "nearest_locality_same_state": 15023 + "explicit_postcode_association": 18786, + "nearest_locality_same_state": 14986 }, - "candidate_assignments": 37239, - "zipcodes_with_multiple_area_codes": 2322, + "candidate_assignments": 37294, + "zipcodes_with_multiple_area_codes": 2374, "raw_locality_rows": 22913, "noncanonical_rows_excluded": 116, - "curated_locality_rows_excluded": 92, - "accepted_locality_records": 22705, - "accepted_locality_items": 20860, + "accepted_locality_records": 22797, + "accepted_locality_items": 20928, "area_code_coverage": { "input_codes": 386, - "retained_codes": 358, - "eligible_codes": 355, - "output_codes": 333, - "no_retained_locality": [ + "retained_codes": 386, + "eligible_codes": 377, + "output_codes": 352, + "no_retained_locality": [], + "outside_zcta_states": [ 236, 250, 257, - 349, - 384, - 393, - 453, - 456, - 486, - 519, - 590, - 611, - 622, - 627, - 635, - 639, - 642, - 655, - 670, - 672, - 722, - 778, - 800, - 877, - 885, - 888, - 927, - 977 - ], - "outside_zcta_states": [ 340, + 670, 671, - 684 + 672, + 684, + 778 ], "not_selected": [ 274, @@ -68,24 +44,27 @@ 557, 567, 572, + 611, 659, 679, 689, 737, + 800, + 888, 924, 938, 975 ], - "reconciliation_sha256": "6b18cc988b83ef3a2de4c4954a39dc52267b536ecda11aaf230e5299b220954a" + "reconciliation_sha256": "b4f281325c1a647783acae16a39c138f27cea8012ead2ee43c899e39ed9e6237" }, "distant_explicit_associations_excluded": 46, - "nearest_locality_fallbacks_over_50km": 348, + "nearest_locality_fallbacks_over_50km": 335, "locality_distance_km_quantiles": { - "0.5": 6.5035926030747735, - "0.9": 19.572534448154848, - "0.95": 25.88603157156294, - "0.99": 50.42410233449431, + "0.5": 6.4811363499852614, + "0.9": 19.531414536518493, + "0.95": 25.763850358261713, + "0.99": 49.67497193169035, "1.0": 230.84417705249874 }, - "output_sha256": "b6fc7c8c27b008b8f0da89dfa75a4e2e5693cce18ae0c8a0d3527e326e17e5dd" + "output_sha256": "2af85012fadbd44d907d9785f56051639c51ed7b37104d93c704b0cbf328256b" } diff --git a/scripts/person_data/excluded_localities.csv b/scripts/person_data/excluded_localities.csv deleted file mode 100644 index 652c45e99..000000000 --- a/scripts/person_data/excluded_localities.csv +++ /dev/null @@ -1,93 +0,0 @@ -qid,area_code,longitude,latitude,state -Q881120,201,-67.868611111,46.504722222,ME -Q4788559,250,-124.0,54.0, -Q1952785,216,-94.20638889,47.92527778,MN -Q3261921,360,-84.760555555,33.550555555,GA -Q4788610,236,-124.0,54.0, -Q436898,349,-89.58139,37.63111,MO -Q684406,393,-75.483333333,44.7,NY -Q2272332,393,-75.435555555,44.5525,NY -Q27988976,509,-121.77638889,45.69805556,OR -Q2227968,770,-92.39797,46.66355,MN -Q518466,725,-69.963055555,43.910833333,ME -Q7580837,970,-122.329722222,45.518888888,OR -Q2431419,501,-101.281944444,48.971388888,ND -Q342064,605,-107.623611111,35.065833333,NM -Q1783975,605,-89.931666666,44.121666666,WI -Q1887524,605,-89.3643323,45.2478878,WI -Q2304624,605,-71.558611111,44.654166666,NH -Q5817097,605,-89.638333333,42.601111111,WI -Q7589473,605,-89.052777777,44.454166666,WI -Q2582333,605,-91.2522,36.0067,AR -Q2381270,384,-82.340833333,30.021666666,FL -Q286148,627,-73.693333333,40.792777777,NY -Q136503722,639,-123.6,39.8,CA -Q2270773,870,-97.168611111,35.134722222,OK -Q584340,722,-80.335555555,27.438888888,FL -Q2218020,318,-91.796666666,44.4575,WI -Q370523,620,-96.870833333,35.894166666,OK -Q1592949,610,-73.99715,40.722263888,NY -Q2200776,630,-83.83051,42.95725,MI -Q951376,774,-84.5383,32.0608,GA -Q518097,519,-73.65,43.05,NY -Q2200776,635,-83.83051,42.95725,MI -Q6646528,530,-120.297222222,41.994166666,OR -Q1886236,402,-87.869444444,44.029722222,WI -Q3709190,402,-75.098055555,43.096111111,NY -Q7410310,973,-122.974166666,42.491666666,OR -Q7970633,973,-122.016,45.6126,OR -Q3708399,325,-76.341666666,43.123055555,NY -Q602784,701,-88.714166666,45.743611111,WI -Q600237,720,-95.1708,37.9161,KS -Q114222598,971,-122.3337357,47.4631546,WA -Q114358755,971,-122.6507302,48.5728826,WA -Q14682133,458,-121.51944444,41.99805556,CA -Q2572411,458,-117.718333333,41.9975,NV -Q979819,885,-83.700443,36.150854,TN -Q2535145,702,-104.917,39.8389,CO -Q4788610,257,-124.0,54.0, -Q735981,977,-91.861111111,41.994722222,IA -Q67077,208,-87.907178,32.993811,AL -Q67870,208,-86.943126,34.241338,AL -Q1898553,312,-118.253,33.9175,CA -Q51679,670,145.75,15.183333333,MP -Q93022,706,-99.015833333,26.405,TX -Q3150256,670,145.75,15.18333333,MP -Q9049890,706,-76.370277777,42.022222222,NY -Q1630163,732,-73.981086,40.702553,NY -Q2527718,786,-97.7597,38.9694,KS -Q4532801,786,-73.988211111,40.718497222,NY -Q3287686,456,-88.245,36.037222222,TN -Q647127,225,-100.018333333,37.759722222,KS -Q6346,486,-86.158055555,39.768611111,IN -Q2418283,602,-71.768888888,42.743611111,NH -Q1264177,453,-112.751388888,40.231111111,UT -Q14623578,800,-74.010694444,40.710972222,NY -Q1592949,877,-73.99715,40.722263888,NY -Q14682133,541,-121.51944444,41.99805556,CA -Q114222598,503,-122.3337357,47.4631546,WA -Q114358755,503,-122.6507302,48.5728826,WA -Q1976579,334,-85.0669,36.9847,KY -Q2572411,541,-117.718333333,41.9975,NV -Q1506783,590,-120.543,46.4042,WA -Q968951,655,-91.5006,40.0422,MO -Q1842438,507,-98.105,40.431944444,NE -Q483932,406,-116.6,48.29,ID -Q7231843,907,-107.701,38.081,CO -Q5127590,820,-85.3478,39.4333,IN -Q5969554,820,-85.3075,39.41,IN -Q5969554,820,-85.3078,39.4103,IN -Q2303201,622,-90.1364,34.1731,MS -Q1887361,815,-89.742935,45.3180179,WI -Q7546719,302,-75.570738,42.687292,NY -Q3128858,612,-122.428,37.7728,CA -Q549475,575,-123.0,45.5,OR -Q6160569,775,-120.048,39.5094,CA -Q14931631,888,-74.013888888,40.706111111,NY -Q1966409,611,-117.833611111,34.617777777,CA -Q3458813,611,-119.389166666,35.85,CA -Q2673377,642,-97.7664,39.2747,KS -Q949651,927,-83.8292,39.4458,OH -Q4788610,778,-124.0,54.0, -Q4788610,672,-124.0,54.0, -Q2738898,609,-88.333888888,46.098055555,MI diff --git a/scripts/person_data/rebuild.py b/scripts/person_data/rebuild.py index f1d83b6af..edb2efe93 100644 --- a/scripts/person_data/rebuild.py +++ b/scripts/person_data/rebuild.py @@ -29,7 +29,8 @@ / "packages/data-designer-engine/src/data_designer/engine/sampling_gen/entities/assets/zip_area_code_map.parquet" ) SOURCE_REVISION_URL = ( - "https://github.com/NVIDIA-NeMo/DataDesigner/tree/eae83186b32d7c62ee880c6f538bda46a6831c72/scripts/person_data" + "https://github.com/NVIDIA-NeMo/DataDesigner/tree/" + "43b49ab5cb4353d8a16f0cb9813bc20fc0eea1b8/scripts/person_data/snapshots" ) @@ -251,9 +252,6 @@ def reconcile_area_codes( def rebuild(cache: Path, output: Path, report_dir: Path, offline: bool = False) -> dict: """Rebuild the asset and write row-level lineage and a validation summary.""" manifest = json.loads((ROOT / "sources.json").read_text()) - excluded_bytes = (ROOT / "excluded_localities.csv").read_bytes() - if hashlib.sha256(excluded_bytes).hexdigest() != manifest["excluded_localities_sha256"]: - raise ValueError("Exclusion snapshot checksum mismatch") inputs = {name: read_source(name, source, cache, offline) for name, source in manifest["sources"].items()} states = load_state_polygons(inputs["census-state-boundaries-full-2023.zip"]) @@ -280,11 +278,6 @@ def rebuild(cache: Path, output: Path, report_dir: Path, offline: bool = False) if not localities.latitude.between(-90, 90).all() or not localities.longitude.between(-180, 180).all(): raise ValueError("Invalid locality coordinates") localities["state"] = states_for(localities, "longitude", "latitude", states) - excluded = pd.read_csv(io.BytesIO(excluded_bytes)) - excluded_pairs = pd.MultiIndex.from_frame(excluded[["qid", "area_code"]]) - accepted = ~pd.MultiIndex.from_frame(localities[["qid", "area_code"]]).isin(excluded_pairs) - rejected = localities[~accepted] - localities = localities[accepted].copy() population = pd.read_csv(io.BytesIO(inputs["census-acs5-2023-b01003.dat"]), sep="|", dtype={"GEO_ID": str}) population = population[population.GEO_ID.str.fullmatch(r"860Z200US\d{5}")].copy() @@ -345,7 +338,6 @@ def rebuild(cache: Path, output: Path, report_dir: Path, offline: bool = False) "zipcodes_with_multiple_area_codes": int((result.area_codes.str.len() > 1).sum()), "raw_locality_rows": len(raw), "noncanonical_rows_excluded": len(raw) - len(rows), - "curated_locality_rows_excluded": len(rejected), "accepted_locality_records": len(localities), "accepted_locality_items": int(localities.qid.nunique()), "area_code_coverage": { diff --git a/scripts/person_data/sources.json b/scripts/person_data/sources.json index 5a887f667..d65893cb1 100644 --- a/scripts/person_data/sources.json +++ b/scripts/person_data/sources.json @@ -37,14 +37,5 @@ "license": "CC0-1.0", "license_url": "https://www.wikidata.org/wiki/Wikidata:Licensing" } - }, - "excluded_localities_sha256": "dc1d1ae22bc8ee4ecd2641a8d19b760f7612a1e6e4950c1fb0649b21f8a01e2b", - "validation_reference": { - "name": "NANPA NPA database", - "url": "https://reports.nanpa.com/public/npa_report.csv", - "retrieved": "2026-11-06", - "sha256": "dcbbcd9143d91a19c8573d2ffbb1777cfff10f7f16e86cd52cf2b8930c26b5bb", - "role": "Screening reference for foreign, inactive, and wrong-state Wikidata locality associations; report not redistributed or required for rebuilding.", - "license": "No explicit open-data license established; not claimed to be CC0 or public domain." } }