使用JSON从BLS人工统计创建表

时间:2014-01-19 23:00:13

标签: python json dictionary

我对Python很新,但是已经有很长一段时间没有处理过问题了。 BLS网站使用JSON交互格式。我已经能够处理数据调用以生成输出表文件。但是,我不想逐行打印到outfile,而是建立一个表,我可以按行号ID(从最小到最大)对行进行排序,并按观察(从最小到最大)对日期条目进行排序。这样做的一个动机是可以想象列表中观察的顺序可能不会排列在所有序列上(更可能是其他BLS数据序列的情况)。我还想将其迁移到动态网页,以报告最新的就业统计数据。我目前的工作代码如下。

#JSON call to //api.bls.gov/ retrieve and print "National Employment by Major Industry"

import requests
import json
headers = {'Content-type': 'application/json'}
data = json.dumps({"seriesid":        ['CES0000000001','CES1000000001','CES2000000001','CES3000000001','CES4000000001','CES5000000001','CES5500000001','CES6000000001','CES6500000001','CES7000000001','CES8000000001','CES9091000001','CES9092000001','CES9093000001'],"startyear":"2012", "endyear":"2012"})
p = requests.post('http://api.bls.gov/publicAPI/v1/timeseries/data/', data=data, headers=headers)
print p.url
print p.content
json_data = json.loads(p.text)
d_results = json_data['Results']  #Dictionary: seriesID: str, data: list of data by date
l_series = d_results['series']    #List of Dictionaries

makeheader = 'True'
f=open('outfile.csv','w')
for lst in sorted(l_series):
    tmp = lst                   #Dictionary: seriesID: str, data: list of data observation dictionaries
#    type(tmp)
    tmpp = tmp['data']          #List of data observation dictionaries
    if makeheader == 'True':
        for ent in tmp['data']:
            f.write( ',' + ent['year'] + ":" + ent['period'] ),  #create observation marker as YYYY:MM
        makeheader = 'False'
    f.write('\n')
    f.write(tmp['seriesID'] ),
    for ent in tmp['data']:
        f.write(',' + ent['value'] ),
f.close

我考虑过制作可以排序的seriesID和观察列表。然后我可以使用这些列表从字典的json列表中提取数据,但我不确定在列表中找到正确字典的最佳方法是什么。第一部分如下所示:

# continuation...
s1 = []                  # Get and sort series IDs
for ent in l_series:
    s1.append(ent['seriesID'])
s1.sort()

d1 = []                  # Get and sort observations (currently collected as tubles)
for ent in l_series[0]['data']:
    d1.append( (ent['year'] + ":" + ent['period'] , ent['year'] , ent['period']) )
d1.sort()

所以,我希望得到一些关于从这个小组开始的策略的指导。任何想法都将不胜感激。

1 个答案:

答案 0 :(得分:0)

我建议将BLS数据直接加载到关系数据库中,例如SQLite,其关系是“日期”。我看起来不太难,但这应该有效: Convert JSON to SQLite in Python - How to map json keys to database columns properly?

然后,如果要在两个不同来源(例如失业和通货膨胀)之间“排列”所有系列数据,则可以执行SQL连接查询。例如:

SELECT unemployment.*,inflation.* FROM unemployment 
INNER JOIN inflation ON unemployment.date = inflation.date;

排序方法的问题在于,您必须解决已经由关系数据库解决的几个问题,例如“当行在表A中时要做什么,但不是B”或“你有一个表A中的重复条目“等。