Как мне нормализовать эту вложенную структуру, используя панд? - PullRequest
0 голосов
/ 25 июня 2018

У меня есть URL JSON со следующей структурой из ЭТОГО URL, и я пытаюсь получить имя, цену и объем из структуры ниже

{'data': {'1': {'id': 1,
   'name': 'Bitcoin',
   'symbol': 'BTC',
   'website_slug': 'bitcoin',
   'rank': 1,
   'circulating_supply': 17115025.0,
   'total_supply': 17115025.0,
   'max_supply': 21000000.0,
   'quotes': {'USD': {'price': 6317.68,
     'volume_24h': 5034440000.0,
     'market_cap': 108127251142.0,
     'percent_change_1h': 0.22,
     'percent_change_24h': 5.26,
     'percent_change_7d': -4.37}},
   'last_updated': 1529943576},
  '2': {'id': 2,
   'name': 'Litecoin',
   'symbol': 'LTC',
   'website_slug': 'litecoin',
   'rank': 6,
   'circulating_supply': 57133246.0,
   'total_supply': 57133246.0,
   'max_supply': 84000000.0,
   'quotes': {'USD': {'price': 84.4893,
     'volume_24h': 512241000.0,
     'market_cap': 4827147957.0,
     'percent_change_1h': 1.97,
     'percent_change_24h': 8.96,
     'percent_change_7d': -12.54}},
   'last_updated': 1529943541}},
 'metadata': {'timestamp': 1529943282,
  'num_cryptocurrencies': 1586,
  'error': None}}

Я пробовал несколько вариантов, чтобы получить каждую монету подряд, но пока не получилось

Попытка 1

df = pd.read_json('https://api.coinmarketcap.com/v2/ticker')

enter image description here

Попытка 2

data = requests.get('https://api.coinmarketcap.com/v2/ticker',params).json()

df = pd.DataFrame(data['data'])

DF

enter image description here

Попытка 3

Я обнаружил, что эта функция в стеке потока называется json normalize, и я пытался ее использовать, но пока безуспешно

df = pd.io.json.json_normalize(data['data'])
df

Любые предложения о том, как превратить каждую монету в ряд, очень ценятся

enter image description here

ОБНОВЛЕНИЕ 1

params = {'start': 0, 'sort': 'id', 'limit': 100}
data = requests.get('https://api.coinmarketcap.com/v2/ticker', params).json()
df = pd.DataFrame(data['data'])
df = df.transpose()
df.set_index('id')

Это довольно близко к тому, что я хочу, но как мне получить объем и цену из кавычек

enter image description here

1 Ответ

0 голосов
/ 25 июня 2018

при условии, что у "кавычек" есть только 1 строка и ключ "USD", я сделал это

df.drop('quotes', 1).join(
    pd.DataFrame(
        df.quotes.apply(
            lambda x: {'USD'+'_'+key: val for key, val in x['USD'].items()}
                       ).tolist()
                )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...