如何解决将对象列表中的值获取到可读数据框中的问题
过去几天我一直遇到同样的问题,在这个论坛上搜索所有内容并寻找答案,但我尝试的任何内容似乎都没有奏效。我一直在关注其他人发布的教程,他们能够非常简单地做到这一点,但是当我从多个角度尝试时遇到了多个问题。我的头因为我尝试过的所有事情而变得如此纠结,以至于我什至不确定发生了什么或我做了什么。这不是全部代码,但这应该是唯一相关的代码,因为其他部分执行其他功能,但如果我遗漏了任何内容,我深表歉意。
基本上,我从网站获取历史金融烛台数据,尝试将其放入 Pandas 数据框,然后使用该数据框使用 Plotly 制作图表。我将数据作为“结果”获取,PyCharm 将数据输出到“运行”框中就好了,但现在我需要保存该数据,因此我让 Pandas 将“结果”转换为“priceData”的数据框,然后将其转换到“pricedata.csv”。当我打开那个 CSV 文件时,我得到的只是一个从 0 到 1439 的列表(我一次导入 1440 个 1 分钟烛台),并且每个烛台只显示对象引用(
我可以通过深入获取特定值,并调用它来保存 result[0].high 或 result[0].low 等。但是我必须遍历 1440 个烛台数据和单独写/保存它们,然后将它们每个的高/低/开/关/时间/等放在一起,以便能够绘制,这比我看过的教程要复杂得多。他们能够立即使用数据框进行绘图而不会出现任何问题,他们不会遇到属性错误,就像它只是为他们正确识别列一样。但是当我查看“结果”的列时,有 1440 列(每个烛台也有一个列),但我认为每个烛台由 12 位不同的数据组成,它应该是 12 列。我试过转置列和行,但这也不起作用。
即使我尝试仅获取一个对象的整个烛台数据,通过指定“result[0]”而不指定 .high/.low/etc,我也会遇到相同的属性错误。有些事情建议指定列是什么,所以这就是散列出来的“priceData.columns”的用途,我确定每列是什么。但后来我得到“长度不匹配:预期轴有 1440 个元素,新值有 12 个元素”。
此时我真的很困惑,而且一直在兜圈子,谁能帮我指出正确的方向并告诉我我搞砸了什么?提前感谢所有花时间阅读本文或提供任何指导的人。
from binance_f import RequestClient
from binance_f.model import *
from binance_f.constant.test import *
from binance_f.base.printobject import *
import pandas as pd
import numpy as np
import json
import plotly.io as pio
pd.options.plotting.backend = 'plotly'
pio.renderers.default = "browser"
request_client = RequestClient(api_key=g_api_key,secret_key=g_secret_key,url="https://fapi.binance.com")
result = request_client.get_candlestick_data(symbol="BTCUSDT",interval=CandlestickInterval.MIN1,startTime=1609473600000,endTime=None,limit=1440)
priceData = pd.DataFrame([result])
priceData.to_csv('priceData.csv')
print(pd.read_csv("E:\Creative\GitHub Projects\Binance_Futures_python\example\market\priceData.csv"))
#priceData.columns = ['opentime','open','high','low','close','vol','closetime','quoteassetvol',#'numberofTrades','takerbuybase','takerbuyquote','ignore']
def chart():
pricedata = pd.read_csv('E:\Creative\GitHub
Projects\Binance_Futures_python\example\market\priceData.csv')
highprice = pricedata.high
lowprice = pricedata.low
openprice = pricedata.open
closeprice = pricedata.close
fig = dict({
"data": [{"type": "candlestick","open": [openprice],"close": [closeprice],"low": [lowprice],"high": [highprice]}],"layout": {"title": {"text": "Candlestick Charts"}}
})
pio.show(fig)
chart()
解决方法
您当前获取烛台数据的方式,result
是烛台对象列表,每个对象都有可以单独访问的属性,例如您指出的 result[0].high
。听起来您想解压所有这些属性并将它们放入一个 DataFrame 中。
To obtain all of the attributes of an object,比如字典中 Candlestick 对象的所有 12 个属性,可以使用 result[0].__dict__
返回:{'openTime': 1609473600000,'open': '29302.11','high': '29356.04','low': '29302.10','close': '29344.00','volume': '170.018','closeTime': 1609473659999,'quoteAssetVolume': '4988200.62513','numTrades': 1045,'takerBuyBaseAssetVolume': '139.291','takerBuyQuoteAssetVolume': '4086412.01157','ignore': '0'}
要从 result
中获取这些字典的列表,您可以使用列表推导式:[candlestick_obj.__dict__ for candlestick_obj in result]
,而 pd.DataFrame
允许您从这样的字典列表中构造一个 DataFrame,因此 { {1}} 将创建一个 DataFrame,其中包含每个字典中键的列,每个列表项有 1 行。
priceData = pd.DataFrame([candlestick_obj.__dict__ for candlestick_obj in result])
您的其余代码没问题,您的图表函数会按预期生成烛台图表。
openTime open high ... takerBuyBaseAssetVolume takerBuyQuoteAssetVolume ignore
0 1609473600000 29302.11 29356.04 ... 139.291 4.086412e+06 0
1 1609473660000 29344.00 29369.00 ... 95.555 2.804598e+06 0
2 1609473720000 29353.57 29356.75 ... 43.821 1.285575e+06 0
3 1609473780000 29339.05 29340.01 ... 26.836 7.870962e+05 0
4 1609473840000 29334.63 29334.63 ... 6.004 1.760785e+05 0
... ... ... ... ... ... ... ...
1435 1609559700000 29357.15 29370.00 ... 35.133 1.031685e+06 0
1436 1609559760000 29370.00 29380.07 ... 25.957 7.624015e+05 0
1437 1609559820000 29378.76 29382.00 ... 20.663 6.070590e+05 0
1438 1609559880000 29371.32 29374.25 ... 15.185 4.459265e+05 0
1439 1609559940000 29363.07 29364.68 ... 4.084 1.199246e+05 0
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。