如何将硬币市值 API 数据从 JSON 转换为 Pandas Dataframe?
How do I convert Coin Market Cap API data from JSON to Pandas Dataframe?
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 returns 的 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")
这是最终的功能代码。非常感谢 Jonathan Leon!
这里有很好的文档: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 进行测试,returns 类型的 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')
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 returns 的 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")
这是最终的功能代码。非常感谢 Jonathan Leon!
这里有很好的文档: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 进行测试,returns 类型的 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')