Jak przekonwertować nazwaną tablicę danych OHLCV na numpy dataframe?

Dec 09 2020

Moje dane składają się z konkretnego obiektu OHLCV, który jest nieco dziwny, ponieważ można uzyskać do niego dostęp tylko za pomocą nazwy, na przykład:

# 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

z dodatkowym formatowaniem, które mam:

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

Próbowałem takich rzeczy:

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

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

W jaki sposób można przekonwertować ten rzeczą w Panda DataFrame, tak że mogę wykreślić to przy użyciu oryginalnych nazw?


Drukowanie przy użyciu matplotlib powinno być wtedy możliwe przy użyciu czegoś takiego:


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

Prawdopodobnie powiązane pytania (ale nie były dla mnie pomocne):

  • Numpy / Matplotlib - Przekształć dane tickowe w OHLCV
  • Agregator OHLC nie działa z ramką danych na pandach?
  • Jak przekonwertować ramkę danych pandy na tablicę numpy z nazwami kolumn
  • Konwersja Numpy Structured Array do Pandas Dataframes
  • Agregacja Pandas OHLC na danych OHLC
  • Otwieranie, wysokie, niskie, zamykanie przez 5 min. Python danych giełdowych
  • Konwersja danych giełdowych OHLC na inne ramy czasowe za pomocą Pythona i pand

Odpowiedzi

1 jezrael Dec 09 2020 at 16:02

Jednym z pomysłów jest użycie funkcji list składanych w celu wyodrębnienia wartości do listy krotek:

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

Lub jeśli to możliwe:

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