美国人口普查API - 使用Python获取一个州的每个城市的人口

时间:2015-03-08 23:38:49

标签: python python-3.x census

我遇到了让每个城市的人口都处于特定状态的问题。我确实得到了城市的人口,但是如果我把每个城市的人口总和得出的话,那么我的人口数量和国家的数量并不相同。

我的API Key使用P0010001 variable总人口使用FIPS 25为马萨诸塞州,并按geography level "place"请求人口,我理解为城市。< / p>

这是我使用的Python 3代码:

import urllib.request
import ast


class Census:
    def __init__(self, key):
        self.key = key

    def get(self, fields, geo, year=2010, dataset='sf1'):
        fields = [','.join(fields)]
        base_url = 'http://api.census.gov/data/%s/%s?key=%s&get=' % (str(year), dataset, self.key)
        query = fields
        for item in geo:
            query.append(item)
        add_url = '&'.join(query)
        url = base_url + add_url
        print(url)
        req = urllib.request.Request(url)
        response = urllib.request.urlopen(req)
        return response.read()

c = Census('<mykey>')
state = c.get(['P0010001'], ['for=state:25'])
# url: http://api.census.gov/data/2010/sf1?key=<mykey>&get=P0010001&for=state:25
county = c.get(['P0010001'], ['in=state:25', 'for=county:*'])
# url: http://api.census.gov/data/2010/sf1?key=<mykey>&get=P0010001&in=state:25&for=county:*
city = c.get(['P0010001'], ['in=state:25', 'for=place:*'])
# url: http://api.census.gov/data/2010/sf1?key=<mykey>&get=P0010001&in=state:25&for=place:*

# Cast result to list type
state_result = ast.literal_eval(state.decode('utf8'))
county_result = ast.literal_eval(county.decode('utf8'))
city_result = ast.literal_eval(city.decode('utf8'))

def count_pop_county():
    count = 0
    for item in county_result[1:]:
        count += int(item[0])
    return count

def count_pop_city():
    count = 0
    for item in city_result[1:]:
        count += int(item[0])
    return count

以下是结果:

print(state)
# b'[["P0010001","state"],\n["6547629","25"]]'

print('Total state population:', state_result[1][0])
# Total state population: 6547629

print('Population in all counties', count_pop_county())
# Population in all counties 6547629

print('Population in all cities', count_pop_city())
# Population in all cities 4615402

我很确定'地方'就是这个城市,例如

# Get population of Boston (FIPS is 07000)
boston = c.get(['P0010001'], ['in=state:25', 'for=place:07000'])
print(boston)
# b'[["P0010001","state","place"],\n["617594","25","07000"]]'

我做错了什么或误会了? 为什么按地点划分的人口总数不等于州的人口?

List of example API calls

2 个答案:

答案 0 :(得分:4)

如果我总结每个城市的人口数量,我就不会得到与该州人口相同的数字。

那是因为不是每个人都生活在一个城市 - 有农村&#34;非法人区域&#34;在许多不属于任何城市的县,人们确实住在那里。

所以,这不是编程问题! - )

答案 1 :(得分:1)

@Delicious - 人口普查有几个级别的地理区域可用。我不能立即确定数据API的停止位置(人口普查归结为个别区块,但我认为API不会因为人类主题原因),但人口普查区,人口普查区,ZCTA(邮政编码列表区域 - 基本上是地图的邮政编码将涵盖地理范围,并包括子县级的未纳入人口。

您可以在人口普查数据网站上使用这些不同级别(以及使用地图绘制工具):factfinder.census.gov - &gt;高级搜索。