将对象列表中的值获取到可读数据框中的问题

如何解决将对象列表中的值获取到可读数据框中的问题

过去几天我一直遇到同样的问题,在这个论坛上搜索所有内容并寻找答案,但我尝试的任何内容似乎都没有奏效。我一直在关注其他人发布的教程,他们能够非常简单地做到这一点,但是当我从多个角度尝试时遇到了多个问题。我的头因为我尝试过的所有事情而变得如此纠结,以至于我什至不确定发生了什么或我做了什么。这不是全部代码,但这应该是唯一相关的代码,因为其他部分执行其他功能,但如果我遗漏了任何内容,我深表歉意。

基本上,我从网站获取历史金融烛台数据,尝试将其放入 Pandas 数据框,然后使用该数据框使用 Plotly 制作图表。我将数据作为“结果”获取,PyCharm 将数据输出到“运行”框中就好了,但现在我需要保存该数据,因此我让 Pandas 将“结果”转换为“priceData”的数据框,然后将其转换到“pricedata.csv”。当我打开那个 CSV 文件时,我得到的只是一个从 0 到 1439 的列表(我一次导入 1440 个 1 分钟烛台),并且每个烛台只显示对象引用(,或类似)。这显然不是我想要的,我需要烛台内的数据,它应该由 12 条数据组成(开盘时间、开盘价、最低价、收盘价、最高价等...)。当图表函数运行时,它返回“AttributeError: 'DataFrame' object has no attribute 'high'”,我认为这是因为它访问的是烛台对象 ID 而不是值。

我可以通过深入获取特定值,并调用它来保存 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

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?