#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
является alist
HistoricalTickLast
, который имеет такие атрибуты, какtime
, и т.д.tickAttribLast
2. Спасибо, назовите правильное имя каждой отдельной строки в списке (вся информация разделяется запятыми)… У меня возникла проблема с переключением с кода типа строк / столбцов VBA на python
Ответ №1:
- Используйте type(), чтобы убедиться, что ваша переменная является списком (обозначается символом [])
- Каждая запись представляет собой экземпляры 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…