如何将字典转换为Dataframe

时间:2017-04-11 21:41:42

标签: python dictionary dataframe data-conversion bloomberg

我正在尝试将字典输出转换为Dataframe。

对于我的具体项目,我使用Bloomberg服务API为股票代码请求一些历史数据点。他们以字典形式给我输出,但我需要将其转换为更易于管理的DataFrame。到目前为止,所有解决方案看起来都很复是否有一种直接的pythonic方式来实现这一目标?

谢谢!

产生输出的代码片段:

def main():
    output = {}
    options = parseCmdLine()

    # Fill SessionOptions
    sessionOptions = blpapi.SessionOptions()
    sessionOptions.setServerHost(options.host)
    sessionOptions.setServerPort(options.port)

    print ("Connecting to %s:%s" % (options.host, options.port))
    # Create a Session
    session = blpapi.Session(sessionOptions)

    # Start a Session
    if not session.start():
        print ("Failed to start session.")
        return

    try:
        # Open service to get historical data from
        if not session.openService("//blp/refdata"):
            print ("Failed to open //blp/refdata")
            return

        # Obtain previously opened service
        refDataService = session.getService("//blp/refdata")

        # Create and fill the request for the historical data
        request = refDataService.createRequest("HistoricalDataRequest")
        request.getElement("fields").appendValue("BEST_SALES")
        request.getElement("fields").appendValue("BEST_EBITDA")
        request.getElement("fields").appendValue("BEST_EPS")
        request.getElement("fields").appendValue("CURR_ENTP_VAL")
        request.getElement("fields").appendValue("CUR_MKT_CAP")
        request.getElement("fields").appendValue("LAST_PRICE")
        # Elements passed to it
        request.getElement("securities").appendValue("MSFT US Equity")

        # Add overrides
        overrides = request.getElement("overrides")
        override1 = overrides.appendElement()
        override1.setElement("fieldId", "BEST_FPERIOD_OVERRIDE")
        override1.setElement("value", "1FY")
        override2 = overrides.appendElement()
        override2.setElement("fieldId", "BEST_CONSOLIDATED_OVERRIDE")
        override2.setElement("value", "C")
        override3 = overrides.appendElement()
        override3.setElement("fieldId", "EQY_FUND_CRNCY")
        override3.setElement("value", "USD")
        # Add historical adjustments
        request.set("periodicityAdjustment", "ACTUAL")
        request.set("periodicitySelection", "DAILY")
        request.set("maxDataPoints", 100)
        ## NEED TO PASS THIS
        request.set("startDate", "20160106")
        request.set("endDate", "20160107")


        print ("Sending Request:", request)
        # Send the request
        session.sendRequest(request)

        # Process received events
        while(True):
            # We provide timeout to give the chance for Ctrl+C handling:
            ev = session.nextEvent(500)
            for msg in ev:
                print (msg)
            if ev.eventType() == blpapi.Event.RESPONSE:
                # Response completely received, so we could exit
                break
    finally:
        # Stop the session
        session.stop()

以字典形式输出:

HistoricalDataResponse = {
    securityData = {
        security = "MSFT US Equity"
        eidData[] = {
        }
        sequenceNumber = 0
        fieldExceptions[] = {
        }
        fieldData[] = {
            fieldData = {
                date = 2016-01-06
                BEST_SALES = 98338.750000
                BEST_EPS = 3.108000
                CURR_ENTP_VAL = 373535.702300
                CUR_MKT_CAP = 431746.702300
                LAST_PRICE = 54.050000
            }
            fieldData = {
                date = 2016-01-07
                BEST_SALES = 98351.040000
                BEST_EBITDA = 37885.200000
                BEST_EPS = 3.110000
                CURR_ENTP_VAL = 358518.425700
                CUR_MKT_CAP = 416729.425700
                LAST_PRICE = 52.170000
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您可以查看pdblp包(免责声明:我是作者)

对于你的例子,应该工作(我目前没有bbg 连接虽然没有实际测试过这个)

import pdblp
con = pdblp.BCon()
con.start()

fields = ['BEST_SALES', 'BEST_EBITDA', 'BEST_EPS', 'CURR_ENTP_VAL',
          'CUR_MKT_CAP', 'LAST_PRICE']


ovrds = [('BEST_FPERIOD_OVERRIDE', '1FY'), ('BEST_CONSOLIDATED_OVERRIDE', 'C'),
         ('EQY_FUND_CRNCY', 'USD')]

elms = [('periodicityAdjustment', 'ACTUAL'),
        ('periodicitySelection', 'ACTUAL'), ('maxDataPoints', 100)]


df = con.bdh('MSFT US Equity', fields, '20150629', '20150630', elms=elms,
             ovrds=ovrds)