XBRLファイルには、企業の財務情報がXML形式で格納されています。特にXBRLでは名前空間(namespace)が頻繁に使われるため、名前空間を含めた要素名を整理することが重要です。今回は、XBRLファイルをPythonで解析し、タグに対応する属性や値を名前空間プレフィックスを含めた形式で辞書に格納する方法を解説します。
辞書形式にする理由
XBRLファイルのタグを辞書形式に変換するメリットは以下の通りです:
- データの可視化:名前空間を含めることで、同じ要素名でも異なる意味を持つタグを区別できる。
- 再利用性:辞書形式にすれば、JSON形式への変換や他のシステムとの連携がしやすくなる。
- 構造化データの整理:タグに関連する属性や値を一元管理することができる。
目標
- ZIP形式で保存されたXBRLファイルを解凍し、XBRLファイルを読み込む。
- 各タグに対応する値や属性を、名前空間プレフィックスを含めた形式で辞書に格納する。
XBRLファイルをZIPから抽出する方法
まず、XBRLファイルはZIP形式で配布されることが多いため、ZIPファイルを解凍して目的の.xbrl
ファイルを取り出します。
import zipfile
# XBRLファイルをZIPから抽出する関数
def extract_xbrl(zip_file_path):
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
# .xbrlファイルを取得
xbrl_files = [f for f in zip_ref.namelist() if f.endswith('.xbrl')]
if xbrl_files:
return zip_ref.read(xbrl_files[0]) # 最初のXBRLファイルを返す
return None
解説
zipfile.ZipFile
を使用してZIPファイルを開き、.xbrl
拡張子のファイルを検索します。- 複数のXBRLファイルが含まれる場合、
xbrl_files[0]
で最初に見つかったXBRLファイルの内容を取得します。 - 成功するとXBRLファイルの内容が返され、失敗すると
None
が返されます。
名前空間付きタグを辞書形式で取得する方法
次に、XBRLファイル内の各タグの名前空間プレフィックスと要素名を取得し、それらを組み合わせて辞書のキーにし、値と属性を保存します。
from lxml import etree
# XBRLファイル内のタグに対応する数値と属性を取得する関数
def get_values_and_attributes_from_xbrl(root):
tag_to_value_and_attrs = {}
for element in root.iter():
# 名前空間プレフィックスと要素名を取得
ns_prefix = element.prefix
ns_tag = etree.QName(element).localname
full_tag = f"{ns_prefix}:{ns_tag}" if ns_prefix else ns_tag
# 要素の値を取得(数値であることを確認)
value = element.text.strip() if element.text and element.text.strip().replace('.', '', 1).isdigit() else None
# 要素の属性を取得し、辞書に変換(複数の属性を含む)
attributes = {attr: val for attr, val in element.attrib.items()} if element.attrib else None
# 辞書に要素の数値と複数の属性を保存
tag_to_value_and_attrs[full_tag] = {
"value": value,
"attributes": attributes
}
return tag_to_value_and_attrs
解説
element.prefix
を使用して、名前空間プレフィックスを取得し、要素名と組み合わせてfull_tag
を作成します。例えば、jpdei:Revenue
のような形式です。- タグに含まれる値が数値かどうかを判定し、数値のみを辞書に格納します。
- タグに関連する属性も、キーとして辞書に保存します。例えば、
contextRef
などの属性情報が含まれます。
完成した辞書を表示する
コードが正しく動作しているか確認するため、取得したデータをPythonのpprint
を使って整形表示します。これにより、タグとその属性がきれいに出力されることが確認できます。
from pprint import pprint # 整形して表示するために使用
# ZIPファイルのパスを指定して実行
xbrl_content = extract_xbrl('edinet_data/S100TL6G.zip') # XBRLファイルのパス
# 文字列からXMLをパース
root = etree.fromstring(xbrl_content)
# XBRLファイル内のタグに対応する数値と属性を取得
tag_to_value_and_attrs = get_values_and_attributes_from_xbrl(root)
# Python辞書のまま出力
pprint(tag_to_value_and_attrs)
出力結果
実行結果として、以下のような名前空間プレフィックスを含むタグ名が辞書形式で表示されます。
{
'jpdei:Revenue': {'value': '5000000', 'attributes': {'contextRef': 'CurrentYearDuration'}},
'jpdei:NetIncome': {'value': '1000000', 'attributes': {'contextRef': 'CurrentYearDuration'}},
'jpdei:Assets': {'value': '20000000', 'attributes': {'contextRef': 'CurrentYearEnd'}}
}
解説
- 辞書のキーは、名前空間プレフィックス付きのタグ名(例:
jpdei:Revenue
)になっています。 - 各タグに対応する数値と属性(例:
contextRef
)が辞書の値として保存されています。
辞書をJSON形式に変換
辞書データを再利用するためには、JSON形式に変換して保存することが一般的です。Pythonでは、json
モジュールを使用して簡単に辞書をJSONに変換できます。
import json
# 辞書をJSON形式に変換して保存
with open('xbrl_data.json', 'w', encoding='utf-8') as json_file:
json.dump(tag_to_value_and_attrs, json_file, ensure_ascii=False, indent=4)
解説
json.dump()
を使用し、辞書をそのままJSON形式で保存します。ensure_ascii=False
を指定することで、日本語の文字も正しくエンコードされます。indent=4
で整形された見やすい形式にしています。
結論
今回の方法を使うことで、名前空間プレフィックス付きの要素名を含むXBRLデータを辞書形式に変換し、効率的にデータを管理することができます。この辞書データは、JSON形式に変換して後で利用することも可能です。名前空間の管理が必要な場面でも、今回のコードが役に立つでしょう。
次回の記事では、取得したデータを使って具体的な財務分析を行う方法を紹介しますので、どうぞお楽しみに!