2016-08-24 4 views
1

У меня есть код ниже, который загружает исторические данные с помощью IbPy из Interactive Brokers и сохраняет это в csv. Вместо того, чтобы сохранять его в csv, я хотел бы напрямую передать данные в фрейм данных pandas (минуя бит csv).конвертировать запрос данных IbPy в dataframe pandas

Может ли кто-нибудь помочь?

from time import sleep, strftime, localtime 
from ib.ext.Contract import Contract 
from ib.opt import ibConnection, message 


new_symbolinput = ['ES', 'NQ'] 
newDataList = [] 
dataDownload = [] 

def historical_data_handler(msg): 
    global newDataList 
    print (msg.reqId, msg.date, msg.close) 
    if ('finished' in str(msg.date)) == False: 
     new_symbol = new_symbolinput[msg.reqId] 
     dataStr = '%s, %s, %s' % (new_symbol, strftime("%Y-%m-%d", localtime(int(msg.date))), msg.close) 
     newDataList = newDataList + [dataStr] 
    else: 
     new_symbol = new_symbolinput[msg.reqId] 
     filename = 'minutetrades' + new_symbol + '.csv' 
     csvfile = open('csv_day_test/' + filename,'w') 
     for item in newDataList: 
      csvfile.write('{} \n'.format(item)) 
     csvfile.close() 
     newDataList = [] 
     global dataDownload 
     dataDownload.append(new_symbol) 

con = ibConnection() 
con.register(historical_data_handler, message.historicalData) 
con.connect() 

symbol_id = 0 
for i in new_symbolinput: 
    print (i) 
    qqq = Contract() 
    qqq.m_symbol = i 
    qqq.m_secType = 'FUT' 
    qqq.m_exchange = 'GLOBEX' 
    qqq.m_currency = 'USD' 
    qqq.m_expiry = '201609' 
    con.reqHistoricalData(symbol_id, qqq, '', '1 W', '1 day', 'TRADES', 1, 2) 

    symbol_id = symbol_id + 1 
    sleep(10) 

print (dataDownload) 
filename = 'downloaded_symbols.csv' 
csvfile = open('csv_day_test/' + filename,'w') 
for item in dataDownload: 
    csvfile.write('%s \n' % item) 
csvfile.close() 
+0

Мне не очень понятно, что делает ваш код. Не могли бы вы показать/объяснить, что содержит переменная 'dataDownload'? Возможным решением было бы хранить данные в виде словаря и в конце вызова 'pd.DataFrame (dictionary)'. –

ответ

1

В Защиту historical_data_handler (МСГ) замените код ниже; это будет записываться непосредственно в dataframe.

else: 
df_new = pd.DataFrame(columns=['Code', 'Date', 'Close']) 
j = 0 
for i in newDataList: 
    df_new.loc[j] = i.split(',') 
    j = j + 1 
df_new.set_index('Date',inplace=True) 
#print df_new 

Рассмотрим записи значений msg.close непосредственно в DF, а не первого размещения в строке и расщепления.

Смежные вопросы