Uncomtrade
Simple gem for using the UN Comtrade API. Their docs state the API can be changed at any moment, so use caution using this gem. I will try to keep it up-to-date as possible.
Basic objectives of gem:
- Keep parameter names and default values consistent with API.
- Convenience methods to make querying and processing data easier.
Installation
Add this line to your application's Gemfile:
gem 'uncomtrade'
And then execute:
$ bundle
Or install it yourself as:
$ gem install uncomtrade
Basic Usage
request = Uncomtrade::Request.new(max: 2)
response = request.get_data
response.dataset
#=> [{"pfCode"=>"H4","yr"=>2014, ...}, ... ]
response.cherry_pick("period" => "period", "TradeValue" => "trade_amount")
#=> [{"period"=>2014, "trade_amount"=>5229972238}, ...]
Detailed Usage
Request object
CAUTION: Currently the API only supports the type
parameter to equal C
. In this gem you cannot change the pmt
parameter from json
.
Creating the object
In order to make a request to the API you'll need to create a request object. For convenience, all query parameters have defaults based on the UN Comtrade API docs. View the current parameters for your request by calling .params
.
request = Uncomtrade::Request.new
request.params
#=> {:max=>500, :fmt=>"json", :r=>"all", :freq=>"A", :ps=>"now",
# :px=>"HS", :p=>0, :rg=>"all", :cc=>"TOTAL", :type=>"C"}
When you create a request object you can specify what parameters you want to set values for, ones that are not set will retain their default value.
request = Uncomtrade::Request.new(max: 200, freq: "M", p: 528 )
request.params
#=> {:max=>200, :freq=>"M", :fmt=>"json", :r=>"all", :ps=>"now",
# :px=>"HS", :p=>528, :rg=>"all", :cc=>"TOTAL", :type=>"C"}
Retrieving the data
Call .get_data
on the request object to return the data. See the response object documentation on how to interact with data.
request = Uncomtrade::Request.new(max: 200, freq: "M", p: 528 )
response = request.get_data
Error handling
The UN Comtrade API hands back a status for every request. Any status other than "Ok"
is treated as an error by the API. If you want to rescue the error:
begin
request = Uncomtrade::Request.new(max: 200, freq: "M", p: 528 )
response = request.get_data
rescue Uncomtrade::ResponseError => error
puts error.status
puts error.description
puts error.
end
error.message
will probably be the most helpful in debugging your query.
Updating and resetting the request object
You can update a single parameter or multiple parameters after you've created the request object. You can also reset all of the parameters to their default values by calling .reset
.
request = Uncomtrade::Request.new
request.update(max: 200)
request.update(max: 300, freq: "M")
request.reset
Country finder helper
WARNING: TO BE SAFE, use the numbers listed in their docs. The API uses the wrong ISO number for France, 251, it should be 250. Not sure how many other errors there are. Also, API includes former countries like USSR, regions and some city states that do not exist in the countries gem. Will work on a better solution.
The UN Comtrade API uses ISO numbers for identifying countries/regions. This gem uses the countries gem to help you use two/three letter country codes, as well as country names to find the number for you. For a list of available countries/regions check the UN Comtrade API docs. You can also just use the ISO number.
# Netherlands
request = Uncomtrade::Request.new
request.update(p: "NLD")
request.update(r: "NL")
request.update(p: "netherlands")
request.update(p: 528)
If you're not specific enough or you write a bad country code, you will get the following exception.
request = Uncomtrade::Request.new(p: "u")
#=> Uncomtrade::CountryError: Could not find specified country/code: u
request = Uncomtrade::Request.new(p: "united")
#=> Uncomtrade::CountryError: Could not find specified country/code: united
Response object
Data methods
Calling .result
will hand back the entire JSON response.
Calling .dataset
will hand back the value of the dataset key from the JSON response. (array of results)
request = Uncomtrade::Request.new(max: 2)
response = request.get_data
response.result
response.dataset
Convenience methods
To iterate over the dataset to only get the information you want, call .cherry_pick
. The method allows you to rename keys if you want. See below.
request = Uncomtrade::Request.new(max: 2)
response = request.get_data
response.cherry_pick(:period => "Year", :TradeValue => "Value")
#=> [{"Year"=>2014, "Value"=>5229972238}, ...]
response.cherry_pick(period: :year, TradeValue: :trade_amount)
#=> [{:year=>2014, :trade_amount=>5229972238}, ...]
response.cherry_pick("period" => "period", "TradeValue" => "TradeValue")
#=> [{"period"=>2014, "TradeValue"=>5229972238}, ...]
Use .to_csv
to save a csv file with data that you want. If you don't specify any selectors all data will be returned.
request = Uncomtrade::Request.new(max: 2)
response = request.get_data
selectors = { period: :period,
TradeValue: :trade_amount,
rtTitle: :reporter_country }
# ONLY DATA FROM SELECTORS
response.to_csv(file: "filepath.csv", selectors: selectors)
# ALL DATA
response.to_csv(file: "filepath.csv")
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/sunrick/uncomtrade. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.
License
The gem is available as open source under the terms of the MIT License.