Bureau of Labor Statistics API wrapper

Build Status Gem Version

This is a Ruby wrapper for v2 of the BLS Public Data API.

Installation

$ gem install bls_api

Usage

>> require "bls_api"
>> client = BLS_API::Client.new
>> data = client.get(:series_ids => ["LNS14000000"], :start_year => 2015, :end_year => 2015)

You'll get back a Hash, with the series IDs you provided as keys. The values are BLS_API::Series instances, which expose the data for each series along with some BLS-provided metadata:

>> unemployment_rate = data["LNS14000000"]

>> unemployment_rate.catalog.series_title
=> "(Seas) Unemployment Rate"
>> unemployment_rate.catalog.seasonality
=> "Seasonally Adjusted"

>> june = unemployment_rate.get_month(2015, 6)
>> june.value.to_f
=> 5.3

Series metadata

Series#catalog just returns an OpenStruct with whatever metadata the BLS API returned for that series:

>> unemployment_rate.catalog
=> #<OpenStruct series_title="(Seas) Unemployment Rate",
series_id="LNS14000000", seasonality="Seasonally Adjusted",
survey_name="Labor Force Statistics from the Current Population Survey",
measure_data_type="Percent or rate", commerce_industry="All Industries",
occupation="All Occupations", cps_labor_force_status="Unemployment rate",
demographic_age="16 years and over",
demographic_ethnic_origin="All Origins", demographic_race="All Races",
demographic_gender="Both Sexes",
demographic_marital_status="All marital statuses",
demographic_education="All educational levels">

This is great if you already know what fields to expect; otherwise the more familiar way to explore it might be as a Hash:

>> unemployment_rate.catalog.to_h.keys
=> [:series_title, :series_id, :seasonality, :survey_name,
:measure_data_type, :commerce_industry, :occupation,
:cps_labor_force_status, :demographic_age, :demographic_ethnic_origin,
:demographic_race, :demographic_gender, :demographic_marital_status,
:demographic_education]

Data by month

You've already seen Series#get_month, which takes a year and month (1 = January) and returns a BLS_API::Month, and you've seen Month#value:

>> june = unemployment_rate.get_month(2015, 6)
>> june.value.to_f
=> 5.3

You also can get one-, three-, six- or 12-month changes (net changes or percent changes):

>> june.net_change(1).to_f
=> -0.2
>> june.percent_change(1).to_f
=> -3.6

These examples use #to_f for display purposes because this client uses BigDecimal instances by default to preserve precision:

>> june.value
=> #<BigDecimal:7ff5493f5390,'0.53E1',18(18)>

If you'd prefer Floats, you can set client.use_floats = true before making your request:

>> client.use_floats = true
>> data = client.get(:series_ids => ["LNS14000000"], :start_year => 2015, :end_year => 2015)
>> unemployment_rate = data["LNS14000000"]
>> unemployment_rate.get_month(2015, 6).value
=> 5.3

Also, BLS sometimes provides footnotes for certain data points, which you can access via Month#footnotes:

>> last_month.footnotes
=> {"P"=>"Preliminary"}

Configuration

You'll need an API key, which you can provide as an argument to BLS_API::Client.new or as a BLS_API_KEY environment variable. (If you provide both, the argument to Client.new takes precedence.)