社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

[Python学习]如何快速查询全球贸易数据?访问联合国贸易数据库UN Comtrade接口的方法

Rick笔记 • 4 年前 • 724 次点击  

联合国商品贸易统计数据库(缩写UN Comtrade)由联合国统计署创建,是目前全球最大、最权威的国际商品贸易数据型资源库,每年超过200个国家和地区向联合国统计署提供其官方年度商品贸易数据,涵盖全球99%的商品交易,真实反映国际商品流动趋势。这是我们研究全球贸易活动最基础、最权威的数据库。下载页面如下:

但是每次都要手动操作一遍,就比较麻烦。不过UN Comtrade提供了可以更方便获得数据的接口,我们来尝试一下。接口的实现原理,大概相当于:我们把要查询的数据,编成一条信息,发给UN Comtrade,然后UN Comtrade返回一个包含数据的文件,我们再解码成我们想要的格式。

一、查看接口格式。

我们先去UN Comtrade的接口网页,来看一看接口格式。

上图就是UN Comtrade的接口中,所包含的参数及格式。具体为:

r:reporting area 报告数据的国家,默认值0

px:classification 商品代码体系,商品进出口的默认值是HS(即Harmonized System),也可以选ST(即Standard International Trade Classification),服务进出口的默认值是EB02

ps:time period 时间区间,格式为 YYYY YYYYMM now recent等几种格式,取决于周期是月还是年。now 是获得最近1期数据(默认值),recent 是获得最近5期数据

p:partner area 发生贸易往来的经济体,默认值all

rg:trade regime / trade flow 贸易的方向,1 代表进口,2 代表出口,默认值all

cc:classification code 商品分类代码,TOTAL 代表全部,AG2 代表两位代码(默认值)等

max:maximum records returned 一次性返回的最大数据条数,默认值是500,普通访客最高是10万,认证用户最高是25万

type:trade data type 贸易类型,C 是商品(默认值),S 是服务

freq:data set frequency 数据频率,A 是年(默认值),M 是月

head:heading style 数据抬头格式,H 适合人阅读(默认值),M 适合机器阅读

最近铁矿石价格高涨,引发市场关注,而中国铁矿石的主要进口来源地是澳大利亚,我们就来看看,过去5年中国自澳大利亚进口铁矿石的数据。

我们把相关参数录入后,点击左下角的 Try it out! 就会返回给我们一个地址,这个地址就是向UN Comtrade发送数据请求的信息。同样,我们可以基于这条信息的格式,来设计我们的 Python 接口函数。

https://comtrade.un.org/api/get?r=156&px=HS&ps=2015%2C2016%2C2017%2C2018%2C2019&p=36&rg=1&cc=2601&type=C&freq=A&head=H

我们把这条消息输入浏览器的地址栏,就可以看到返回的数据如下,里面的 TradeValue 就是我们想要的数据了:

二、调用requests库解析数据

UN Comtrade的接口以json格式交换数据,我们来看一看返回的数据格式。我们要用到Pythonrequests库。

import requests
test = requests.get("http://comtrade.un.org/api/get", params=dict(r="156",px="HS",ps="2015,2016,2017,2018,2019",p="36",rg='1',cc='2601',type='C',freq="A"))
test.json()

我们来看一下返回内容,json有点类似于双重字典,从下文可以看到,返回结果主要包括两大类,第一大类是validation,主要是过程信息,第二大类是dataset,主要是我们需要的数据。

