【Python】Arelle のインストール方法【XBRL 読み込みライブラリ】

XBRL からデータを取得して決算分析をするときは、Arelleアレル という Python モジュールが便利でした。

公式サイト (Arelle) の説明を読んだところ、Arelle とは、『XBRL ファイルの正しさをチェックするためのソフト(検証ツール)』のようでした。

ですが、XBRL ファイルから『データを取得するためのツール』としても、使うことができました。

Arelle の開発に関わっているすべての方々に感謝申し上げます。

ありがとうございます。

自分が Arelle を使った時の『インストール方法』を紹介します。

『アンインストール方法』と、XBRL ファイルを読み込む『簡単なコード例』も書きました。

Python のバージョン

自分は、Python 3.8.6 の 64 bit 版を使いました。

OS は Windows 10 の 64 bit 版です。

Arelle のインストール方法

Arelle の本体は、GitHub からダウンロードして使いました。

公式サイトにはインストーラー版もありましたが、Python ライブラリとして使う場合には不向きでした。

Arelle の Python コードがコンパイル済みの .pyc になっていたので、中身を見るときに不便でした。

なので、Python ライブラリとして使うときは、GitHub から zip で取得したものが便利でした。

Python ファイルが普通の .py でしたので、簡単に読むことができました。

Arelle の GUI 版 (arelle.pyw) についても、起動して使うことができました。

Arelle のインストールの手順です。

GitHub から Arelle の zip を取得します

2020年10月の時点で、Python の pip からインストールできる『公式』の Arelle ライブラリは無いようでした。

ですが、大丈夫でした。

GitHub から取得できる zip ファイルが、そのまま Python ライブラリとして使用できました。

ファイル名は、『Arelle-master.zip』でした。

Arelle の公式サイトに、GitHub へのリンクがありました。

arelle®DownloadGitHub – Arelle/Arelle: Arelle open source XBRL platform

GitHub のページあった緑色のボタン『↓Code▽』を押して、『Download ZIP』を押しました。

すると、『Arelle-master.zip』の保存場所を聞かれたので、自分の好き場所に保存しました。

(保存した場所の例)F:\project\kabu\download\Arelle-master.zip

自分がダウンロードしたときは、2020年10月26日にリリースされた Arelle でした。

これで、『Arelle-master.zip』のダウンロードができました。

Arelle の zip を解凍します

まず、開発用のフォルダを、どこか好き場所に用意します。

(自分が用意した場所の例)F:\project\kabu

その場所に、『Arelle-master.zip』を解凍しました。

(解凍後の例)F:\project\kabu\Arelle-master

ところで、kabu は『かぶ』の意味です。

『株式銘柄の分析用フォルダ』ということで名付けました。

フォルダ名を変更します

さて、フォルダ名に『ハイフン -』が付いたままだと、Python から import したときに SyntaxError: invalid syntax が出ました。

なので、自分はフォルダ名を変更して、『ハイフン無しの名前』にしました。

具体的には、『Arelle-master ⇒ Arelle』に変更しました。

(変更したあとのフォルダ名)F:\project\kabu\Arelle

もう『Arelle-master.zip』は使わないので、削除して OK でした。

インストールした『Arelle フォルダ』のスクリーンショットです。

Arelle に必要なライブラリをインストールします

Arelle には、追加で外部ライブラリが必要でした。

Arelle のモジュールを import したら、途中で ModuleNotFoundError: No module named 'lxml' などのエラーが出ました。

そういったエラーが出なくなるまで、pip でモジュールをインストールしていきました。

テストに使ったコードを紹介します。

最初は『lxml が見つからない』と表示されました。

"""
F:\\project\\kabu\\main_import_test.py
(Arelle インポートテスト)
"""

import sys
sys.path.append(r'F:\project\kabu\Arelle')

from Arelle.arelle import Cntlr
ModuleNotFoundError: No module named 'lxml'

pip で lxml をインストールしました。

pip install lxml

Successfully installed lxml-4.6.1

次は『isodate が見つからない』と表示されました。

ModuleNotFoundError: No module named 'isodate'

pip で isodate をインストールしました。

pip install isodate

Successfully installed isodate-0.6.0

これで、自分は Arelle を import して使える状態になりました。

Arelle の GUI 版 (arelle.pyw) についても、使える状態になっていました。

インストール完了です。

Arelle の削除方法(アンインストール方法)

GitHub の zip からインストールした場合の Arelle の削除方法です。

自分は、『zip を解凍してできたファイル群』を、フォルダごと削除しました。

インストールといっても、zip を解凍しただけなので、フォルダごと削除で問題ないと思います。

次に、Arelle が XBRL を読み込んだ時の 『webCache』 が残っていましたので、それも削除しました。

デフォルトでは、以下のフォルダにありました。

(キャッシュフォルダ)C:\Users\%USERNAME%\AppData\Local\Arelle

自分は、キャッシュについても、Arelle のフォルダごと削除しました。

あとは、もし手作業で『XDG_CONFIG_HOME』という名前の環境変数を追加した場合は、それも削除します。

