Я написал код, который успешно извлекает данные из 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