首页 > 解决方案 > 在循环中追加列表的最有效方法

问题描述

我是 python 新手。

我有以下从 API 请求数据的代码:

histdata = ib.reqHistoricalTicks(contracts[i],start,"",1000,'TRADES', 1, True, [])'
print(histdata)

返回的数据是以下不带合约代码的价格信息:

[HistoricalTickLast(time=datetime.datetime(2021, 3, 3, 14, 30, tzinfo=datetime.timezone.utc), tickAttribLast=TickAttribLast(pastLimit=False, unreported=True), price=0.95, size=1, exchange='ISE', specialConditions='f'), HistoricalTickLast(time=datetime.datetime(2021, 3, 3, 14, 30, tzinfo=datetime.timezone.utc), tickAttribLast=TickAttribLast(pastLimit=False, unreported=True), price=0.94, size=1, exchange='ISE', specialConditions='f')]

我想知道的第一件事是这种类型的字符串是列表,列表列表,字典,数据框还是python中的其他东西?

我想在每个价格行的开头添加一个带有合约代码的“列”。

数据应如下所示:

象征 时间 tickAttribLast 价格 尺寸 交换 特殊情况
XYZ 2021-03-03 14:30:00+00:00 TickAttribLast(过去限制=假,未报告=真) 0.95 1 伊势 F
XYZ 2021-03-03 14:30:00+00:00 TickAttribLast(过去限制=假,未报告=真) 0.94 1 伊势 F

此外,我想循环多个合约,获取价格信息,添加合约代码并将合约价格与之前的合约价格信息合并。

这是我失败的尝试。您能否指导我将合约代码添加到 histdata 中的每一行然后将此信息附加到单个列表或数据框中的最有效方法?

在此先感谢您的帮助!

i = 0

#The variable contracts is a list of contracts, here I loop the first 2 items
for t in contracts[0:1]:

print("processing contract: ", i)

#histdata get the price information of the contract (multiple price rows per contract as shown above)
histdata = ib.reqHistoricalTicks(contracts[i],start,"",1000,'TRADES', 1, True, [])

#failed attempt to add contracts[i].localSymbol at the start of each row
histdata.insert(0,contracts[i].localSymbol)

#failed attempt to append this table with the new contract information

histdata.append(histdata)

i = i + 1

编辑#1:

我会尝试分解我想要完成的事情。

这是 histdata 的结果:

[HistoricalTickLast(time=datetime.datetime(2021, 3, 3, 14, 30, tzinfo=datetime.timezone.utc), tickAttribLast=TickAttribLast(pastLimit=False, unreported=True), price=0.95, size=1, exchange='ISE', specialConditions='f'), HistoricalTickLast(time=datetime.datetime(2021, 3, 3, 14, 30, tzinfo=datetime.timezone.utc), tickAttribLast=TickAttribLast(pastLimit=False, unreported=True), price=0.94, size=1, exchange='ISE', specialConditions='f')]

添加属性“Symbol”并将该属性的值“XYZ”添加到每个 HistoricalTickLast 条目所需的代码是什么,如下所示:

[HistoricalTickLast(Symbol='XYZ', time=datetime.datetime(2021, 3, 3, 14, 30, tzinfo=datetime.timezone.utc), tickAttribLast=TickAttribLast(pastLimit=False, unreported=True), price=0.95, size=1, exchange='ISE', specialConditions='f'), HistoricalTickLast(Symbol='XYZ', time=datetime.datetime(2021, 3, 3, 14, 30, tzinfo=datetime.timezone.utc), tickAttribLast=TickAttribLast(pastLimit=False, unreported=True), price=0.94, size=1, exchange='ISE', specialConditions='f')]

编辑#2

我对 map 函数有点困惑,所以我出去将我的 LastHistoricalTicks 实例转换为数据框。现在,除了将属性“符号”添加到我的第一个数据帧之外,我还合并了另一个包含关键“时间”上的 BID/ASK 的数据帧。我相信这一定是效率最低的方法。

有人想帮助我获得更有效的代码吗?:

histdf = pd.DataFrame()

print("CONTRACTS LENGTH :", len(contracts))
for t in contracts:
print("processing contract: ", i)
histdata = ib.reqHistoricalTicks(contracts[i],start,"",1000,'TRADES', 1, 
True, [])
histbidask = ib.reqHistoricalTicks(contracts[i],start,"",1000,'BID_ASK', 1, 
True, [])
tempdf = pd.DataFrame(histdata)
tempdf2 =pd.DataFrame(histbidask)
try :
    tempdf3 = pd.merge(tempdf,tempdf2, how='inner', on='time')
    tempdf3.insert(0,'localSymbol', contracts[i].localSymbol)
    histdf = pd.concat([histdf,tempdf3])
except :
    myerror["ErrorContracts"].append(format(contracts[i].localSymbol))
i = i + 1

标签: pythonlist

解决方案


  1. 使用 type() 来验证你的变量是一个列表(由 [] 表示)
  2. 每个条目都是 HistoricalTickLast 的实例。当您说要添加“列”时,这意味着向类添加属性,或者更像是您希望将其处理为普通旧数据(POD),例如作为列表列表或列表字典。

推荐阅读