【问题标题】:How do I convert Coin Market Cap API data from JSON to Pandas Dataframe?如何将 Coin Market Cap API 数据从 JSON 转换为 Pandas Dataframe?
【发布时间】:2021-05-16 23:45:50
【问题描述】:
import requests
import pandas as pd
import APIKEY

url = 'https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest'

parameters = {
    'start': '1',
    'limit': '10',
    'convert': 'USD'
}
headers = {
    'Accepts': 'application/json',
    'X-CMC_PRO_API_KEY': APIKEY.KeyAPI,
}

jsondata = requests.get(url, params=parameters, headers=headers).json()

CoinDF = pd.read_json(jsondata)

CoinDF.to_csv(r'/home/USER/Documents/CoinData.csv')

我正在尝试让 Pandas 读取 API 返回的 JSON 数据,但是当我运行此程序时出现此错误

Traceback (most recent call last):
  File "/home/crow/PycharmProjects/CoinTracker/CoinMarketCapAPI.py", line 24, in <module>
    CoinDF = pd.read_json(jsondata, orient='index')
  File "/home/crow/PycharmProjects/CoinTracker/venv/lib/python3.8/site-packages/pandas/util/_decorators.py", line 199, in wrapper
    return func(*args, **kwargs)
  File "/home/crow/PycharmProjects/CoinTracker/venv/lib/python3.8/site-packages/pandas/util/_decorators.py", line 299, in wrapper
    return func(*args, **kwargs)
  File "/home/crow/PycharmProjects/CoinTracker/venv/lib/python3.8/site-packages/pandas/io/json/_json.py", line 540, in read_json
    json_reader = JsonReader(
  File "/home/crow/PycharmProjects/CoinTracker/venv/lib/python3.8/site-packages/pandas/io/json/_json.py", line 622, in __init__
    data = self._get_data_from_filepath(filepath_or_buffer)
  File "/home/crow/PycharmProjects/CoinTracker/venv/lib/python3.8/site-packages/pandas/io/json/_json.py", line 659, in _get_data_from_filepath
    self.handles = get_handle(
  File "/home/crow/PycharmProjects/CoinTracker/venv/lib/python3.8/site-packages/pandas/io/common.py", line 558, in get_handle
    ioargs = _get_filepath_or_buffer(
  File "/home/crow/PycharmProjects/CoinTracker/venv/lib/python3.8/site-packages/pandas/io/common.py", line 371, in _get_filepath_or_buffer
    raise ValueError(msg)
ValueError: Invalid file path or buffer object type: <class 'dict'>

与 API 的连接正常,但由于某种原因,我无法让 Pandas 读取它提供的内容。

感谢您的帮助

编辑:

所以我做了一些修改,我认为挂起的是 JSON 文件的结构。

这似乎是一个字典列表,但其中至少有一组嵌套字典。像这样……

[string1{blah:blah},string2{blah:blah,blah:blah,Nest{nest1:nest2}}]

。当我刚刚尝试将它从 JSON 读取到数据框时,我认为它在第二级字典中被阻塞了。我想现在的问题是如何在 Pandas 中使嵌套的字典键成为自己的列

编辑 2:由于某种原因,JSON 文件使用单引号而不是双引号,我认为这会搞砸一切。如果有人有一个好的答案,我会留下这个问题,但我不确定是否有一个好的解决方案。

最终编辑:

import requests
import pandas as pd
import KeyStuff
import json

url = 'https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest'

parameters = {
    'start': '1',
    'limit': '10',
    'convert': 'USD'
}
headers = {
    'Accepts': 'application/json',
    'X-CMC_PRO_API_KEY': KeyStuff.APIKey,
}

resp = requests.get(url, params=parameters, headers=headers)
jsondata = json.loads(resp.text)
CoinDF = pd.json_normalize(jsondata['data'])

CoinDF.to_csv("C:\\Users\\USER\\Documents\\Junk\\CMCAPIDF.csv")

这是最终的功能代码。非常感谢乔纳森·莱昂!

【问题讨论】:

  • 你检查jsondata看它是否给你一个有效的对象?
  • 我已经更新了描述中的错误。似乎当我修改它时,Python 将其视为字典或列表,但我是 JSON 新手,所以我不知道 Python 是否会将 JSON 识别为自己的数据类型

标签: python json pandas coinmarketcap


【解决方案1】:

这里有很好的文档:https://coinmarketcap.com/api/documentation/v1/#operation/getV1CryptocurrencyListingsLatest

尝试这样的事情(因为我没有完全看清你的身份,你可能会玩一点)。

resp = requests.get(url, params=parameters, headers=headers)
jsondata = json.loads(resp.text)
CoinDF = pd.json_normalize(jsondata['data'])

几个想法:就个人而言,我从未在 api 响应中使用过 read_json(),但这可能只是个人喜好,但有时它只是不起作用。另一种选择是pd.DataFrame(your_data),但这并不总是能正确解析。这是我的去处。但是对于这个,我认为他们将其包装在一个列表中,因此 json_normalize() 效果很好。

此外,在接收 api 响应时,您应该仔细查看结构。您可能需要也可能需要 status 密钥,但您确实需要 data 密钥,因此需要 jsondata['data']

【讨论】:

  • 我会调查的。状态键只链接到我的计算机和 API 之间的连接信息,所以我真的不需要它。我已经做了一些故障排除,连接似乎很好
  • 编辑:我收到一条错误消息,上面写着Attribute Error: 'dict" object has no attribute 'text'
  • 删除 .text 会发生什么?
  • 有效!太感谢了。 .text 似乎仍然是必要的,但我削减了很多程序,这似乎可以解决问题。再次感谢您
  • 优秀。很高兴听到。
【解决方案2】:

使用电报机器人 API 进行测试,返回 json 响应类型。它有效

import requests
import json
import pandas as pd
rs = requests.get('https://api.telegram.org/bot105574XXXXYYYYSSSXXXXXA/getupdates')

#Actually the data is <class 'dict'>, so enclose with pd.DataFrame.from_dict() works.
df = pd.DataFrame.from_dict(pd.json_normalize(rs.json()), orient='columns')
df.to_csv('api.csv')

【讨论】:

  • 这种作品。我能够将文本放入数据框中,但它没有分为列和行
  • 我已经为此类任务编写了一个自定义类,请检查此要点(包括示例)gist.github.com/omikabir/244802d4de269f0b9b24eed42ec2b326,它以 json/dict 作为参数并可以返回数据帧。其中每个键转换为列,值转换为行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 2021-05-17
  • 2023-03-31
  • 2017-12-01
  • 2020-12-21
  • 1970-01-01
  • 2017-04-13
相关资源
最近更新 更多