Come convertire un array di dati denominato OHLCV in un dataframe numpy?

Dec 09 2020

I miei dati sono costituiti da un particolare oggetto OHLCV che è un po 'strano in quanto è possibile accedervi solo con il nome, in questo modo:

# 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

con alcune formattazioni aggiuntive ho:

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

Ho provato cose come questa:

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

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

Come posso convertire questo oggetto in un Panda DataFrame, in modo da poterlo tracciare utilizzando i nomi originali?


La stampa utilizzando matplotlib dovrebbe quindi essere possibile con qualcosa del genere:


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()

Eventuali domande correlate (ma non mi sono state utili):

  • Numpy / Matplotlib: trasforma i dati del tick in OHLCV
  • L'aggregatore OHLC non funziona con dataframe sui panda?
  • Come convertire un dataframe panda in un array numpy con i nomi delle colonne
  • Conversione di Numpy Structured Array in Dataframe Pandas
  • Pandas OHLC aggregation on OHLC data
  • Ottenere Open, High, Low, Close per 5 min di dati stock python
  • Conversione dei dati azionari OHLC in un intervallo di tempo diverso con python e panda

Risposte

1 jezrael Dec 09 2020 at 16:02

Un'idea è usare la comprensione dell'elenco per estrarre i valori in un elenco di tuple:

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']))

O se possibile:

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)})