*已解决
我正在关注Sentdex Python GUI教程,我们想连接API,提取数据,然后在图表上显示。视频有点过时了,他正在使用的网站已经消失了,所以我不得不使用另一个(Bitfinex),但是原理保持不变。我陷入了以下问题:
https://youtu.be/uK7wAvS8C0U?t=15m33s
https://docs.bitfinex.com/v1/reference#rest-public-trades(公共API)
def animate(i):
dataLink = "https://api.bitfinex.com/v1/trades/BTCUSD"
response = requests.request("GET", dataLink)
print(response.text)
data = urllib.request.urlopen(dataLink) #this is in bytes, we have to decode
data = data.readline().decode("utf-8")
data = json.loads(data)
data = data["BTCUSD"]
data = pd.DataFrame(data) #now data is pandas data set
我遇到以下问题:
File "C:/Users/kleme/PycharmProjects/GUIs with Tkinter/GUI.py", line 46, in animate
data = data["BTCUSD"]
TypeError: list indices must be integers or slices, not str
我已经用Google搜索并尝试了几种不同的方法,但是我仍然做不到。我也不确定,如果我使用的API错误或其他原因,但是如果我理解正确并查看python,它会向我们返回一个字符串列表,例如
[{"timestamp":1530514714,"tid":264164749,"price":"6312.1","amount":"0.025","exchange":"bitfinex","type":"sell"}, etc..
但是现在我只需要将其放入整数类型。我知道您可以使用int()进行数据类型转换,并且我已经尝试过使用它进行一些操作,但是仍然无法如前所述,使该操作正确运行并显示实时图形。
本来应该提取数据并将其显示在图上,但图只是空白,因为它无法从返回字符串类型数据的response.text中提取int。
谢谢。
答案 0 :(得分:0)
此行:
data = data["BTCUSD"]
实际上完全没有用。在文档的JS代码段中,它是用于构建url的客户端的参数,但是您不必担心,因为它已经是您的url的一部分:
dataLink = "https://api.bitfinex.com/v1/trades/BTCUSD"
因此,在json.loads()
通话之后,您已经有了可以使用的词典列表。
作为旁注,
data = data.readline().decode("utf-8")
充其量是脆的-您不应该假设所有内容都挤在一行上,它可能包含换行符。但是实际上,由于您已经安装了requests
,因此应该完全摆脱urllib
部分,而只需使用response.json()
:
dataLink = "https://api.bitfinex.com/v1/trades/BTCUSD"
response = requests.request("GET", dataLink)
data = response.json()
# now `data` is a list of dicts, you can pass it to panda or do whatever with it.