EDINET XBRLをPythonで扱う — edinet-xbrlライブラリの使い方

EDINETで公開されている有価証券報告書のXBRLファイルを、Pythonで効率的にパース・活用する方法を紹介する。edinet-xbrl ライブラリを使えば、複雑なXBRL仕様を意識せずにデータを抽出できる。 EDINETとXBRLとは EDINET(Electronic Disclosure for Investors’ NETwork)は、金融商品取引法に基づく有価証券報告書等の開示書類を電子的に提出・閲覧するためのシステムだ。金融庁が運営しており、上場企業の決算書データをXBRL形式でダウンロードできる。 XBRL(eXtensible Business Reporting Language)は、財務・経営・投資情報を標準化されたXMLベースで記述するための言語だ。構造化されたデータとしてマシンリーダブルだが、仕様が複雑で、そのまま扱うのは難易度が高い。 edinet-xbrl ライブラリ BuffettCode/edinet_xbrl は、EDINETのXBRLファイルをPythonオブジェクトとして扱えるようにするライブラリだ。 インストール 1 pip install edinet-xbrl 基本的な使い方 1 2 3 4 5 6 7 8 9 10 11 12 13 from edinet_xbrl.edinet_xbrl_parser import EdinetXbrlParser # パーサーの初期化 parser = EdinetXbrlParser() # XBRLファイルをパースしてデータコンテナを取得 xbrl_file_path = "path/to/your/xbrl/file.xbrl" edinet_xbrl_object = parser.parse_file(xbrl_file_path) # 例: 該当年度の総資産を取得 key = "jppfs_cor:Assets" context_ref = "CurrentYearInstant" current_year_assets = edinet_xbrl_object.get_data_by_context_ref(key, context_ref).get_value() key と context_ref の特定 XBRLでは、取得したいデータ項目を key(タクソノミ要素 = データ項目の識別子)と context_ref(コンテキスト参照 = 期間や連結/単体などの条件)の組み合わせで指定する。jppfs_cor は日本GAAP財務諸表のタクソノミ名前空間だ。これらを特定するには: ...

2026年4月6日 · 1 分

Swift for Android vs Kotlin Multiplatform — マルチプラットフォーム時代の「Xbox vs PlayStation」

Swift for Android vs Kotlin Multiplatform — マルチプラットフォーム時代の「Xbox vs PlayStation」 Level Up Coding の記事(Jacob Bartlett 氏)が注目を集めています。同じローラーコースターアプリを Swift for Android と Kotlin Multiplatform(KMP)の両方で構築し、開発体験を徹底比較した実践レポートです。 著者はこの 2 つの技術を「Xbox vs PlayStation」に例えています。どちらも「ビジネスロジックを共有し、UI はネイティブで書く」という同じアーキテクチャ思想を持ちながら、アプローチが正反対です。iOS 開発者が Android に進出するか、Android 開発者が iOS に進出するか — その出発点の違いが設計全体に反映されています。 2 つのアプローチ — 同じ目的、逆の方向 両技術の根本的な違いは「どちらのプラットフォームを起点にするか」です。 Swift for Android: iOS (SwiftUI) ← Swift コア → Android (Jetpack Compose) "iOS ファーストの開発者が Android に展開" Kotlin Multiplatform: Android (Jetpack Compose) ← Kotlin コア → iOS (SwiftUI) "Android ファーストの開発者が iOS に展開" 項目 Swift for Android Kotlin Multiplatform 共有言語 Swift Kotlin コンパイル方式 Swift → ネイティブ .so(JNI 経由) Kotlin → ネイティブバイナリ(Obj-C ヘッダ生成) Android 側 UI Jetpack Compose Jetpack Compose iOS 側 UI SwiftUI SwiftUI 境界技術 JNI + swift-java 自動バインディング Kotlin/Native + Obj-C 互換 開発開始年 2025 年(プレビュー) 2017 年 Swift for Android の仕組み — swift-java と JNI Swift for Android は 2025 年 10 月に公式プレビューとしてリリースされました。Swift Android Workgroup が Swift.org の公式ワークグループとして設立され、Android を Swift の正式サポートプラットフォームにする取り組みが進行中です。 ...

2026年3月5日 · 4 分

請求入金

請求入金 マッチング 文字列の揺らぎがある場合、ベクトルデータを使ったマッチングは非常に有効です。 具体的には、文字列の類似度を計算するために、自然言語処理(NLP)の技術を利用することができます。 以下は、fuzzywuzzyライブラリを使用して文字列の類似度を計算し、マッチングを行うサンプルコードです: まず、必要なライブラリをインストールします: 1 pip install pandas openpyxl fuzzywuzzy 次に、サンプルコードです: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 import pandas as pd from fuzzywuzzy import fuzz # 入金リストと請求明細のファイルパス payments_file = 'payments.xlsx' invoices_file = 'invoices.xlsx' # Excelファイルからデータを読み込む payments_df = pd.read_excel(payments_file) invoices_df = pd.read_excel(invoices_file) # 類似度の閾値を設定 similarity_threshold = 80 # マッチング結果を格納するリスト matched_records = [] # 入金リストと請求明細をマッチングさせる for _, payment in payments_df.iterrows(): for _, invoice in invoices_df.iterrows(): # 金額が一致するか確認 if payment['金額'] == invoice['請求金額']: # 振り込み依頼人と顧客名の類似度を計算 similarity = fuzz.token_sort_ratio(payment['振り込み依頼人'], invoice['顧客名']) if similarity >= similarity_threshold: matched_records.append({ '入金ID': payment['入金ID'], '請求ID': invoice['請求ID'], '金額': payment['金額'], '振り込み依頼人': payment['振り込み依頼人'], '顧客名': invoice['顧客名'], '類似度': similarity }) # マッチング結果をデータフレームに変換 matched_df = pd.DataFrame(matched_records) # マッチング結果を表示 print(matched_df) # マッチング結果を新しいExcelファイルに保存 matched_df.to_excel('matched_results.xlsx', index=False) このコードでは、以下の手順を実行しています: ...

