我在用python编写一个小机器人时遇到了一个问题。我从api中检索到了一个Json文件,如下所示:
> {
> "10000NFTUSDT": {
> "ret_code": 0,
> "ret_msg": "OK",
> "ext_code": "",
> "ext_info": "",
> "result": \[
> {
> "symbol": "10000NFTUSDT",
> "period": "60",
> "start_at": 1671559200,
> "open": 0.004533,
> "high": 0.004538,
> "low": 0.004523,
> "close": 0.004535
> },
> {
> "symbol": "10000NFTUSDT",
> "period": "60",
> "start_at": 1671562800,
> "open": 0.004535,
> "high": 0.004537,
> "low": 0.004531,
> "close": 0.004533
> },
> {
> "symbol": "10000NFTUSDT",
> "period": "60",
> "start_at": 1671566400,
> "open": 0.004533,
> "high": 0.00454,
> "low": 0.004533,
> "close": 0.004534
> },
我试图从每个硬币中提取收盘价(然后将它们相互比较),但我在提取过程中卡住了。我的主文件看起来像这样:
import json
from func_cointegration import get_cointegrated_pairs
\#STEP 3 Find Cointegrated pairs
print("Calculating co-integration...")
with open("1_price_list.json") as json_file:
price_data = json.load(json_file)
if len(price_data) > 0:
coint_pairs = get_cointegrated_pairs(price_data)
我调用使用extract_close_prices的get_cointegrated_pairs
一个二个一个一个
我不明白为什么我不能用键"close"访问"price_values"。我认为用load打开json文件可以确保它作为字典加载,我正在学习一个教程,那个家伙运行了一个类似的代码,没有这个"typeError"问题。我想用我json文件中的所有收盘价来填充我的"close_price"列表。你知道我做错了什么吗?
Traceback (most recent call last):
File "/Users/xxxxxxxx/PycharmProjects/StatArbBot/Strategy/main.py", line 27, in <module>
coint_pairs = get_cointegrated_pairs(price_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/xxxxx/PycharmProjects/StatArbBot/Strategy/func_cointegration.py", line 35, in get_cointegrated_pairs
series_1 = extract_close_prices(prices[sym_1])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/xxxxx/PycharmProjects/StatArbBot/Strategy/func_cointegration.py", line 12, in extract_close_prices
if math.isnan(price_values["close"]):
~~~~~~~~~~~~^^^^^^^^^
TypeError: string indices must be integers, not 'str'
1条答案
按热度按时间rqenqsqc1#
所以我试着复制你的代码和问题。
原来您正在传递一个字典并试图迭代它。
for price_values in prices:
在您的extract_close_prices函数中。因此,您需要迭代到嵌套在字典中键
result
下的列表,如下所示:for price_values in prices['result']:
然后尝试查看列表项是否不是数字,由于它是
if math.isnan(price_values):
的对象(字典技术),因此返回一个空列表。相反,您需要检查密钥
close
的值是否为如下数字:if math.isnan(price_values["close"])
在此之后,您的其余代码应该可以工作。
这是我根据您发布的问题创建的工作副本。
https://gist.github.com/HH0718/a6dcfa07c0eb2f83070f01544d04270c
原始答案如下:
您正试图从嵌套在JSON文件中的列表中获取一个项目。
因此,你需要提供你要查找的项的索引。一旦你提供了列表中该项的索引,你就可以得到那个对象的值。
注意"result"是一个列表:
如
[
所示例如:
会得到你的,
0.004535