首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >许多国家使用IMF数据API的问题

许多国家使用IMF数据API的问题
EN

Stack Overflow用户
提问于 2022-03-23 19:05:35
回答 1查看 543关注 0票数 0

我正在尝试从国际货币基金组织的国际金融统计API下载国民账户数据。

我在下载几个选定的国家方面没有任何困难。由于您可以签入下面的代码,我可以将API中的一些json转换成熊猫数据格式。

代码语言:javascript
运行
复制
import requests
import pandas as pd

# Nominal domestic variables
dcn_sa = [
    'NINV_SA_XDC',
    'NGDP_D_SA_IX', 
    'NGDP_SA_XDC', 
    'NCPHI_SA_XDC',
    'NCPHN_SA_XDC',
    'NCGG_SA_XDC',
    'NFI_SA_XDC',
    'NX_SA_XDC',
    'NM_SA_XDC'
]
# A bunch of countries
countries = [
    'MX',
    'FR',
    'US',
    'GB'
]

# API calling
base = 'http://dataservices.imf.org/REST/SDMX_JSON.svc/CompactData/IFS/'

period = 'Q'
#countries = codes['Alpha2'].values
time = '?startPeriod=1960&endPeriod=2021'

# Get data from the above URL using the requests package
url = f"{base}{period}.{'+'.join(countries)}.{'+'.join(dcn_sa)}.{time}"
rq = requests.get(url)

response = rq.json()

series = response['CompactData']['DataSet']['Series']

N = len(series)

temp_imf = pd.DataFrame()
dum_df = pd.DataFrame()
for n in range(0, N-1):
    temp_dic = series[n].get('Obs')
    temp_df = pd.DataFrame.from_dict(
        temp_dic
        ).rename(
            columns = {
            '@OBS_VALUE':'Value',
            }
        )
    temp_df['Code'] = series[n].get('@REF_AREA')
    temp_df['Variable'] = series[n].get('@INDICATOR')
    temp_df['Period'] = pd.to_datetime(
            [row.replace('-', '') for row in temp_df['@TIME_PERIOD']]
        )
    temp_imf = temp_imf.append(temp_df)
    
imf = pd.pivot(
    temp_imf,
    values='Value', 
    index=['Code', 'Period'],
    columns='Variable'
)

然而,在我增加对国家的选择时,例如:

代码语言:javascript
运行
复制
countries = [
    'AF', 'AX', 'AL', 'DZ', 'AS', 'AD', 'AO',
    'AI', 'AQ', 'AG', 'AR', 'AM', 'AW', 'AU',
    'AT', 'AZ', 'BS', 'BH', 'BD', 'BB', 'BY',
    'BE', 'BZ', 'BJ', 'BM', 'BT', 'BO', 'BQ',
    'BA', 'BW', 'BV', 'BR', 'IO', 'BN', 'BG',
    'BF', 'BI', 'CV', 'KH', 'CM', 'CA', 'KY',
    'CF', 'TD', 'CL', 'CN', 'CX', 'CC', 'CO',
    'KM', 'CD', 'CG', 'CK', 'CR', 'CI', 'HR',
    'CU', 'CW', 'CY', 'CZ', 'DK', 'DJ', 'DM',
    'DO', 'EC', 'EG', 'SV', 'GQ', 'ER', 'EE',
    'SZ', 'ET', 'FK', 'FO', 'FJ', 'FI', 'FR',
    'GF', 'PF', 'TF', 'GA', 'GM', 'GE', 'DE', 
    'GH', 'GI', 'GR', 'GL', 'GD', 'GP', 'GU',
    'GT', 'GG', 'GN', 'GW', 'GY', 'HT', 'HM',
    'VA', 'HN', 'HK', 'HU', 'IS', 'IN', 'ID'
]

我得到以下错误

代码语言:javascript
运行
复制
JSONDecodeError: Expecting value: line 1 column 1 (char 0)

我认为,也许json文件的空元素可能会造成麻烦,所以我重写了以前的代码,但是逐国迭代。

代码语言:javascript
运行
复制
base = 'http://dataservices.imf.org/REST/SDMX_JSON.svc/CompactData/IFS/'
period = 'Q'
time = '?startPeriod=1960&endPeriod=2021'
countries = codes['Alpha2']
temp_imf = pd.DataFrame()
for cont in countries:
    url = f"{base}{period}.{cont}.{'+'.join(dcn_sa)}.{time}"
    rq = requests.get(url)
    if rq == 200:
        response = rq.json()
        series = response['CompactData']['DataSet']['Series']
        N = len(series)
        for n in range(0, N-1):
            temp_dic = series[n].get('Obs')
            temp_df = pd.DataFrame.from_dict(
                temp_dic
            ).rename(
                columns = {
                '@OBS_VALUE':'Value',
            }
            )
            temp_df['Code'] = series[n].get('@REF_AREA')
            temp_df['Variable'] = series[n].get('@INDICATOR')
            temp_df['Period'] = pd.to_datetime(
                [row.replace('-', '') for row in temp_df['@TIME_PERIOD']]
            )
            temp_imf = temp_imf.append(temp_df)
        print(response)
   # print([cont, rq])
        
imf = pd.pivot(
    temp_imf,
    values='Value', 
    index=['Code', 'Period'],
    columns='Variable'
)

但是,当我只选择几个国家时,就不会创建任何数据格式。

我的问题是如何避免这些错误,并编写一些能够处理所有国家的代码。

希望你能帮上忙。

谢谢

EN

Stack Overflow用户

发布于 2022-05-16 10:46:36

我也看到了这个API的问题。在提供相同的输入,但有时会出错的情况下,您可以处理请求代码。但也看到了它的工作,但没有数据,所以您需要解决的系列是否存在。在文档中,表示在给定的时间内可以提出多少请求是有限制的。因此,引入停顿也可能有帮助。

代码语言:javascript
运行
复制
makeRequest = requests.get(url)
if makeRequest.status_code == 200:
     Data = makeRequest.json()
     # Call was a success
     # Look to see if you have a series
     if 'Series' in Data['CompactData']['DataSet']:
           #### You Got Some Data 
     import time
     time.sleep(1)
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71592714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档