Преобразование вызова CKAN data API из байтов в фрейм данных Pandas

#python #pandas

#python #pandas

Вопрос:

Я пытаюсь получить доступ data.gov.au наборы данных через их CKAN data API. К сожалению, инструкции API данных немного устарели и, похоже, не работают. Инструкции можно найти здесь.

До сих пор я выяснил, что я предназначен для запроса набора данных с помощью urllib.request .

 import urllib.request

req = urllib.request.Request('https://data.sa.gov.au/data/api/3/action/datastore_search?resource_id=86d35483-feff-42b5-ac05-ad3186ac39de')

with urllib.request.urlopen(req) as response:
   data = response.read()  
 

При этом создается объект типа bytes, который выглядит как структура данных словаря, в которой, по-видимому, хранится набор "records:" данных.

введите описание изображения здесь

Мне интересно, как я могу преобразовать записи данных в фрейм данных Pandas. Я попытался преобразовать объект bytes в строку и прочитать его как файл json, но результат неверный.

 # code that did not work
result = str(data, 'utf-8')
rdata = StringIO(result)
df = pd.read_json(rdata)
df
 

Неверный вывод

Результат, который я хотел бы вернуть, выглядит следующим образом:

введите описание изображения здесь

Спасибо!

Ответ №1:

Вот решение, которое работает:

 import numpy as np
import pandas as pd
import requests
import json

url = "https://data.sa.gov.au/data/api/3/action/datastore_search?resource_id=86d35483-feff-42b5-ac05-ad3186ac39de"
JSONContent = requests.get(url).json()
content = json.dumps(JSONContent, indent = 4, sort_keys=True)
print(content)
df = pd.read_json(content)
df.to_csv("output.csv")
df = pd.json_normalize(df['result']['records'])
 

Вы действительно были близки к решению. Это только последний шаг df=pd.json_normalize(df['result']['records']) , который вы пропустили.

введите описание изображения здесь