Python json нормализовать запрос API - PullRequest
2 голосов
/ 20 апреля 2020

Я получаю данные в формате JSON и с трудом могу преобразовать их в подходящий формат. Надеюсь, ты сможешь мне помочь.

import pandas as pd

from pandas.io.json import json_normalize

import requests

dataAPI = requests.get('here is the API URL')

print(dataAPI.json()) 

даст мне следующий вывод:

{'c': [277.775, 277.76, 277.65, 277.64, 277.5215], 'h': [277.89, 278.06, 277.98, 277.
76, 277.98], 'l': [277.67, 277.71, 277.59, 277.42, 277.472], 'o': [277.69, 277.795, 277.77, 277.66, 277.72], 's': 'ok', 't': [1587412320, 1587412380, 1587412440, 1587412500, 1587412560, 1587412620, ], 'v': [0, 142752, 133100, 259539, 0]}

Я хотел бы создать кадр данных со следующими столбцами (пропустить столбцы) и значениями с плавающей запятой :

c| h| l| o| t| v

277.775| 277.89| 277.67| 277.69| 1587412320| 0

...

Я пробовал что-то в этом духе json_normalize (dataAPI, 'c')

, но это выдало мне сообщение об ошибке TypeError: байтовые индексы должны быть целыми или кусочками, не str

высоко ценим вашу помощь

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Вы должны определить нужные столбцы, а затем просто использовать pandas.concat:

j = {'c': [277.775, 277.76, 277.65, 277.64, 277.5215], 'h': [277.89, 278.06, 277.98, 277.76, 277.98], 'l': [277.67, 277.71, 277.59, 277.42, 277.472], 'o': [277.69, 277.795, 277.77, 277.66, 277.72], 's': 'ok', 't': [1587412320, 1587412380, 1587412440, 1587412500, 1587412560, 1587412620, ], 'v': [0, 142752, 133100, 259539, 0]}
columns = {'c', 'h', 'l',  'o', 't', 'v'}
pd.concat([pd.DataFrame({k: v}) for k, v in j.items() if k in columns], axis=1)

вывод:

enter image description here

1 голос
/ 21 апреля 2020
dict1 = {'c': [277.775, 277.76, 277.65, 277.64, 277.5215],
         'h': [277.89, 278.06, 277.98, 277.76, 277.98],
         'l': [277.67, 277.71, 277.59, 277.42, 277.472],
         'o': [277.69, 277.795, 277.77, 277.66, 277.72],
         's': 'ok',
         't': [1587412320, 1587412380, 1587412440, 1587412500, 1587412560, 1587412560,],
         'v': [0, 142752, 133100, 259539, 0]}

Для вышеупомянутого полученного вывода из ответа API вы можете сделать следующее:

import pandas as pd

df1 = pd.DataFrame.from_dict(dict1, orient="index").T.drop(columns=["s"])
df1

Приведенный выше код создаст кадр данных из словаря, ориентируясь по индексу (можно сделать это с помощью столбец тоже, если значения списка равны в словаре), а затем транспонирует его. Падение будет указывать, какой столбец вы бы хотели удалить.

Вывод:

Out[21]: 
         c       h        l        o            t       v
0  277.775  277.89   277.67   277.69   1587412320       0
1   277.76  278.06   277.71  277.795   1587412380  142752
2   277.65  277.98   277.59   277.77  1.58741e+09  133100
3   277.64  277.76   277.42   277.66  1.58741e+09  259539
4  277.522  277.98  277.472   277.72  1.58741e+09       0
5      NaN     NaN      NaN      NaN  1.58741e+09     NaN

Вы не хотели бы содержать NaN, следовательно, вы можете добавить dropna() к коду, как показано ниже:

df1 = pd.DataFrame.from_dict(dict1, orient="index").T.drop(columns=["s"]).dropna()

Таким образом, у вас есть возможность обрабатывать NaN и отбрасывать столбцы не обязательно.

...