前回の記事では、Pythonコードを使ってXBRLデータを辞書化し、その結果をJSONファイルに保存する方法を解説しました。その際、XBRLデータ内の数値データのみを辞書に含めました。しかし、今回のコードでは文字列の値も辞書に含めるように改良しました。
この方法により、XBRLデータ全体を辞書に変換できますが、すべての要素を含めると辞書が不必要に大きくなってしまいます。たとえば、利用しない情報や重要度の低いデータまで辞書に含まれてしまうと、処理速度やメモリの使用効率が悪くなる可能性があります。
そこで、必要なデータだけを辞書に含めるために、データをフィルタリングする仕組みが重要になります。フィルタリングを行うことで、必要なタグ(項目)だけを抽出し、それらの値と属性を辞書に保存することができます。
フィルタリングコードの紹介
import zipfile
from lxml import etree
from pprint import pprint
# 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])
return None
# 必要なデータのみを選んで辞書を作成する関数
def get_selected_values_and_attributes_from_xbrl(root, desired_tags):
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
# 必要なタグかどうかをチェック
if full_tag in desired_tags:
value = element.text.strip() if element.text 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
# ZIPファイルのパスと必要なタグのリストを指定して実行
xbrl_content = extract_xbrl('edinet_data/S100TL6G.zip')
desired_tags = ['jpcrp_cor:RevenueIFRSSummaryOfBusinessResults', 'jpcrp_cor:TotalAssetsIFRSSummaryOfBusinessResults']
if xbrl_content:
root = etree.fromstring(xbrl_content)
tag_to_value_and_attrs = get_selected_values_and_attributes_from_xbrl(root, desired_tags)
pprint(tag_to_value_and_attrs)
else:
print("XBRLファイルが見つかりませんでした。")
出力例
{'jpcrp_cor:RevenueIFRSSummaryOfBusinessResults': {'attributes': {'contextRef': 'CurrentYearDuration',
'decimals': '-6',
'unitRef': 'JPY'},
'value': '19567601000000'},
'jpcrp_cor:TotalAssetsIFRSSummaryOfBusinessResults': {'attributes': {'contextRef': 'CurrentYearInstant',
'decimals': '-6',
'unitRef': 'JPY'},
'value': '23459572000000'}}
このコードでは、指定したタグ(例: 売上収益、総資産額)に対応するデータだけを抽出し、それを辞書に格納しています。必要なデータだけを取り出すことで、効率的なデータ管理が可能となります。
このように、フィルタリングによって不要なデータを省くことで、より使いやすい辞書データを作成できるようになります。