From 860409df68bb362588093f0e2720c246fe5896ef Mon Sep 17 00:00:00 2001 From: Derek Eder Date: Sun, 3 May 2026 17:06:29 -0500 Subject: [PATCH 1/2] add 2000 to supported_years for geo_block --- census_area/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/census_area/core.py b/census_area/core.py index bdc87ff..f55f334 100644 --- a/census_area/core.py +++ b/census_area/core.py @@ -302,7 +302,7 @@ def state_place_block(self, *args, **kwargs): ''' return self._state_place_area(self.geo_block, *args, **kwargs) - @supported_years(2020, 2010) + @supported_years(2020, 2010, 2000) def geo_block(self, fields, geojson_geometry, year): ''' Retrieve variable values for blocks intersecting with an arbitrary From 9c355a260a9ecdd1f3e55a12edbf435a5b5b5203 Mon Sep 17 00:00:00 2001 From: Derek Eder Date: Sun, 3 May 2026 18:05:27 -0500 Subject: [PATCH 2/2] fix support for year 2000, added test --- .gitignore | 3 +- census_area/core.py | 7 +- test_geo_block_2000.py | 30 +++++ ...est_geo_block.cpython-314-pytest-9.0.3.pyc | Bin 0 -> 11314 bytes tests/test_geo_block.py | 106 ++++++++++++++++++ 5 files changed, 141 insertions(+), 5 deletions(-) create mode 100644 test_geo_block_2000.py create mode 100644 tests/__pycache__/test_geo_block.cpython-314-pytest-9.0.3.pyc create mode 100644 tests/test_geo_block.py diff --git a/.gitignore b/.gitignore index e946e6d..33d9ca3 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ census_area.egg-info/ census_area/__pycache__/ -docs/_build/ \ No newline at end of file +docs/_build/ +venv \ No newline at end of file diff --git a/census_area/core.py b/census_area/core.py index f55f334..e56da4c 100644 --- a/census_area/core.py +++ b/census_area/core.py @@ -128,7 +128,7 @@ def geo_tract(self, fields, geojson_geometry, year=None, **kwargs): within = 'state:{state} county:{county}'.format(**context) tract_id = tract['properties']['TRACT'] - result = self.get(fields, + result = self.get(tuple(fields), HashDict({'for': 'tract:{}'.format(tract_id), 'in': within}), year, @@ -171,7 +171,7 @@ def geo_blockgroup(self, fields, geojson_geometry, year=None, **kwargs): 'tract': block_group['properties']['TRACT']} within = 'state:{state} county:{county} tract:{tract}'.format(**context) - tract_blockgroups = self.get(fields, + tract_blockgroups = self.get(tuple(fields), HashDict({'for': 'block group:*', 'in': within}), year, @@ -332,7 +332,7 @@ def geo_block(self, fields, geojson_geometry, year): 'tract': block['properties']['TRACT']} within = 'state:{state} county:{county} tract:{tract}'.format(**context) - tract_blocks = self.get(fields, + tract_blocks = self.get(tuple(fields), HashDict({'for': 'block:*', 'in': within}), year) @@ -343,7 +343,6 @@ def geo_block(self, fields, geojson_geometry, year): if result: result, = result else: - breakpoint() result = {} yield block, result, intersection_proportion diff --git a/test_geo_block_2000.py b/test_geo_block_2000.py new file mode 100644 index 0000000..20b4cb2 --- /dev/null +++ b/test_geo_block_2000.py @@ -0,0 +1,30 @@ +import os +from census_area import SF1Client + +API_KEY = os.environ.get('CENSUS_API_KEY') +if not API_KEY: + raise SystemExit('Set the CENSUS_API_KEY environment variable first.') + +# Small polygon covering a few blocks in Chicago's Loop +geometry = { + 'type': 'Polygon', + 'coordinates': [[ + [-87.6320, 41.8827], + [-87.6290, 41.8827], + [-87.6290, 41.8850], + [-87.6320, 41.8850], + [-87.6320, 41.8827], + ]] +} + +client = SF1Client(API_KEY) + +print('Querying geo_block for year 2000...') +results = list(client.geo_block(['P001001'], geometry, year=2000)) +print(f'Found {len(results)} blocks\n') + +for block, result, proportion in results: + props = block['properties'] + print(f"Block {props['STATE']}{props['COUNTY']}{props['TRACT']}{props['BLOCK']}" + f" population={result.get('P001001', 'N/A')}" + f" overlap={proportion:.1%}") diff --git a/tests/__pycache__/test_geo_block.cpython-314-pytest-9.0.3.pyc b/tests/__pycache__/test_geo_block.cpython-314-pytest-9.0.3.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c1c23456f657f0e42d2b1af958da927f097ae3c7 GIT binary patch literal 11314 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