【Python】EDINETのXBRLファイルから、うまく情報を抽出できた(多分)

Arelleというライブラリを使ってxbrlファイルから決算情報の欲しいところだけ抽出することに成功したので、この記事では、その記録を残そうと思います。(Arelleはダウンロードして使用、pythonは3.7.5)

目次
1. コードを動かすために必要な条件
2. コードの説明

説明する前に、今回書いたコードを全部のっけときます。

import re

from Arelle.arelle import Cntlr


xbrl_file = '/Users/m_ishikawa/Desktop/edinet_venv/data/S100FSL4/XBRL/PublicDoc/jpcrp030000-asr-001_E03219-000_2019-02-20_01_2019-05-15.xbrl'
ctrl = Cntlr.Cntlr(logFileName='logToPrint')
model_xbrl = ctrl.modelManager.load(xbrl_file)
print(model_xbrl)

for fact in model_xbrl.facts:
 # 必要情報の取得
 label_ja = fact.concept.label(preferredLabel=None, lang='ja', linkroleHint=None)
 label_en = fact.concept.label(preferredLabel=None, lang='en', linkroleHint=None)
 id = fact.contextID
 qname = fact.qname
 try:
   # 数値
   value = fact.vEqValue
 except ValueError as e:
   pass

 print('日本語ラベル:', label_ja)
 print('英語ラベル:', label_en)
 print('ID:', id)
 print('qname: ', qname)

 if type(value) == int or type(value) == float:
   print('float_value:', value)
 else:
   # 日本語の抽出
   japanese = re.findall("[ぁ-んァ-ン一-龥]", value)
   japanese = (''.join(japanese))
   japanese = japanese[:20]
   print('str_value:', japanese)

こんな感じです。


1. コードを動かすために必要な条件

・Arelleのzipファイルをダウンロードしてきて(URLはこちら)、解凍したものを適切な位置におきます。自分の場合は、コードを書いたファイルと同じフォルダに保存しました。

・Arelleを動かすのに必要なライブラリのインストール。上のコードを動かそうとすると、importの時点でエラーが出るのでそれに従ってライブラリを2つインストールしました。(lxmlとisodate)

下のコードをターミナルで実行すればおけいです。

pip install isodate
pip install lxml

・xbrlファイルをダウンロード済みであること。
edinetからzipファイルをダウンロードして解凍すると、XBRL > PublicDocとうフォルダがあります。このフォルダの中にxbrlという拡張子のファイルがあるのでこのファイルを持っている必要があります。(これから情報を得る)

以上で必要な条件は満たされているはずです。

2. コードの説明

最初に載せたコードを上から順番に、説明していきます。

(インポート)
import re

from Arelle.arelle import Cntlr

reというライブラリは、xbrlファイルの情報から、htmlのようなタグを除いて、日本語の情報だけを取得するのに使います。

Arelleについて、
僕はArelleをこのpythonファイルと同じフォルダーに入れているので、from Arelleとしています。Arelleを置いている位置に合わせて、書き換えてください。

Arelleコントローラの取得

xbrl_file = '...xbrlファイルのパス...xbrl'
ctrl = Cntlr.Cntlr(logFileName='logToPrint')
model_xbrl = ctrl.modelManager.load(xbrl_file)
print(model_xbrl)

出力は、(print(model_xbrl)のところの)

<arelle.ModelXbrl.ModelXbrl object at 0x10944c090>

必要な情報だけ抽出

for fact in model_xbrl.facts:
 # 必要情報の取得
 label_ja = fact.concept.label(preferredLabel=None, lang='ja', linkroleHint=None)
 label_en = fact.concept.label(preferredLabel=None, lang='en', linkroleHint=None)
 id = fact.contextID
 qname = fact.qname
 try:
   # 数値
   value = fact.vEqValue
 except ValueError as e:
   pass

 print('日本語ラベル:', label_ja)
 print('英語ラベル:', label_en)
 print('ID:', id)
 print('qname: ', qname)

 if type(value) == int or type(value) == float:
   print('float_value:', value)
 else:
   # 日本語の抽出
   japanese = re.findall("[ぁ-んァ-ン一-龥]", value)
   japanese = (''.join(japanese))
   japanese = japanese[:20]
   print('str_value:', japanese)

このコードは、arelleのドキュメントを見ながら必要なものを選びながら書くのが良いと思います。

alleleドキュメント(https://arelle.org/arelle/documentation/architecture/)

ちなみに、僕のコードでは、
・label_ja: 日本語の項目名(例:当期純利益又は当期純損失(△))
・label_en: 英語の項目名(例:Profit (loss))
・ID: 四半期なのか通期なのかなどの、判別ができるもの
・qname: xbrl独自の項目名のようなもの?
・value: 数値 or 日本語(これが欲しい情報)
が得られるようにしました。


以上で終わりです。
今回参考にした記事: シラベルノート(https://srbrnote.work/archives/5600)


次は、csvファイルかsqlに得られた情報を保存していく作業をしていこうと思う。

いいなと思ったら応援しよう!