【问题标题】:Storing API Data Into A DataFrame将 API 数据存储到 DataFrame 中
【发布时间】:2020-10-06 12:12:50
【问题描述】:

我正在运行 Python 脚本以从 Interactive Brokers API 收集金融市场数据。连接到 API 后,终端打印出请求的历史数据。如何将数据保存到数据框中而不是在终端中流式传输?

from ibapi.wrapper import EWrapper
from ibapi.client import EClient 
from ibapi.contract import Contract
from ibapi.ticktype import TickTypeEnum


class TestApp(EWrapper, EClient):
    def __init__(self):
        EClient.__init__(self,self)

    def error(self, reqId, errorCode, errorString):
        print("Error: ", reqId, " ", errorCode, " ", errorString)

    def historicalData(self, reqId, bar):
        print("historicalData. ", reqId, "Data:", bar.date, "Open:", bar.open, "High:", bar.high, "low:", bar.low, "close:", bar.close, "Volume:", bar.volume, "WAP:", bar.average)


def main():
    app = TestApp()
    app.connect("127.0.0.1", 7497, 0)

    contract = Contract()
    contract.symbol = "EUR"
    contract.secType = "CASH"
    contract.exchange = "IDEALPRO"
    contract.currency = "USD"

    app.reqHistoricalData(1, contract, "", "1 D", "1 min", "MIDPOINT", 0, 1, False, [])

    app.run()


if __name__ == "__main__":
    main()

代码的输出打印历史数据的提要,例如:

historicalData.  1 Data: 20200616  11:53:00 Open: 1.125985 High: 1.12601 low: 1.12592 close: 1.12592 Volume: -1 WAP: -1.0
historicalData.  1 Data: 20200616  11:54:00 Open: 1.12592 High: 1.125925 low: 1.12583 close: 1.125885 Volume: -1 WAP: -1.0
historicalData.  1 Data: 20200616  11:55:00 Open: 1.125885 High: 1.126045 low: 1.125865 close: 1.126045 Volume: -1 WAP: -1.0

如何将这些信息存储到数据框中,而不是仅打印在终端中?

【问题讨论】:

    标签: python api dataframe algorithmic-trading interactive-brokers


    【解决方案1】:

    您可以在 TestApp 对象中创建一个数据框,然后在每次调用 historyData() 时添加一行。

    def __init__(self):
        ...
        self.df = pd.DataFrame(columns=['date', 'open', 'high', 'low', 'close', 'volume'])
    
    
    def historicalData(self, reqId, bar):
        self.df.loc[len(self.df)] = [bar.date, bar.open, bar.high, bar.low, bar.close, bar.volume]
    

    【讨论】:

    • 乔希 - 谢谢。 Python noob here:我如何获取此代码并实际输出生成的数据帧?如果尝试打印或访问 df 它不存在。我想输出df然后将数据存储在sql中。
    • #创建sql和表 conn = sqlite3.connect('BB', check_same_thread = False) c = conn.cursor() c.execute('CREATE TABLE test6 (Dates text, Open number)' ) conn.commit() #Interactive Brokers 测试应用程序类 IBapi(EWrapper, EClient): def __init__(self): EClient.__init__(self, self) self.cols = ['dates', 'open'] self.df = pd.DataFrame(columns=self.cols) #历史数据 def historyData(self, reqId, bar): self.df.loc[len(self.df)] = [bar.date, bar.open] self.df. to_sql('test6', conn, if_exists='replace', index = False)
    【解决方案2】:

    你也可以使用 DataFrame.append() 函数。

    所有历史数据返回后,将整个DataFrame写入数据库,然后将原来的DataFrame清空,以备下一次循环使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-10
      • 2019-03-23
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      • 2019-12-22
      • 2022-06-29
      • 2020-04-13
      相关资源
      最近更新 更多