Comment convertir un tableau de données nommé OHLCV en une trame de données numpy?

Dec 09 2020

Mes données sont constituées d'un objet OHLCV particulier qui est un peu étrange en ce qu'il n'est accessible que par son nom, comme ceci:

# 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

avec un formatage supplémentaire que j'ai:

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

J'ai essayé des choses comme celle-ci:

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

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

Comment puis-je convertir cette chose en un Panda DataFrame, afin que je puisse tracer cela en utilisant les noms d'origine?


Le traçage à l'aide de matplotlib devrait alors être possible avec quelque chose comme ceci:


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

Questions éventuellement liées (mais ne m'ont pas été utiles):

  • Numpy / Matplotlib - Transformez les données de graduation en OHLCV
  • L'agrégateur OHLC ne fonctionne pas avec dataframe sur les pandas?
  • Comment convertir un dataframe pandas en un tableau numpy avec les noms de colonne
  • Conversion d'un tableau structuré Numpy en trames de données Pandas
  • Agrégation Pandas OHLC sur les données OHLC
  • Ouvrir, Haut, Bas, Fermer pendant 5 min de données boursières Python
  • Conversion des données boursières OHLC en une période différente avec python et pandas

Réponses

1 jezrael Dec 09 2020 at 16:02

Une idée est d'utiliser la compréhension de liste pour extraire des valeurs vers une liste de tuples:

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

Ou si possible:

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