前回はxbrl ファイルの構造について解説しました。今回はその xbrl ファイルをどのように解析すれば良いか紹介したいと思います。特に Python を使った解析方法について紹介します。
xbrl ファイルのPython での解析方法
Python で XBRL ファイルを解析するには大きく二つのアプローチがあります。
1. BeautifulSoupなどのXML解析ライブラリを使って解析する
2. Arelleのような xbrl 解析専用のライブラリを使う
BeautifulSoupなどを使う場合は比較的情報が多いため、特定のqnameに対応する要素を取り出すといったようなことを行う場合だけであれば、1つ目の方法で十分です。
しかし、前回の xbrl ファイルの構造で紹介した親子関係や計算関係などまで含めて解析を行いたい場合には、Arelleなどの専用ライブラリを使った方が圧倒的に簡単に分析できます。
そこで今回は、Arelleを使った解析について見ていきます。
Arelleの基本的な使い方
インストール
! pip install arelle-release
今回はGoogleColabでEDINETからダウンロードしたzipを使うことを考えます。
zipをアップロードし、解凍します。
from arelle import Cntlr,XbrlConst
import glob
import os
import zipfile
#zipの解凍
filename = f"{doc_id}.zip"
# 解凍先のディレクトリのパス
extract_dir = filename.replace('.zip','')
zip_obj = zipfile.ZipFile(filename, 'r')
if not os.path.exists(extract_dir):
os.makedirs(extract_dir)
# 全てのファイルを解凍
zip_obj.extractall(extract_dir)
# ZipFileオブジェクトをクローズ
zip_obj.close()
まずは 対象となる xbrl ファイルのパスを指定して、以下のようにして全体を読み込みます。
xbrl_file = glob.glob(f'{doc_id}/XBRL/PublicDoc/*.xbrl')[0]
# XBRLファイルを読み込み
ctrl = Cntlr.Cntlr(logFileName='logToPrint')
modelXbrl = ctrl.modelManager.load(xbrl_file)
少し時間がかかりますが、たったこれだけで関連するファイルを全て読み込み、各要素の対応付けが完了します。
このようにすると全ての要素にアクセスできます。
#すべての要素
len(modelXbrl.facts)
1つ1つは次のようになっています。
#3つ目の要素のqnameとラベルと値とcontext情報
fact = modelXbrl.facts[3]
print(fact.qname)
print(fact.concept.label())
print(fact.value)
print(fact.context)
ArelleのmodelXbrlの整理
ここで少し全体の構成について整理しておきます。
インスタンス内部の文章は、大きくconcept, fact, context, relationshipで構成されます。
conceptはタクソノミに記載されているラベル情報になります。
factは各項目の具体的な要素になります。例えば、2024年の売上高が、10億などです。
contextはfactに対応する期間などの属性情報を持ちます。
最後にrelationshipは要素間の関係を表します。
これらを図に整理すると以下のようになります。
要素の取得
最後に、各要素の詳細を見ておきます。
関係性の取得
relationshipSet = modelXbrl.relationshipSet(XbrlConst.parentChild)
relationshipSet.toModelObject(fact.concept)
関係性の取得はconcept単位で行えます。
ドキュメントの取得
#インスタンスが参照するドキュメント一覧
modelXbrl.urlDocs
factの要素
def print_properties(obj):
for attr, value in vars(obj).items():
print(f"{attr}:{value}")
print_properties(fact)
ラベル情報のあるconceptや日付情報のあるcontextにアクセスできます。
conceptの情報
print_properties(fact.concept)
contextの情報
print_properties(fact.context)
今回使用したコードはこちらで確認できます。