Самый эффективный способ добавления списка в цикле

#python #list

#python #Список

Вопрос:

Я новичок в python.

У меня есть следующий код, который запрашивает данные из API:

 histdata = ib.reqHistoricalTicks(contracts[i],start,"",1000,'TRADES', 1, True, [])'
print(histdata)
 

Возвращаемые данные представляют собой следующую информацию о цене без символа контракта:

 [HistoricalTickLast(time=datetime.datetime(2021, 3, 3, 14, 30, tzinfo=datetime.timezone.utc), tickAttribLast=TickAttribLast(pastLimit=False, unreported=True), price=0.95, size=1, exchange='ISE', specialConditions='f'), HistoricalTickLast(time=datetime.datetime(2021, 3, 3, 14, 30, tzinfo=datetime.timezone.utc), tickAttribLast=TickAttribLast(pastLimit=False, unreported=True), price=0.94, size=1, exchange='ISE', specialConditions='f')]
 

Первое, что я хотел бы знать, является ли этот тип строки списком, списком списков, словарем, фреймом данных или чем-то еще в python?

Я хотел бы добавить «столбец» с символом контракта в начале каждой ценовой строки.

Данные должны выглядеть следующим образом :

Символ время tickAttribLast Цена размер Обмен Особые условия
XYZ 2021-03-03 14:30:00 00:00 TickAttribLast(pastLimit= False, не сообщается = True) 0.95 1 ISE f
XYZ 2021-03-03 14:30:00 00:00 TickAttribLast(pastLimit= False, не сообщается = True) 0.94 1 ISE f

Более того, я хотел бы перебрать несколько контрактов, получить информацию о цене, добавить символ контракта и объединить цену контракта с предыдущей информацией о цене контракта.

Вот моя неудачная попытка. Не могли бы вы подсказать мне, какой наиболее эффективный способ добавить символ контракта к каждой строке в histdata, а затем добавить эту информацию в один список или фрейм данных?

Заранее спасибо за вашу помощь!

 i = 0

#The variable contracts is a list of contracts, here I loop the first 2 items
for t in contracts[0:1]:

print("processing contract: ", i)

#histdata get the price information of the contract (multiple price rows per contract as shown above)
histdata = ib.reqHistoricalTicks(contracts[i],start,"",1000,'TRADES', 1, True, [])

#failed attempt to add contracts[i].localSymbol at the start of each row
histdata.insert(0,contracts[i].localSymbol)

#failed attempt to append this table with the new contract information

histdata.append(histdata)

i = i   1
 

Редактировать # 1 :

Я попытаюсь разобрать, чего я пытаюсь достичь.

Вот результат histdata :

 [HistoricalTickLast(time=datetime.datetime(2021, 3, 3, 14, 30, tzinfo=datetime.timezone.utc), tickAttribLast=TickAttribLast(pastLimit=False, unreported=True), price=0.95, size=1, exchange='ISE', specialConditions='f'), HistoricalTickLast(time=datetime.datetime(2021, 3, 3, 14, 30, tzinfo=datetime.timezone.utc), tickAttribLast=TickAttribLast(pastLimit=False, unreported=True), price=0.94, size=1, exchange='ISE', specialConditions='f')]
 

Какой код необходим для добавления атрибута «Symbol» и присвоения этому атрибуту значения «XYZ» для каждой записи HistoricalTickLast, подобной этой :

 [HistoricalTickLast(Symbol='XYZ', time=datetime.datetime(2021, 3, 3, 14, 30, tzinfo=datetime.timezone.utc), tickAttribLast=TickAttribLast(pastLimit=False, unreported=True), price=0.95, size=1, exchange='ISE', specialConditions='f'), HistoricalTickLast(Symbol='XYZ', time=datetime.datetime(2021, 3, 3, 14, 30, tzinfo=datetime.timezone.utc), tickAttribLast=TickAttribLast(pastLimit=False, unreported=True), price=0.94, size=1, exchange='ISE', specialConditions='f')]
 

РЕДАКТИРОВАТЬ # 2

