Bagaimana cara mengubah array data bernama OHLCV menjadi kerangka data numpy?

Dec 09 2020

Data saya terdiri dari objek OHLCV tertentu yang agak aneh karena hanya dapat diakses dengan namanya, seperti ini:

# 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

dengan beberapa pemformatan tambahan yang saya miliki:

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

Saya telah mencoba hal-hal seperti ini:

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

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

Bagaimana saya bisa mengonversi benda ini menjadi Panda DataFrame, sehingga saya bisa memplot ini menggunakan nama aslinya?


Membuat plot menggunakan matplotlib seharusnya dapat dilakukan dengan sesuatu seperti ini:


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

Pertanyaan yang mungkin terkait (tapi tidak membantu saya):

  • Numpy / Matplotlib - Mengubah data tick menjadi OHLCV
  • Agregator OHLC tidak berfungsi dengan kerangka data pada panda?
  • Cara mengonversi bingkai data panda menjadi larik numpy dengan nama kolom
  • Mengonversi Larik Terstruktur Numpy ke Bingkai Data Pandas
  • Agregasi panda OHLC pada data OHLC
  • Buka, Tinggi, Rendah, Tutup selama 5 menit data stok python
  • Mengonversi data stok OHLC ke dalam kerangka waktu yang berbeda dengan python dan panda

Jawaban

1 jezrael Dec 09 2020 at 16:02

Salah satu idenya adalah menggunakan pemahaman daftar untuk mengekstrak nilai ke daftar tupel:

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

Atau jika memungkinkan:

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