#python #json #pandas #dataframe #json-normalize
Вопрос:
Я новичок в Python, могу ли я, пожалуйста, обратиться за помощью к экспертам здесь?
Я хочу построить фрейм данных из https://api.cryptowat.ch/markets/summaries Ответ JSON. на основе следующих критериев фильтрации
- Валютные пары, перечисленные Kraken (Пожалуйста, обратите внимание, что есть фьючерсы на kraken, которые мне не нужны)
- Валюта в паре только с долларом США, т. е. aaveusd, adausd….
Идеальный фрейм данных, который я ищу, — это (каким-то образом excel отлично загружает этот json на скриншоте ниже) Dataframe_Excel_Screenshot
resp = requests.get(https://api.cryptowat.ch/markets/summaries) kraken_assets = resp.json() df = pd.json_normalize(kraken_assets) print(df)
Выход:
результат.binance-сша:aaveusd.цена.последний результат.binance-сша:aaveusd.цена.высокий…
0 264.48 267.32 …
[1 строка х 62688 столбцов]
Когда я просто вставляю ссылку в браузер, JSON-ответ с двойными кавычками ( » ), но когда я получаю его с помощью кода python. Все двойные кавычки («) заменены одинарными кавычками (‘) есть идеи, почему?. Хотя я пытался решить эту проблему с помощью json_normalize, но затем ответ меняется на [1 строка x 62688 столбцов]. я не уверен, как мне вообще работать с 1 строкой с 62 тысячами столбцов. я не знаю, как извлечь точную информацию в нужном мне формате фрейма данных (см. Скриншот excel).
Мы очень ценим любую помощь. Спасибо!
Ответ №1:
- результат JSON-это диктант
- загрузите это в фрейм данных
- декодирование столбцов в продукты и меры
- фильтр по требуемым данным
import requests
import pandas as pd
import numpy as np
# load results into a data frame
df = pd.json_normalize(requests.get("https://api.cryptowat.ch/markets/summaries").json()["result"])
# columns are encoded as product and measure. decode columns and transpose into rows that include product and measure
cols = np.array([c.split(".", 1) for c in df.columns]).T
df.columns = pd.MultiIndex.from_arrays(cols, names=["product","measure"])
df = df.T
# finally filter down to required data and structure measures as columns
df.loc[df.index.get_level_values("product").str[:7]=="kraken:"].unstack("measure").droplevel(0,1)
пример вывода
продукт | цена.последняя | цена.высокая | цена.низкая | цена.изменение.процент | цена.изменение.абсолютная | объем | volumeQuote |
---|---|---|---|---|---|---|---|
кракен:привет | 347.41 | 347.41 | 338.14 | 0.0274147 | 9.27 | 1.77707 | 613.281 |
кракен:aavebtc | 0.008154 | 0.008289 | 0.007874 | 0.0219326 | 0.000175 | 403.506 | 3.2797 |
кракен:aaveeth | 0.1327 | 0.1346 | 0.1327 | -0.00673653 | -0.0009 | 287.113 | 38.3549 |
кракен:эйвер | 219.87 | 226.46 | 209.07 | 0.0331751 | 7.06 | 1202.65 | 259205 |
кракен:aavegbp | 191.55 | 191.55 | 179.43 | 0.030559 | 5.68 | 6.74476 | 1238.35 |
кракен:aaveusd | 259.53 | 267.48 | 246.64 | 0.0339841 | 8.53 | 3623.66 | 929624 |
кракен:адаауд | 1.61792 | 1.64602 | 1.563 | 0.0211692 | 0.03354 | 5183.61 | 8366.21 |
кракен:adabtc | 3.757 e-05 | 3.776 e-05 | 3.673 e-05 | 0.0110334 | 4.1 e-07 | 252403 | 9.41614 |
кракен:адаэт | 0.0006108 | 0.00063 | 0.0006069 | -0.0175326 | -1.09 e-05 | 590839 | 367.706 |
кракен:адеур | 1.01188 | 1.03087 | 0.977345 | 0.0209986 | 0.020811 | 1.99104 e 06 | 1.98693e 06 |
Ответ №2:
Здравствуйте, попробуйте использовать приведенный ниже код. Я понял структуру набора данных и изменил ее, чтобы получить желаемый результат. `
resp = requests.get("https://api.cryptowat.ch/markets/summaries")
a=resp.json()
a['result']
#creating Dataframe froom key=result
da=pd.DataFrame(a['result'])
#using Transpose to get required Columns and Index
da=da.transpose()
#price columns contains a dict which need to be seperate Columns on the data frame
db=da['price'].to_dict()
da.drop('price', axis=1, inplace=True)
#intialising seperate Data frame for price
z=pd.DataFrame({})
for i in db.keys():
i=pd.DataFrame(db[i], index=[i])
z=pd.concat([z,i], axis=0 )
da=pd.concat([z, da], axis=1)
da.to_excel('nex.xlsx')`