0
0

More than 1 year has passed since last update.

MetaTrader5の最適化結果xmlファイルをDataFrameに変換する

Posted at

はじめに

PythonでMT5の最適化データを扱おうと思ったら最適化データがxmlファイルとして出てくる。しかもこのxmlファイル、構造が少々複雑で巷に出回っているxml→CSVなどの変換スクリプトがうまく動かない。じゃあこれに特化したPythonスクリプトを組んでやろうというのが本記事の目的。
Python3.7のGoogleColab環境で動かした。

全体の流れ(という名の目次)

  1. ソースコード全文
  2. xmlファイルの構造
  3. コード解説
  4. 注意

ソースコード全文

import xml.etree.ElementTree as ET
import pandas as pd

#ファイルの読み込み
f = open('2021.08.01.xml', encoding='utf-8')
xml_data = f.read()
f.close()

root = ET.fromstring(xml_data)

all = []
col = []
for i in range(len(root[2][0])):
  for n in range(len(root[2][0][0])):
    col.append(root[2][0][i][n][0].text)
  all.append(col)
  col = []

#データフレームの生成と整形
df = pd.DataFrame(all)
df = df.set_axis(df.iloc[0,:], axis=1)
df = df.drop(0, axis=0)

print(df) #完成

xmlファイルの構造

MT5から出力されるxmlは大体以下のような構造になってる。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook>
  <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
    最適化するときの通貨ペアやらEAに関する情報やら
  </DocumentProperties>
  <Styles>
    書式設定
  </Styles>
  <Worksheet ss:Name="Tester Optimizator Results">
    <Table>
      <Row>
        <Cell><Data ss:Type="String">列の名前</Data></Cell>
        ...
        <Cell><Data ss:Type="String">列の名前</Data></Cell>
      </Row>
      <Row>
        <Cell><Data ss:Type="Number">行の数値や情報</Data></Cell>
        ...
        <Cell><Data ss:Type="Number">行の数値や情報</Data></Cell>
      </Row>
      ...
      </Row>
    </Table>
  </Worksheet>
</Workbook>

コード解説

解説と言ってもやってることは構造解析したあとに添え字でアクセスしてるだけです。

import xml.etree.ElementTree as ET
import pandas as pd

インポートしてる。ElementTreeでxmlの文構造を解析してそこから、PandasでDataFrameに変換する。

#ファイルの読み込み
f = open('2021.08.01.xml', encoding='utf-8')
xml_data = f.read()
f.close()

xmlファイルの読み込み。open()で読み込み、xml_dataという名前の変数にstr型で格納、のちにCloseしてる。

root = ET.fromstring(xml_data)

xmlファイルの構造分析、fromstring()でstr型の文章を構造解析している。
これで全ての要素にアクセスできるようになった。後述の通りrootに添え字をつけるとアクセスできる。

【Python】XMLを解析・読み取りする(ElementTree)
https://pg-chain.com/python-xml-elementtree

all = []
col = []
for i in range(len(root[2][0])):
  for n in range(len(root[2][0][0])):
    col.append(root[2][0][i][n][0].text)
  all.append(col)
  col = []

DataFrameにする前にリスト配列にまとめる。for文で添え字の値を変更してそれぞれ取る。

root[0] → <DocumentProperties>
root[1] → <Styles>
root[2] → <Worksheet>

にアクセスできる。さらに深い場合でもどうように添え字を増やすことでアクセスできる。

注意

Office仕様のxmlファイルであれば同様このコードでアクセスできるとは思われるけども、よく見かけるシンプルなxmlだと逆にうまくDataFrameに変更できない。
xmlからDataFrameに変えたいだけであればもっと良いコードが公開されてると思うよ。
あと、自分はPython初心者だから多分もっとスマートに書くことができると思うよ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0