自分は、Windows の環境変数は使わなかったので、何もしませんでした。

これで、Arelle のアンインストールが完了しました。

Arelle のキャッシュフォルダの場所

Arelle は、XBRL を読み込む時に、自動でタクソノミを取得してくれました。

取得したタクソノミのファイルは、デフォルトだと、以下のフォルダに保存されました。

(キャッシュフォルダ)C:\Users\%USERNAME%\AppData\Local\Arelle

このキャッシュフォルダの場所は、変更することもできました。

『XDG_CONFIG_HOME ファイル』を設置して変更する方法や、『Windows の環境変数』を使用して変更する方法などがありました。

具体的な処理は『arelle\Cntlr.py』に書かれていました。

ところで、Arelle の動作がおかしくなったことがあって、キャッシュフォルダの内容を全部消したら、直ったことがありました。

ある時、いままで読めていた XBRL が、なぜか読み込みに失敗するようになったのですが、試しに Arelle のキャッシュフォルダを削除してみたら直りました。

想像ですが、もしかしたら、途中でダウンロードに失敗したファイルがあって、壊れたファイルが出来ていたのかもしれません。

EDINET のシステムメンテナンスと Arelle の直し方

EDIENT がシステムメンテナンスのときに Arelle を使用したら、それ以降、Arelle が XBRL の読み込みに失敗するようになりました。

問題が起きたときの Arelle のエラーログの出力例です。

2021-08-18 00:00:00,305 [xmlSchema:syntax] Space required after the Public Identifier, jpcrp_cor_2013-08-31.xsd, line 1, column 63 – ../../jpcrp_cor_2013-08-31.xsd , jpcrp020400-srs-001_E00000-000_2015-02-28_03_2016-04-07.xsd 4

(中略)

2021-08-18 00:00:00,531 [xmlSchema:elementUnexpected] xbrli:xbrl complexType(sequence(link:schemaRef{1:unbounded}, link:linkbaseRef{0:unbounded}, link:roleRef{0:unbounded}, link:arcroleRef{0:unbounded}, choice(xbrli:item, xbrli:tuple, xbrli:context, xbrli:unit, link:footnoteLink){0:unbounded})) jpcrp_cor:NetSalesSummaryOfBusinessResults unexpected, within xbrli:xbrl – jpcrp020400-srs-001_E00000-000_2015-02-28_03_2016-04-07.xbrl 626

2021-08-18 00:00:00,627 [xbrl:schemaImportMissing] Instance facts missing schema concept definition: jpcrp_cor:AcquisitionsByResolutionOfBoardOfDirectorsMeetingNATextBlock, …

(中略)

Traceback (most recent call last):

(中略)

File “***\app_jisaku_main.py”, line 355, in add_child_object
if obj.type.qname in qnDomainItemTypes:
AttributeError: ‘NoneType’ object has no attribute ‘type’

原因は、EDINET が配信した sorry ページの HTML を、Arelle がタクソノミのファイル (xsd, xml) としてキャッシュしてしまったためでした。

たとえば、以下のような sorry ページの文章が、Arelle のキャッシュフォルダに保存されていました。

お知らせ

システムメンテナンスに伴うサービスの一時停止のお知らせ

システムメンテナンスに伴い、現在サービスを一時停止しております。

御利用の方には、大変御迷惑をおかけいたしますが、何とぞ御理解くださいますよう、よろしくお願い申し上げます。

直し方ですが、Arelle のキャッシュフォルダを削除するとかして、そういった問題のあるファイルを消したら、直りました。

Arelle で XBRL を読み込む

試しに、EDINETエディネット から取得した XBRL を、Arelle で読み込んでみました。

使用した XBRL データは、令和 2 年の 2020 年 8 月 28 日に開示された、『カネコ種苗しゅびょう株式会社』の有報ゆうほうです。

開示日:2020/8/28 12:55

会社名:カネコ種苗株式会社

証券コード:1376

EDINET コード:E00004

表題:有価証券報告書-第73期(令和1年6月1日-令和2年5月31日)

書類管理番号:S100JKNH

コード例

Arelle で XBRL を読み込む Python コード例です。

XBRL を読み込むだけの簡単なコードです。

"""F:\\project\\kabu\\main_sample.py"""

import sys
sys.path.append(r'F:\project\kabu\Arelle')
from Arelle.arelle import Cntlr

