PythonでXBRLデータをフィルタリングして辞書化する方法

「PythonでXBRLデータをフィルタリングして辞書化する方法」のタイトル画像 投資

前回の記事では、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'}}

このコードでは、指定したタグ(例: 売上収益、総資産額)に対応するデータだけを抽出し、それを辞書に格納しています。必要なデータだけを取り出すことで、効率的なデータ管理が可能となります。


このように、フィルタリングによって不要なデータを省くことで、より使いやすい辞書データを作成できるようになります。

タイトルとURLをコピーしました