tablas - pandas python tutorial español pdf
¿Cómo almaceno los datos de la API de Bloomberg en un marco de datos de Pandas? (6)
Recientemente comencé a usar Python para poder interactuar con la API de Bloomberg, y tengo algunos problemas para almacenar los datos en un marco de datos de Pandas (o un panel). Puedo obtener la salida en el indicador de comandos bien, así que no es un problema.
Una pregunta muy similar se hizo aquí: ¿ Pandas wrapper para Bloomberg api?
Sin embargo, el código referenciado en la respuesta aceptada para esa pregunta es para la API antigua y no funciona para la nueva API abierta. Aparentemente, el usuario que hizo la pregunta pudo modificar fácilmente ese código para trabajar con la nueva API, pero estoy acostumbrado a que mi mano esté en R, y este es mi primer esfuerzo con Python.
¿Podría algún usuario benevolente mostrarme cómo obtener esta información en Pandas? Hay un ejemplo en la API de Python (disponible aquí: http://www.openbloomberg.com/open-api/ ) llamado SimpleHistoryExample.py con el que he estado trabajando y que he incluido a continuación. Creo que tendré que modificar la mayoría del tiempo alrededor del ciclo ''while (True)'' hacia el final de la función ''main ()'', pero todo lo que he intentado hasta ahora ha tenido problemas.
Gracias de antemano, y espero que esto pueda ser de ayuda para cualquiera que use Pandas para finanzas.
# SimpleHistoryExample.py
import blpapi
from optparse import OptionParser
def parseCmdLine():
parser = OptionParser(description="Retrieve reference data.")
parser.add_option("-a",
"--ip",
dest="host",
help="server name or IP (default: %default)",
metavar="ipAddress",
default="localhost")
parser.add_option("-p",
dest="port",
type="int",
help="server port (default: %default)",
metavar="tcpPort",
default=8194)
(options, args) = parser.parse_args()
return options
def main():
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("securities").appendValue("IBM US Equity")
request.getElement("securities").appendValue("MSFT US Equity")
request.getElement("fields").appendValue("PX_LAST")
request.getElement("fields").appendValue("OPEN")
request.set("periodicityAdjustment", "ACTUAL")
request.set("periodicitySelection", "DAILY")
request.set("startDate", "20061227")
request.set("endDate", "20061231")
request.set("maxDataPoints", 100)
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 completly received, so we could exit
break
finally:
# Stop the session
session.stop()
if __name__ == "__main__":
print "SimpleHistoryExample"
try:
main()
except KeyboardInterrupt:
print "Ctrl+C pressed. Stopping..."
Acabo de publicar esto que podría ayudar
http://github.com/alex314159/blpapiwrapper
Básicamente, no es muy intuitivo desempaquetar el mensaje, pero esto es lo que me funciona, donde strData es una lista de campos bloomberg, por ejemplo [''PX_LAST'', ''PX_OPEN'']:
fieldDataArray = msg.getElement(''securityData'').getElement(''fieldData'')
size = fieldDataArray.numValues()
fieldDataList = [fieldDataArray.getValueAsElement(i) for i in range(0,size)]
outDates = [x.getElementAsDatetime(''date'') for x in fieldDataList]
output = pandas.DataFrame(index=outDates,columns=strData)
for strD in strData:
outData = [x.getElementAsFloat(strD) for x in fieldDataList]
output[strD] = outData
output.replace(''#N/A History'',pandas.np.nan,inplace=True)
output.index = output.index.to_datetime()
return output
Ahora existe una API de Bloomberg adecuada para python que no usa COM. Tiene todos los ganchos para permitirle replicar la funcionalidad del complemento de Excel, con la ventaja obvia de un punto final de lenguaje de programación adecuado. Los objetos de solicitud y respuesta están bastante mal documentados y son bastante obtusos. Aún así, los ejemplos en la API son buenos, y algunos de los que usan el módulo de inspección e imprimen los mensajes de respuesta deberían ponerlo al día. Lamentablemente, la licencia de terminal estándar solo funciona en Windows. Para * nix necesitará una licencia de servidor (incluso más cara). Lo he usado bastante extensivamente.
He estado usando pybbg para hacer este tipo de cosas. Puedes obtenerlo aqui:
https://github.com/bpsmith/pybbg
Importe el paquete y luego puede hacerlo (esto está en el código fuente, archivo bbg.py):
banner(''ReferenceDataRequest: single security, single field, frame response'')
req = ReferenceDataRequest(''msft us equity'', ''px_last'', response_type=''frame'')
print req.execute().response
Las ventajas:
Fácil de usar; Mínimo repetitivo, y analiza los índices y las fechas para usted.
Esta bloqueando Como menciona R, asumo que lo está utilizando en algún tipo de entorno interactivo, como IPython. Así que esto es lo que quieres, en lugar de tener que perder el tiempo con las devoluciones de llamada.
También puede realizar solicitudes de datos históricos (es decir, series de precios), intradía y en volumen (sin datos de tick aún).
Desventajas:
Solo funciona en Windows, que yo sepa (debe tener instalado y en funcionamiento BB workstationg).
Siguiendo con lo anterior, depende de la API de OLE de 32 bits para Python. Solo funciona con la versión de 32 bits, por lo que necesitará Python de 32 bits y enlaces OLE de 32 bits.
Hay algunos errores. En mi experiencia, cuando recupero datos para una serie de instrumentos, tiende a colgar IPython. No estoy seguro de qué causa esto.
Sobre la base del último punto, sugeriría que si obtiene grandes cantidades de datos, los recupere y los almacene en una hoja de Excel (un instrumento por hoja) y luego los importe. read_excel
no es eficiente para hacer esto; debe utilizar el objeto ExcelReader (?) y luego iterar sobre las hojas. De lo contrario, el uso de read_excel volverá a abrir el archivo cada vez que lea una hoja; Esto puede llevar siglos.
También puede usar pdblp para esto (Descargo de responsabilidad: Soy el autor). Hay un tutorial que muestra una funcionalidad similar disponible aquí https://matthewgilbert.github.io/pdblp/tutorial.html , la funcionalidad podría lograrse usando algo como
import pdblp
con = pdblp.BCon()
con.start()
con.bdh([''IBM US Equity'', ''MSFT US Equity''], [''PX_LAST'', ''OPEN''],
''20061227'', ''20061231'', elms=[("periodicityAdjustment", "ACTUAL")])
Tia github.com/bpsmith/tia es lo mejor que he encontrado, y los he probado todos ... Te permite hacerlo:
import pandas as pd
import datetime
import tia.bbg.datamgr as dm
mgr = dm.BbgDataManager()
sids = mgr[''BAC US EQUITY'', ''JPM US EQUITY'']
df = sids.get_historical([''BEST_PX_BPS_RATIO'',''BEST_ROE''],
datetime.date(2013,1,1),
datetime.date(2013,2,1),
BEST_FPERIOD_OVERRIDE="1GY",
non_trading_day_fill_option="ALL_CALENDAR_DAYS",
non_trading_day_fill_method="PREVIOUS_VALUE")
print df
#and you''ll probably want to carry on with something like this
df1=df.unstack(level=0).reset_index()
df1.columns = (''ticker'',''field'',''date'',''value'')
df1.pivot_table(index=[''date'',''ticker''],values=''value'',columns=''field'')
df1.pivot_table(index=[''date'',''field''],values=''value'',columns=''ticker'')
El almacenamiento en caché también es bueno.
Tanto https://github.com/alex314159/blpapiwrapper como https://github.com/kyuni22/pybbg hacen el trabajo básico (¡gracias! .
Lo único que este https://github.com/kyuni22/pybbg tiene que tia no tiene es bds (seguridad, campo).
Yo uso tia ( https://github.com/bpsmith/tia/blob/master/examples/datamgr.ipynb )
Ya descarga datos como un marco de datos panda desde bloomberg. Puede descargar el historial de múltiples tickers en una sola llamada e incluso descargar algunos datos de referencia de bloombergs (reuniones de fecha del Banco Central, días festivos para un país determinado, etc.)
Y acabas de instalarlo con pip. Este enlace está lleno de ejemplos, pero descargar datos históricos es tan fácil como:
import pandas as pd
import tia.bbg.datamgr as dm
mgr = dm.BbgDataManager()
sids = mgr[''MSFT US EQUITY'', ''IBM US EQUITY'', ''CSCO US EQUITY'']
df = sids.get_historical(''PX_LAST'', ''1/1/2014'', ''11/12/2014'')
y df es un marco de datos de pandas.
Espero eso ayude