{'validation': {'status': {'name': 'Ok',
   'value': 0,
   'category': 0,
   'description': '',
   'helpUrl': 'For more reference visit http://comtrade.un.org/data/dev/portal/'},
  'message': None,
  'count': {'value': 5,
   'started': '2020-12-15T02:52:46.3395337+01:00',
   'finished': '2020-12-15T02:52:47.0901557+01:00',
   'durationSeconds': 0.750622},
  'datasetTimer': {'started': '2020-12-15T02:52:46.3395337+01:00',
   'finished': '2020-12-15T02:52:47.8896543+01:00',
   'durationSeconds': 1.5501205999999998}},
 'dataset': [{'pfCode': 'H5',
   'yr': 2017,
   'period': 2017,
   'periodDesc': '2017',
   'aggrLevel': 4,
   'IsLeaf': 0,
   'rgCode': 1,
   'rgDesc': 'Import',
   'rtCode': 156,
   'rtTitle': 'China',
   'rt3ISO': 'CHN',
   'ptCode': 36,
   'ptTitle': 'Australia',
   'pt3ISO': 'AUS',
   'ptCode2': None,
   'ptTitle2': '',
   'pt3ISO2': '',
   'cstCode': '',
   'cstDesc': '',
   'motCode': '',
   'motDesc': '',
   'cmdCode': '2601',
   'cmdDescE': 'Iron ores and concentrates; including roasted iron pyrites',
   'qtCode': 8,
   'qtDesc': 'Weight in kilograms',
   'qtAltCode': None,
   'qtAltDesc': '',
   'TradeQuantity': 668420584292,
   'AltQuantity': None,
   'NetWeight': 668420584292,
   'GrossWeight': None,
   'TradeValue': 46500341920,
   'CIFValue': None,
   'FOBValue': None,
   'estCode': 0},

三、使用Pandas库转换数据格式

我们选择我们关心的数据,用关键字提取出来,然后转换成DataFrame格式,就可以方便的查看数据了:

import pandas as pd
import cufflinks as cf
pd.DataFrame(test.json()['dataset'])[['yr','TradeValue']].iplot(x='yr',y='TradeValue',kind='bar',title='中国过去5年自澳大利亚进口铁矿石金额')

四、简单封装

我们把上文中的读取和解析数据的过程,简单封装成一个函数,以方便后续调用,比如我们想查看中国历年自澳大利亚进口铁矿石的金额,可以用如下命令:

import requests
import pandas as pd
import cufflinks as cf
def comtrade_data(**params):
    r = requests.get("http://comtrade.un.org/api/get", params=params)
    return pd.DataFrame(r.json()['dataset'])

Iron_ores = comtrade_data(r="156",px="HS",ps="ALL",p="36",rg='1',cc='2601',type='C',freq="A")
Iron_ores[['yr','TradeValue']].iplot(x='yr',y='TradeValue',kind='bar',title='中国自澳大利亚进口铁矿石金额')

我们想看看中国的大豆自各国进口的情况,用

soybean = comtrade_data(r="156",px="HS",ps="2019",p="all",rg='1',cc='1201',type='C',freq="A")
soybean = soybean.sort_values(by='TradeValue',ascending=False)
soybean.iloc[1:6].iplot(x='ptTitle',y='TradeValue',kind='bar',title='2019年中国大豆进口额')

从上图可以看到,2019年中国自巴西的大豆进口,明显高于美国,那么这种情况,是否是受到中美贸易摩擦的影响呢?我们用如下命令,就可以很清晰的看到,2018年之前,中国自美国和巴西进口大豆的金额比较接近,但是2018年之后,中国自美进口大豆锐减,并从巴西替代,这也是中美贸易摩擦对美国影响的一个案例。

soybean_import = comtrade_data(r="156",px="HS",ps="all",p="76,842"


    
,rg='1',cc='1201',type='C',freq="A")
soybean_import_usa = soybean_import[soybean_import['ptTitle']=='USA'].set_index('yr')[['TradeValue']]
soybean_import_brazil = soybean_import[soybean_import['ptTitle']=='Brazil'].set_index('yr')[['TradeValue']]
soybean_import_all = soybean_import_usa.join(soybean_import_brazil,lsuffix='_USA',rsuffix='_Brazil')
soybean_import_all.iplot(kind='bar',title='中国自美国和巴西进口大豆金额',legend={'orientation':'h','x':0.1,'y':-0.1})

五、几个注意事项

1、如果是访客用户的话,psrp三个参数最多只能填5个代码,最多只有一个参数可以使用allcc最多可以填20个代码,可以使用all

2、查询国家的时候,只能录入国家编号,查询国家对应编号的地址是https://comtrade.un.org/Data/cache/reporterAreas.json

3、查询对手方国家的时候,只能录入国家编号,查询对手方国家对应编号的地址是https://comtrade.un.org/Data/cache/partnerAreas.json

4、查询相关商品对应的HS编码,地址是https://comtrade.un.org/Data/cache/classificationHS.json


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/100134
 
724 次点击