#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