Из списка dict в фрейм данных pandas

#python-3.x #pandas #list #real-time

#python-3.x #pandas #Список #в режиме реального времени

Вопрос:

Я извлекаю финансовые данные в реальном времени. Каждые 1 секунду я извлекаю следующий список:

[{‘symbol’: ‘ETHBTC’, ‘price’: ‘0.03381600’}, {‘symbol’: ‘LTCBTC’, ‘price’: >’0.01848300′} …]

Цель состоит в том, чтобы поместить этот список в уже существующий фрейм данных pandas.

Что я сделал до сих пор, так это преобразование этого списка словаря в фрейм данных pandas. Моя проблема в том, что символы и цены находятся в двух столбцах. Я хотел бы иметь символы в качестве заголовка фрейма данных и добавлять новую строку каждые 1 секунду, содержащую значения price.

 marketInformation = [{'symbol': 'ETHBTC', 'price': '0.03381600'}, {'symbol': 'LTCBTC', 'price': >'0.01848300'}...]

data = pd.DataFrame(marketInformation)
header = data['symbol'].values

newData = pd.DataFrame(columns=header)

while True:
  realTimeData = ... // get a new marketInformation list of dict
  newData.append(pd.DataFrame(realTimeData)['price'])

print(newData)
  

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

 pd.DataFrame(realTimeData)['price']
  

и это дает мне pandas.core.series.Объект серии, длина которого равна количеству символов.

Что не так?

Ответ №1:

После создания newData просто выполните:

 newData.loc[len(newData), :] = [item['price'] for item in realTimeData]
  

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

1. Длина заголовка составляет около 500 символов. Я боюсь, что цикл каждую секунду будет очень медленным.

Ответ №2:

Вам просто нужно set_index() , а затем транспонировать df:

 newData = pd.DataFrame(marketInformation).set_index('symbol').T                                                           

#In [245]: newData                                                                                                                   
#Out[245]: 
#symbol      ETHBTC         LTC
#price   0.03381600  0.01848300

# then change the index to whatever makes sense to your data
newdata_time = pd.Timestamp.now()
newData.rename(index={'price':newdata_time})
#Out[246]: 
#symbol                          ETHBTC         LTC
#2019-04-03 17:08:51.389359  0.03381600  0.01848300