Я пытаюсь загрузить данные из OECD API в python со следующим кодом:
import requests
import pandas as pd
base = 'http://stats.oecd.org/sdmx-json/data/'
param = [('dataset', 'QNA'),
('country', ''),
('indicators', 'B1_GE.GYSA'),
('freq', 'Q'),
('start_period=2016-Q4','?startTime=2016-Q4')
]
series = '.'.join(x[1] for x in param[1:-1])
url = '{}{}/{}{}'.format(base, param[0][1], series, param[-1][1])
r = requests.get(url).json()
date_list = r['structure']['dimensions']['observation'][0]['values']
dates = pd.to_datetime([x['id'] for x in date_list])
areas = [v['name'] for v in r['structure']['dimensions']['series'][0]['values']]
title = r['structure']['dimensions']['series'][1]['values'][0]['name']
df = pd.DataFrame()
for i, area in enumerate(areas):
s_key = '{}:0:0:0'.format(i)
s_list = r['dataSets'][0]['series'][s_key]['observations']
df[area] = pd.Series([s_list[val][0] for val in sorted(s_list, key=int)])
df[area] = (((df[area] / df[area].shift()) ** 4) - 1) * 100
df.index = dates
df = df.dropna()
df.to_csv("C:\\Users\\pedro.salgado\\Documents\\Data\\OECD.csv", sep=";")
У меня сейчас 2 проблемы:
-
df.index = dates
не работает, и я получаю следующую ошибку:
Файл
"C: /Users/pedro.salgado/PycharmProjects/Chico_Municipios/OECD.py",
строка 34, в
df.index = даты
Файл "C: \ Users \ pedro.salgado \ PycharmProjects \ Chico_Municipios \ venv \ lib \ site-packages \ pandas \ core \ generic.py",
строка 3627, в setattr
возвращаемый объект. setattr (self, name, value)
Файл "pandas_libs \ properties.pyx", строка 69, в pandas._libs.properties.AxisProperty. set
Файл "C: \ Users \ pedro.salgado \ PycharmProjects \ Chico_Municipios \ venv \ lib \ site-packages \ pandas \ core \ generic.py",
строка 559, в _set_axis
self._data.set_axis (ось, метки)
Файл "C: \ Users \ pedro.salgado \ PycharmProjects \ Chico_Municipios \ venv \ lib \ site-packages \ pandas \ core \ internals.py",
строка 3074, в set_axis
(old_len, new_len))
ValueError: Несоответствие длины: ожидаемая ось имеет 75 элементов, новые значения имеют 76 элементов
Очевидно, что индексация не работает, потому что строка данных имеет еще одно значение, чем df
, но я не уверен, как проще всего это исправить. Когда я не индексирую df
, код работает просто отлично. Есть идеи?
После исправления проблемы №1, скрипт может загрузить мои данные. Однако, когда я пытаюсь получить несколько индикаторов одновременно, изменив код на:
('indicators', 'B1_GE.GPSA+VIXOBSA')
Вылетает, и я получаю еще одну ошибку:
Traceback (последний последний вызов):
Файл "C: /Users/pedro.salgado/PycharmProjects/Chico_Municipios/OECD.py",
строка 29, в
s_list = r ['dataSets'] [0] ['series'] [s_key] ['наблюдения']
KeyError: '51: 0: 0: 0 '