Как преобразовать именованный массив данных OHLCV в numpy dataframe?

Dec 09 2020

Мои данные состоят из определенного объекта OHLCV, который немного странный, поскольку к нему можно получить доступ только по имени, например:

# rA = [<MtApi.MqlRates object at 0x000000A37A32B308>,...]
type(rA)
# <class 'list'>

ccnt = len(rA)              # 100
for i in range(ccnt):
    print('{} {} {} {} {} {} {}'.format(i, rA[i].MtTime, rA[i].Open, rA[i].High, rA[i].Low, rA[i].Close, rA[i].TickVolume))

#0 1607507400 0.90654 0.90656 0.90654 0.90656 7
#1 1607507340 0.90654 0.9066  0.90653 0.90653 20
#2 1607507280 0.90665 0.90665 0.90643 0.90653 37
#3 1607507220 0.90679 0.90679 0.90666 0.90666 22
#4 1607507160 0.90699 0.90699 0.90678 0.90678 29

с некоторым дополнительным форматированием у меня есть:

Time         Open     High     Low      Close     Volume
-----------------------------------------------------------------
1607507400   0.90654  0.90656  0.90654  0.90656   7
1607507340   0.90654  0.90660  0.90653  0.90653   20
1607507280   0.90665  0.90665  0.90643  0.90653   37
1607507220   0.90679  0.90679  0.90666  0.90666   22

Я пробовал такие вещи:

df = pd.DataFrame(data = rA, index = range(100), columns = ['MtTime', 'Open', 'High','Low', 'Close', 'TickVolume'])

# Resulting in:
# TypeError: iteration over non-sequence

Как я могу преобразовать эту вещь в Panda DataFrame, чтобы я мог построить это, используя исходные имена?


Построение графика с использованием matplotlib должно быть возможно примерно так:


import matplotlib.pyplot as plt
import pandas as pd
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
...

df = pd.DataFrame(rA)   # not working

df['time'] = pd.to_datetime(df['MtTime'], unit='s')
plt.plot(df['MtTime'], df['Open'], 'r-', label='Open')
plt.plot(df['MtTime'], df['Close'], 'b-', label='Close')
plt.legend(loc='upper left')
plt.title('EURAUD candles')
plt.show()

Возможно, связанные вопросы (но мне не помогли):

  • Numpy / Matplotlib - Преобразование тиковых данных в OHLCV
  • Агрегатор OHLC не работает с фреймом данных на пандах?
  • Как преобразовать фреймворк pandas в массив numpy с именами столбцов
  • Преобразование структурированного массива Numpy в фреймы данных Pandas
  • Агрегация Pandas OHLC по данным OHLC
  • Получение открытия, максимума, минимума, закрытия в течение 5 минут с биржевыми данными python
  • Преобразование данных акций OHLC в другой таймфрейм с помощью python и pandas

Ответы

1 jezrael Dec 09 2020 at 16:02

Одна из идей - использовать понимание списка для извлечения значений в список кортежей:

L = [(rA[i].MtTime, rA[i].Open, rA[i].High, rA[i].Low, rA[i].Close, rA[i].TickVolume) 
      for i in range(len(rA))]

df = pd.DataFrame(L, columns = ['MtTime', 'Open', 'High','Low', 'Close', 'TickVolume']))

Или, если возможно:

df = pd.DataFrame({'MtTime':list(rA.MtTime), 'Open':list(rA.Open), 
                   'High':list(rA.High),'Low':list(rA.Low), 
                   'Close':list(rA.Close), 'TickVolume':list(rA.TickVolume)})