python - 在循环中追加列表的最有效方法
问题描述
我是 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
解决方案
- 使用 type() 来验证你的变量是一个列表(由 [] 表示)
- 每个条目都是 HistoricalTickLast 的实例。当您说要添加“列”时,这意味着向类添加属性,或者更像是您希望将其处理为普通旧数据(POD),例如作为列表列表或列表字典。
推荐阅读
- ruby - 将一个范围的每个项目分配给哈希中另一个范围的每个项目
- javascript - 单击选择/选项时的 JavaScript 新选项卡
- angular - 为什么 flushMicrotasks() 和 tick() 在 fakeAsync 中不执行 setImmediate 回调?
- django - Django 密码显示在表单数据(发布/请求)中
- python - 定位 ID 的最小值和最大值的数据框列
- apache-spark - 将每个 spark 数据框元素与同一数据框的所有其余部分进行比较
- mongodb - pgadmin4 的未完成安装不断阻止其他安装
- javascript - 为什么cypress看不到border *属性的css值?
- php - 替换txt文件中的空格和特殊字符
- java - 从 Jersey 1.x 移动到 Jersey 2.x - NoSuchMethod 错误