Arelle が公式に Python ライブラリをリリースしたとのことです。
「arelle-release」という名前のライブラリでした。
pip コマンドでインストールできるようです。
- (pypi.org) arelle-release PyPI (インストール方法)
- (arelle.org) Arelle released on PyPI! (公式のブログ記事)
なので、まずは上記ライブラリの使用を検討してみるのが良いと思います。(追記終わり)
以下はもう古い内容になるかもしれませんが、一応残しておきます。
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® ⇒ Download ⇒ GitHub – 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) についても、使える状態になっていました。
インストール完了です。
(2022年11月14日 追記)いつからか、regex という外部ライブラリも必要になっていました。必要なライブラリは、今後も変わったりすると思います。(追記終わり)
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 のキャッシュフォルダを削除してみたら直りました。
想像ですが、もしかしたら、途中でダウンロードに失敗したファイルがあって、壊れたファイルが出来ていたのかもしれません。
Arelle の FileNotFoundError の解決方法
追記です。2022年11月14日に、当記事の通りに Arelle をダウンロードして使用したところ、以下のエラーが出ました。
FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。
(OS は Windows 10 で、Python 3.10.8 を使用しています。)
この解決方法です。
Arelle の Version.py の一部を、以下のように変更したら直りました。
(例)Version.py の場所です。
F:\project\kabu\Arelle\arelle\Version.py
(例)Version.py の変更箇所です。
以下の for 文のリストから getGitHash だけを削除します。
def getVersion() -> str:
for version_fetcher in [getBuildVersion, getDefaultVersion]: # 追加
# for version_fetcher in [getBuildVersion, getGitHash, getDefaultVersion]: # コメントアウト
fetched_version = version_fetcher()
if fetched_version is not None:
return fetched_version
raise ValueError('Version not set')
これで、当記事のコード例が再び動くようになりました(確認したのはそこまでです)。
さて、『FileNotFoundError』の原因です。
Version.py の中にある getGitHash() 関数が、
以下の git コマンドを実行していたのが原因でした。
p = subprocess.run(['git', 'rev-parse', 'HEAD'], capture_output=True, encoding='utf-8')
ですが、自分は Windows に git コマンドをインストールしていませんでした。
なので、
『git コマンドの実行ファイルが無い』⇒『FileNotFoundError』
という状態になっていました。
この git コマンドは、おそらく何か意図があってのことだと思いますが、あまり深く調べていないのでちょっとわかりません。
あと、上記の変更で Arelle が意図しない動作をするかもしれません。そのときはまた、適宜対処を試みていく必要があると思います。
以下、私の遭遇した Arelle のエラーメッセージ(トレースバック)です。
Traceback (most recent call last):
File "f:\project\kabu\app_main.py", line 10, in <module>
import app_xbrl # 追加の自作モジュールです。
File "f:\project\kabu\app_xbrl.py", line 25, in <module>
from Arelle.arelle import Cntlr
File "f:\project\kabu\Arelle\arelle\Cntlr.py", line 15, in <module>
from arelle import ModelManager
File "F:\project\kabu\Arelle\arelle\ModelManager.py", line 7, in <module>
from arelle import ModelXbrl, Validate, DisclosureSystem, PackageManager
File "F:\project\kabu\Arelle\arelle\Validate.py", line 6, in <module>
from arelle import (FileSource, ModelXbrl, ModelDocument, ModelVersReport, XbrlConst,
File "F:\project\kabu\Arelle\arelle\ModelVersReport.py", line 6, in <module>
from arelle import (XbrlConst, XbrlUtil, XmlUtil, UrlUtil, ModelXbrl, ModelDocument, ModelVersObject,
File "F:\project\kabu\Arelle\arelle\Version.py", line 41, in <module>
__version__ = getVersion()
File "F:\project\kabu\Arelle\arelle\Version.py", line 35, in getVersion
fetched_version = version_fetcher()
File "F:\project\kabu\Arelle\arelle\Version.py", line 22, in getGitHash
p = subprocess.run(['git', 'rev-parse', 'HEAD'], capture_output=True, encoding='utf-8')
File "C:\***\Python310\lib\subprocess.py", line 503, in run
with Popen(*popenargs, **kwargs) as process:
File "C:\***\Python310\lib\subprocess.py", line 971, in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
File "C:\***\Python310\lib\subprocess.py", line 1440, in _execute_child
hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。
以上、FileNotFoundError の対処法でした。
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 のウォッチ式で見た時のスクリーンショットです(全体の中の一部です)。
実際に決算分析をするときは、この戻り値の内容を駆使して、自身のほしいと思う形式に整える必要がありました。
たとえば、以下のような表形式にすることができました。
⇒ Arelle をマルチプロセスで実行するコード例【XBRL】
⇒ XBRL から『勘定科目の金額や文章』を取得するコード例【Arelle】
QName は XML の用語
factsByQname の QName とは、XML の用語でした。
(www.w3.org) Using Qualified Names (QNames) as Identifiers in XML Content
QName の読み方ですが、自分は QName って読んでいます(読み方は色々あると思います)。
簡単に言うと、QName は 識別子の1つでした。XML データの中から目的のデータを見つける為に使う識別子の1つでした。
XBRL は XML の仕組みで作られているので、XBRL の用語かと思ったら、XML の用語だった、ということがよくありました。何の用語なのか?だけでも分かるとスッキリしますね。
以上です。
EDINET API で XBRL を取得する方法を書きました。
⇒ 【EDINET API】Python で XBRL を取得する方法【決算分析】
Arelle で XBRL からデータを取得するコード例も書きました。
⇒ XBRL から『勘定科目の金額や文章』を取得するコード例【Arelle】
⇒ XBRL から『勘定科目』と『リンクベース』の内容を取得するコード例【Arelle】
⇒ 【EDINET XBRL】『連結経営指標等』の Fact だけを取得する方法【Arelle】
⇒ Arelle をマルチプロセスで実行するコード例【XBRL】
並列処理モジュールの使い方を書きました。
⇒ 【Python】multiprocessing.Pool() の使い方【並列処理】
⇒ 【Python】concurrent.futures の使い方【並列処理】
Python プログラムでロギングするコード例を書きました。
⇒ 【Python】ロガーでロギングするコード例【logging】
マルチプロセス処理でもロギング OK です。
concurrent.futures
でログを記録するコード例。
⇒ ProcessPoolExecutor でログを記録するコード例(プロセスごとに分ける)
⇒ ProcessPoolExecutor でログを記録するコード例(まとめて記録)
multiprocessing
でログを記録するコード例。
⇒ multiprocessing.Pool でログを記録するコード例(プロセスごとに分ける)
⇒ multiprocessing.Pool でログを記録するコード例(まとめて記録)
『数値データ』や『テキストデータ』を保存するときは、SQLite が便利でした。
Python で SQLite を読み書きする方法を書きました。
⇒ 【Python】SQLite の使い方【sqlite3】
開示情報の『テキスト分析』も面白かったです。
『増収増益』を含んだ開示情報を列挙したい。
その一心で、日本語の全文検索を『高速』に実行するコード例を書きました。
⇒ 【Python】SQLite で日本語を全文検索するコード例【N-Gram, FTS4/FTS5】
むずかしそうに見えて、実は、用意された機能を使うだけでした。
Python と SQLite のマニュアルの場所を、たくさんメモしておきました。
開示情報の PDF を扱うコード例も書きました。
⇒ PDF を正規表現で検索するコード例【qpdf, pdftotext】
⇒ PDF の破損をチェックする Python コード例【QPDF】
⇒ PDF からテキストを抽出する Python コード例【pdftotext.exe】
MeCab で形態素解析するコード例も書きました。
⇒ MeCab で NEologd の辞書を作ってインストールする方法【Python】
⇒ MeCab で形態素解析する Python コード例【NEologd】
⇒ MeCab で形態素解析する Python コード例(出力フォーマット指定)【NEologd】
⇒ MeCab で『分かち書き』する Python コード例【NEologd】
以上です。