получить данные из API Bloomberg с помощью Python через Excel - PullRequest
0 голосов
/ 07 февраля 2019

Я написал код, который успешно извлекает данные из API Bloomberg с помощью python для написания запроса в Excel, затем запускает Excel, получает данные через плагин Bloomberg, передает данные в CSV (для более легкого использования вPython и другие последующие потребности) и возвращается.

Единственная проблема заключается в том, что для извлечения данных в Excel нужно установить time.sleep (40), прежде чем я сохраню файл, так как соединение через Excel требует достаточно времени для извлечения данных.Мне интересно, есть ли способ автоматически определять, когда данные были извлечены?- План состоит в том, чтобы увеличить это количество, чтобы выполнить много запросов в цикле или в нескольких потоках, и для того, чтобы это было эффективным, мне нужно определить, когда были получены данные, чтобы начать следующий шаг.

Любые идеибыть действительно полезным?Смотрите функцию run_VBA. Вот мой код:

import xlsxwriter
import pandas as pd
import xlwings as xl
import glob
import openpyxl
import time
import os
import win32com.client

def write_bloomberg_query_in_excel():
    """main function, make an excel workbook containing an api query, open the file and allow the data to 
        be pulled from the api, save and close, then transfer the data into a pandas df and csv"""

    WB = 'C:/python_workspace/bloomberg_api_data_pull/excel_queries/daily_wind_temp_precip.xlsx'
    location = "EGLL"

    make_workbook(WB, location)

    run_VWA(WB, location)

    df = df_from_excel(WB, location)  # sheetname is optional
    df.to_csv(WB.split('.')[0]+'.csv', index=False)

    return

def run_VWA(WB, location):
    """open the excel file, allow enough time to pull the data, then close and save"""

    bb = 'C:/blp/API/Office Tools/BloombergUI.xla'
    xl=win32com.client.DispatchEx("Excel.Application")  
    xl.Workbooks.Open(bb)
    xl.AddIns("Bloomberg Excel Tools").Installed = True
    wb = xl.Workbooks.Open(Filename=WB) #opens workbook in readonly mode.

    xl.Visible = False
    # need help here!! this time works for this query but I need to scale
    # the api calls and need a way to select time or detect when 
    # the download has happened
    time.sleep(40)         

    wb.Close(SaveChanges=1)

    xl.Quit()
    #Cleanup the com reference. 
    del xl   

    return

def make_workbook(WB, location):
    """write a bloomberg api query into an an excel workbook """

    # Create a workbook and add a worksheet.
    workbook = xlsxwriter.Workbook(WB)
    worksheet = workbook.add_worksheet(location)

    # Some data we want to write to the worksheet.
    W = """=BSRCH("comdty:weather","provider=wsi","location={}",
        "model=ACTUALS","frequency=DAILY","target_start_date=2018-08-01",
        "target_end_date=2018-12-31", 
        "fields=WIND_SPEED|TEMPERATURE|PRECIPITATION_24HR")""".format(location)

    # write to worksheet using formula
    worksheet.write(0, 0, W)
    # close
    workbook.close()
    return

def df_from_excel(path, SN):
    """read the contents of an excel file into a pandas dataframe"""
    app = xl.App(visible=False)
    book = app.books.open(path)
    sheet = book.sheets(SN)
    book.save()
    df = pd.read_excel(path, sheet_name=SN)
    app.kill()
    return df


if __name__=="__main__":
    write_bloomberg_query_in_excel()

Я знаю, что было бы более разумно просто получить эти данные из API Python, однако поддержка запроса типа 'bsrch' отсутствует.что я здесь делаю.

Однако я открыт для лучших подходов?Предпочтительно питон или, возможно, R

...