def main():
    # (1/4) XBRL の zip ファイルを決めます。
    xbrl_zip = r'F:\project\kabu\download\S100JKNH.zip'

    # (2/4) zip の中にある『報告書インスタンス』のパスをくっつけます。
    xbrl_file = xbrl_zip + r'\S100JKNH\XBRL\PublicDoc\jpcrp030000-asr-001_E00004-000_2020-05-31_01_2020-08-28.xbrl'
    print('(デバッグ 1) Arelle に渡したファイルパスを表示')
    print(f'xbrl_file\n"{xbrl_file}"\n')

    # (3/4) Arelle のコントローラーを作ります。
    # 'logToPrint' とは、Arelle のログを標準出力(stdout)に出す、という意味でした。
    # (出典) Cntlr.py にある class LogToPrintHandler(logging.Handler) の docstring。
    ctrl = Cntlr.Cntlr(logFileName='logToPrint')
    try:
        print('(デバッグ 2) webCache フォルダの場所を表示')
        print(f'ctrl.webCache.cacheDir\n"{ctrl.webCache.cacheDir}"\n')

        # (4/4) XBRL を読み込みます。
        model_xbrl = ctrl.modelManager.load(xbrl_file)
        try:

            print('(デバッグ 3) 戻り値の型を表示')
            print(f'model_xbrl\n{type(model_xbrl)}\n')

            print('(デバッグ 4) fact の数を表示 (勘定科目の金額や文章の数)')
            print(f'len(model_xbrl.facts)\n{len(model_xbrl.facts)} 個\n')

            # model_xbrl.facts からの
            # データ取得処理なども
            # ここに書きます。

        finally:
            # modelXbrl を閉じます。
            # (出典) ModelManager.py
            ctrl.modelManager.close()
    finally:
        # Arelle のコントローラーを閉じます。
        # (出典) Cntlr.py
        ctrl.close()

    # 以上です。
    return

if __name__ == '__main__':
    main()

zip の中の .xbrl のパスを取得する方法

zip ファイルの中にある『.xbrl のファイルパス』を取得する方法です。

Python の zipfile モジュールで、簡単に取得することができました。

Python コード例は、以下の記事に書きました。

Arelle で XBRL ファイルを読み込む手順(zipを展開せずに直接読み込む方法)

zip から .xbrl のファイルパスを取得して、それを Arelle に渡すコード例は、以下の記事にあります。app_xbrl.py の xbrl_proc 関数のところです。

Arelle をマルチプロセスで実行するコード例【XBRL】

modelXbrl を閉じるタイミング

自分の場合ですが、ctrl.modelManager.close() は、1 つの .xbrl からデータの抽出が完了するたびに、呼び出しています。

そうしないと、Arelle が .xbrl の解析結果を次々に保持していって、メモリが足りなくなりました。

公式サイトの説明を見たところ、Arelle には、複数の XBRL を開いて、それらの構造を比較する機能があるようでした。

なので、複数の .xbrl が開けるようになっているのだと思います。

決算データを取得していくだけなら、複数開いておく必要はなかったです。

自分は、1 つの .xbrl からデータを取得するたびに、modelXbrl を閉じていきました。

これで、たくさんの XBRL ファイルを、問題なく処理することができました。

Arelle のコントローラーを閉じるタイミング

自分の場合ですが、ctrl.close() は、全部の XBRL からデータを取得し終わったときに呼び出しています。

具体的には、データ取得用のメイン関数の最後とかに、1 回だけ呼び出しています。

実行結果

実行結果です。

(デバッグ 1) Arelle に渡したファイルパスを表示
xbrl_file
"F:\project\kabu\download\S100JKNH.zip\S100JKNH\XBRL\PublicDoc\jpcrp030000-asr-001_E00004-000_2020-05-31_01_2020-08-28.xbrl"

(デバッグ 2) webCache フォルダの場所を表示
ctrl.webCache.cacheDir
"C:\Users\*****\AppData\local\Arelle\cache"

(デバッグ 3) 戻り値の型を表示
model_xbrl
<class 'arelle.ModelXbrl.ModelXbrl'>

(デバッグ 4) fact の数を表示 (勘定科目の金額や文章の数)
len(model_xbrl.facts)
1567 個

スクリーンショット

Arelle のもど (model_xbrl) を、VisualStudioCode のウォッチ式で見た時のスクリーンショットです(全体の中の一部です)。

実際に決算分析をするときは、この戻り値の内容を駆使して、自身のほしいと思う形式に整える必要がありました。

以上です。

実際に XBRL からデータを取得するコード例も書きました。

XBRL から『勘定科目の金額や文章』を取得するコード例【Arelle】

XBRL から『勘定科目』と『リンクベース』の内容を取得するコード例【Arelle】

Arelle をマルチプロセスで実行するコード例【XBRL】

⇒ 【EDINET XBRL】『連結経営指標等』の Fact だけを取得する方法【Arelle】

『数値データ』や『テキストデータ』を保存するときは、SQLite が便利でした。

Python で SQLite を読み書きする方法を書きました。

【Python】SQLite の使い方【sqlite3】

開示情報の『テキスト分析』も面白かったです。

増収増益』を含んだ開示情報を列挙れっきょしたい。

その一心で、日本語の全文検索を『高速』に実行するコード例を書きました。

【Python】SQLite で日本語を全文検索するコード例【N-Gram, FTS4/FTS5】

むずかしそうに見えて、実は、用意された機能を使うだけでした。

Python と SQLite のマニュアルの場所を、たくさんメモしておきました。

開示情報の PDF を扱うコード例も書きました。

⇒ PDFを正規表現で検索する【Python】

⇒ PDF の破損をチェックする Python コード例【QPDF】

⇒ PDF からテキストを抽出する Python コード例【pdftotext.exe】

以上です。

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