Wie konvertiere ich ein OHLCV-benanntes Datenarray in einen numpy-Datenrahmen?

Dec 09 2020

Meine Daten bestehen aus einem bestimmten OHLCV-Objekt, das insofern etwas seltsam ist, als nur über den Namen darauf zugegriffen werden kann:

# 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

mit einigen zusätzlichen Formatierungen habe ich:

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

Ich habe solche Dinge ausprobiert:

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

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

Wie kann ich dieses Ding in einen Panda DataFrame konvertieren, damit ich dies unter Verwendung der ursprünglichen Namen zeichnen kann?


Das Plotten mit matplotlib sollte dann mit so etwas möglich sein:


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

Möglicherweise verwandte Fragen (waren mir aber nicht hilfreich):

  • Numpy / Matplotlib - Zeckendaten in OHLCV umwandeln
  • OHLC-Aggregator funktioniert nicht mit Datenrahmen auf Pandas?
  • So konvertieren Sie einen Pandas-Datenrahmen in ein Numpy-Array mit den Spaltennamen
  • Konvertieren von Numpy Structured Array in Pandas Dataframes
  • Pandas OHLC-Aggregation auf OHLC-Daten
  • Öffnen, Hoch, Niedrig, Schließen für 5 Minuten Bestandsdaten Python
  • Konvertieren von OHLC-Bestandsdaten in einen anderen Zeitrahmen mit Python und Pandas

Antworten

1 jezrael Dec 09 2020 at 16:02

Eine Idee ist das Listenverständnis zum Extrahieren von Werten in die Liste von Tupeln:

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

Oder wenn möglich:

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