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

Issue With Getting Values from a List of Objects into a Readable Dataframe

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

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

我可以通过深入获取特定值,并调用它来保存结果[0].high 或 result[0].low 等。但是我必须遍历 1440 个烛台data 和 write/save 它们全部分开,然后将它们每个的 high/low/open/close/time/etc 汇集在一起​​以便能够绘制,这比我看过的教程做的要复杂得多。他们能够毫不费力地立即使用数据框进行绘图,他们不会 运行 进入属性错误,就像它只是为他们正确识别列一样。但是当我查看 'result' 的列时,有 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__ which returns: {'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所以 priceData = pd.DataFrame([candlestick_obj.__dict__ for candlestick_obj in result]) 将创建一个 DataFrame,其中包含每个字典中的键的列,每个列表项有 1 行。

           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

您的其余代码没有问题,您的图表函数按预期生成了烛台图表。

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)

## you want the attributes of the Candlestick object
priceData = pd.DataFrame([candlestick_obj.__dict__ for candlestick_obj in 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('priceData.csv', index_col=0)
    # print(pricedata.head())
    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()