我正在尝试从国际货币基金组织的国际金融统计API下载国民账户数据。
我在下载几个选定的国家方面没有任何困难。由于您可以签入下面的代码,我可以将API中的一些json转换成熊猫数据格式。
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'
)
然而,在我增加对国家的选择时,例如:
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'
]
我得到以下错误
JSONDecodeError: Expecting value: line 1 column 1 (char 0)
我认为,也许json文件的空元素可能会造成麻烦,所以我重写了以前的代码,但是逐国迭代。
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'
)
但是,当我只选择几个国家时,就不会创建任何数据格式。
我的问题是如何避免这些错误,并编写一些能够处理所有国家的代码。
希望你能帮上忙。
谢谢
发布于 2022-05-16 10:46:36
我也看到了这个API的问题。在提供相同的输入,但有时会出错的情况下,您可以处理请求代码。但也看到了它的工作,但没有数据,所以您需要解决的系列是否存在。在文档中,表示在给定的时间内可以提出多少请求是有限制的。因此,引入停顿也可能有帮助。
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)
https://stackoverflow.com/questions/71592714
复制相似问题