我正在尝试将字典输出转换为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
}
}
}
}
答案 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)