2025年2月13日 · 1 分

hatch

hatch https://hatch.pypa.io/1.9/ 最近気になるツール「Hatch」でPythonプロジェクトを管理する

2025年1月26日 · 1 分

nix

nix NIXで管理するpython環境 uv https://docs.astral.sh/uv/ nix: https://github.com/pyproject-nix/uv2nix

2025年1月5日 · 1 分

SQLModel

SQLModel テーブル定義 SQLModel で簡単なテーブルを作成する Alembic マイグレーション SQLModel で設計したモデルを Alembic でマイグレーション Alembic で複数モデルを扱う alembic + SQLModelでデータベースをマイグレーションする

2024年10月17日 · 1 分

gunicorn

Gunicorn max_requests / max_requests_jitter Gunicornでメモリリークを避けるために子プロセスを定期的に再起動するには、max_requestsとmax_requests_jitterの設定を利用するのが効果的です。これにより、一定のリクエスト数を処理した後にワーカープロセスが自動的に再起動されます。 以下はその設定方法です: max_requests: 各ワーカープロセスが再起動される前に処理するリクエストの最大数を指定します。 max_requests_jitter: 再起動のタイミングをランダム化するためのオプションです。これにより、全てのワーカープロセスが同時に再起動されるのを防ぎます。 Gunicornの設定ファイル(例:gunicorn.conf.py)に以下のように追加します: 1 2 3 4 # gunicorn.conf.py max_requests = 1000 # 1000リクエストごとに再起動 max_requests_jitter = 50 # 再起動タイミングをランダム化 または、コマンドラインで起動する際にオプションとして指定することもできます: 1 gunicorn --max-requests 1000 --max-requests-jitter 50 myapp:app これにより、各ワーカープロセスは1000回のリクエストを処理した後、ランダムに最大50回のリクエストを追加で処理してから再起動されます¹(https://qiita.com/ryu22e/items/2668a2243a5191bcdc78)²(https://zenn.dev/xknzw/articles/d2d337ae2f8966)³(https://qiita.com/_konishi_/items/1dc2bbfc386f57d06934)。 この設定により、メモリリークの影響を最小限に抑えつつ、サービスの安定性を保つことができます。 ¹(https://qiita.com/ryu22e/items/2668a2243a5191bcdc78): gunicorn(>=19.2)ではmax_requestsと一緒にmax_requests_jitterも使おう - Qiita ²(https://zenn.dev/xknzw/articles/d2d337ae2f8966): gunicorn syncワーカーの全体像メモ - Zenn ³(https://qiita.com/_konishi_/items/1dc2bbfc386f57d06934): gunicornでディスク使用量が増え続ける現象への対処 - Qiita (1) gunicorn(>=19.2)ではmax_requestsと一緒にmax_requests_jitterも使おう. https://qiita.com/ryu22e/items/2668a2243a5191bcdc78. (2) gunicorn syncワーカーの全体像メモ - Zenn. https://zenn.dev/xknzw/articles/d2d337ae2f8966. (3) gunicornでディスク使用量が増え続ける現象への対処 - Qiita. https://qiita.com/_konishi_/items/1dc2bbfc386f57d06934.

2024年10月11日 · 1 分

ltsv

ltsv ltsv から csvに変換 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #!/usr/bin/env python import click import pandas as pd import csv import re @click.group() @click.option("--tf_output", "-to", default=None) @click.pass_context def group(ctx, tf_output): pass @group.command() @click.argument("src") @click.pass_context def ltsv2csv(ctx, src): """LTSV to CSV""" output = f"{src}.csv" def get_line_dict(line): return dict(re.search(r"^([^\:]+)\:(.*)$", i).groups() for i in line) with open(src) as f: data = pd.DataFrame(map(get_line_dict, csv.reader(f, delimiter="\t"))) data.to_csv(output, index=False) if __name__ == "__main__": group()

2024年10月11日 · 1 分

Python: 文字烈ケース変換

Python 文字列ケース変換 Camel Elegant Python function to convert CamelCase to snake_case? 1 2 3 4 5 import re name = 'CamelCaseName' name = re.sub(r'(?<!^)(?=[A-Z])', '_', name).lower() print(name) # camel_case_name

2024年9月6日 · 1 分

Ruff[object Object]

Ruff https://docs.astral.sh/ruff/rules/ 新しい静的コード解析ツール「Ruff」をご紹介

2024年6月6日 · 1 分