Я немного запутался с функцией map, поэтому я вышел и преобразовал свои экземпляры LastHistoricalTicks в dataframe. Теперь, в дополнение к добавлению атрибута ‘Symbol’ к моему первому фрейму данных, я также объединяю другой фрейм данных, который содержит СТАВКУ / ЗАПРОС по ключу ‘time’. Я уверен, что это должен быть наименее эффективный способ сделать это.

Кто-нибудь хочет помочь мне с более эффективным кодом? :

 histdf = pd.DataFrame()

print("CONTRACTS LENGTH :", len(contracts))
for t in contracts:
print("processing contract: ", i)
histdata = ib.reqHistoricalTicks(contracts[i],start,"",1000,'TRADES', 1, 
True, [])
histbidask = ib.reqHistoricalTicks(contracts[i],start,"",1000,'BID_ASK', 1, 
True, [])
tempdf = pd.DataFrame(histdata)
tempdf2 =pd.DataFrame(histbidask)
try :
    tempdf3 = pd.merge(tempdf,tempdf2, how='inner', on='time')
    tempdf3.insert(0,'localSymbol', contracts[i].localSymbol)
    histdf = pd.concat([histdf,tempdf3])
except :
    myerror["ErrorContracts"].append(format(contracts[i].localSymbol))
i = i   1
 

Комментарии:

1. histdata является a list HistoricalTickLast , который имеет такие атрибуты, как time , и т.д. tickAttribLast

2. Спасибо, назовите правильное имя каждой отдельной строки в списке (вся информация разделяется запятыми)… У меня возникла проблема с переключением с кода типа строк / столбцов VBA на python

Ответ №1:

  1. Используйте type(), чтобы убедиться, что ваша переменная является списком (обозначается символом [])
  2. Каждая запись представляет собой экземпляры HistoricalTickLast . Когда вы говорите, что хотите добавить «столбец», это либо означает добавление атрибута к классу, либо что-то в этом роде, вы хотите обработать это так, как если бы это были простые старые данные (POD), например, как список списка или список dict.

Комментарии:

1. Большое вам спасибо за быстрый ответ. Я подтверждаю, что histdata — это список: <class ‘list’> Каков наилучший способ проверки переменных в python без использования print(type(histdata)) в середине моего кода?

2. В Python вы обычно не пишете код для проверки типов. Вместо этого напишите свой код так, как если бы он был правильным, затем оберните код в блок try except для обработки ошибок. Вы можете, конечно, сделать if type(variable) == type(''): ...

3. Для # 2 я хочу добавить атрибут к каждой записи historicalTicklast . Этот атрибут будет символом контракта, который находится в contracts[i].localSymbol . Каков наиболее эффективный способ сделать это?

4. Повторите # 2, вы должны сообщить нам, что вы хотите (в идеале, обновив вопрос).

Ответ №2:

Вы уверены, что histdata — это список?

Если это не список, а итератор, вы можете использовать list() для преобразования его в список.

Кроме того, чтобы добавить элемент в начале каждого внутреннего списка, вы можете использовать map:

Я думаю, что этот пример кода может вам помочь:

 all_hisdata = []
for contract in contracts:
    histdata = list(ib.reqHistoricalTicks(
            contract,start,"",1000,'TRADES', 1, True, []))
    new_histdata = list(
        map(lambda e: [contract.localSymbol] e, histdata)
    )
    all_hisdata.append(new_histdata)
 

Комментарии:

1. Извините, я новичок в python, возможно, это не список. Я получаю следующую ошибку: new_histdata = list(map(lambda e: [contracts[i].localSymbol] e, histdata)) Ошибка типа: можно объединить только список (не «HistoricalTickLast») в список

2. Попробуйте заменить map(lambda e: [contracts[i].localSymbol] e, histdata) на map(lambda e: [contracts[i].localSymbol] [e], histdata), но, возможно, если вы прочитаете о функции map, вы могли бы использовать ее для достижения именно того, чего вы хотите

3. Я обещаю, что прочитаю больше о функции map. Тем временем, похоже, что символ контракта был исключен из класса HistoricalTickLast . Я получаю: ‘GLD 210305P00160000’, HistoricalTickLast(time = datetime, …. когда я думаю, что должен получать HistoricalTickLast(symbol =»GLD210305P00160000″, time = datetime…