Python爬蟲教學|美國勞動部統計局API|失業率

  • Post author:
  • Reading time:4 mins read

美國科技業近期大裁員,媒體上充滿失業率的話題,美國失業率的指標要去哪裡抓?
本篇文章介紹如何使用「美國勞動部統計局」的 API 來撈取美國總經數據,把總經分析戰線擴充到國際市場。

API 註冊

美國勞動部統計局有開放 Python API 給開發者使用,建議去用信箱註冊一個 API 帳號,不然未註冊月戶每天只有25次取資料的權限,實在是很少,申請過後每日就能有 500 次Request。
註冊只要填信箱,送出後就會寄出 API key 的生效確認信,點擊確認後即可生效。

API 規範

建議使用 API Version 2.0,權限開比較多。更多常見問題可見 Q&A
How is API Version 2.0 different from Version 1.0?API Version 2.0 requires registration, and it offers greater query limits. It also allows users to request net and percent changes and series description information. See below for more details.

ServiceVersion 2.0
(Registered)
Version 1.0
(Unregistered)
Daily query limit50025
Series per query limit5025
Years per query limit2010
Request rate limit50 requests per 10 seconds50 requests per 10 seconds
Net/Percent ChangesYesNo
Optional annual averagesYesNo
Series description information (catalog)YesNo
美國勞動部統計局API版本差異

如何使用 API ?

詳見開發者文件範例,以下舉爬取「失業率」當例子:
首先要傳入payload內的參數設定,seriesid 為 指標代號,常用指標代號可在官網相關頁面查詢或透過 API 取得常用代號列表。
startyear 為資料開始年度。
endyear 為資料結束年度。
registrationkey 為 api_key,有註冊的話要記得填喔

截圖 2022 11 10 下午2.58.05
失業率response

就這麼簡單將 json 檔下載下來,就可以取得時間序列資料。

失業率發布日

原始資料有一個問題是無法直接取得資料公告時間,只能知道數值是哪一個月份,以失業率來說,美國官方會預告發佈時間,原則上失業率是每個月第一個星期五,但偶爾會因為假日或其他因素遞延。

截圖 2022 11 10 下午4.51.51
勞動部統計局就業數據預計發布日


為避免使用到未來資料,我們使用每月10日當安全數值。以下為Python爬蟲完整程式,主要加上處理發布日期的部分,發便未來回測使用。

import requests
import json
import pandas as pd

def crawl_data(start_year, end_year, api_key='xxxx'):

    headers = {'Content-type': 'application/json'}
    # seriesid:傳入目標資料
    data = json.dumps({"seriesid": ['LNS14000000'],"startyear":start_year, "endyear":end_year, "registrationkey":api_key})
    p = requests.post('https://api.bls.gov/publicAPI/v2/timeseries/data/', data=data, headers=headers)
    json_data = json.loads(p.text)

    # 將資料轉成dataframe
    df = pd.DataFrame(json_data['Results']['series'][0]['data'])

    # 將資料日期轉成公告日,當月失業率在下一個月才公告
    latest_year = int(df['year'].iloc[0])
    latest_month = int(df['period'].iloc[0].replace('M',''))
    start_year = int(df['year'].iloc[-1])
    start_month = int(df['period'].iloc[-1].replace('M',''))

    def process_date(year,month):
        if month == 12:
            month = 1
            year += 1
        else:
            month += 1
        return year,month

    latest_year, latest_month = process_date(latest_year, latest_month)
    start_year, start_month = process_date(start_year, start_month)
    issue_date = pd.date_range(f'{start_year}-{start_month}-1', f'{latest_year}-{latest_month}-1',
                               freq='MS') + pd.tseries.offsets.DateOffset(days=9)
    df_new = pd.DataFrame({'value': df['value'].values[::-1]}, index=issue_date)
    df_new['value'] = df_new['value'].astype(float)
    df_new.index.name = 'date'
    return df_new

df = crawl_data('2015', '2023')
df

小結

colab範例檔
美國勞動部統計局有許多非常重要的資料,除了就業相關數據如失業率、非農、就業津貼,還有物價指數CPI、PPI,都能幫助我們後續做分析,趕緊學會該 API 的使用法則,打造總經分析武器庫。
想知道美國失業率如何應用在美國指數的擇時回測嗎?可以繼續看「用Python回測總經指標(2)|美國失業率 vs S&P 500指數」踏入更豐富的數據世界。

Ben

Python 軟體工程師與量化策略研究員。 鑽研資料工程、網頁後端、資料視覺化、量化交易策略開發。 投資主力在台股市場,量化策略為主、質化分析為輔,追求人機攜做最佳化。逐步將觸角延伸到總經、美股、加密貨幣,朝更全方位的交易人邁進。