Python × EDINET: Excelファイルから特定の企業のEDINETコードを抽出する方法

Pythonを使ってExcelからEDINETコードを抽出する方法を解説するブログ記事タイトル画像 投資

EDINETから企業の財務情報を取得する際、特定の企業だけを対象にしたいケースは少なくありません。本記事では、Excelファイルに記録したEDINETコードを使って、目的の企業データを効率的に抽出するPythonコードを紹介します。pandasライブラリを活用し、Excelファイルの読み込みから特定のEDINETコードの抽出、そしてそのコードを使ってEDINET APIからデータを取得するまでの一連のプロセスを解説します。このテクニックを習得することで、大量の企業データの中から必要な情報だけを素早く取得できるようになり、財務分析や投資判断の効率が大幅に向上するでしょう。それでは、具体的なコードと共に、ステップバイステップで実装方法を見ていきましょう。

EDINETコードリストを入手する

EDINETコードを入手するための主な手順は以下の通りです:

  1. EDINET(https://disclosure2.edinet-fsa.go.jp/week0010.aspx)にアクセスします。
  2. トップページの右上にある「EDINETタクソノミ及びコードリストダウンロード」というタブを見つけます。
  3. 「EDINETコードリストダウンロード」リンクをクリックすると、CSVファイルがダウンロードされます。
  4. ダウンロードしたファイルを開きます。このファイルには以下の情報が含まれています:
    • EDINETコード
    • 提出者名
    • 証券コード(ある場合)
    • 提出者業種
    • その他の関連情報

目的の企業のEDINETコードをPythonプログラムで検索する。

CSVファイルのデータ構造を調べる。

import pandas as pd 
# Excelファイルのパスを指定
file_path = "EDINETコードリスト.xlsx"

# 'EdinetcodeDlInfo'シートを読み込む
df_edinet_info = pd.read_excel(file_path, sheet_name="EdinetcodeDlInfo")

# 読み込んだデータの先頭数行を確認
df_edinet_info.head()

出力結果は以下のようになります。

print(df_edinet_info.columns)

三菱商事のEDINETコードと業種を検索。

import pandas as pd

try:
    # Excelファイルのパスを指定
    file_path = "EDINETコードリスト.xlsx"

    # 'EdinetcodeDlInfo'シートを読み込む
    df_edinet_info = pd.read_excel(file_path, sheet_name="EdinetcodeDlInfo")

    # 検索したい企業名を指定
    search_name = "三菱商事"

    # 大文字小文字を区別せずに部分一致で検索
    matching_results = df_edinet_info[df_edinet_info['提出者名'].str.contains(search_name, case=False, na=False)]

    # 結果の表示
    if not matching_results.empty:
        print(matching_results[['提出者名', 'EDINETコード', '提出者業種']])
    else:
        print("該当する企業が見つかりませんでした。")

except FileNotFoundError:
    print("指定されたExcelファイルが見つかりません。")
except ValueError as e:
    print(f"エラーが発生しました: {e}")
          提出者名 EDINETコード 提出者業種
1747 三菱商事株式会社 E02529 卸売業

E02529が三菱商事のEDINETコードです。

さらに業種の種類とその総数を調べます。

import pandas as pd

# Excelファイルのパスを指定
file_path = "EDINETコードリスト.xlsx"

# 'EdinetcodeDlInfo'シートを読み込む
df_edinet_info = pd.read_excel(file_path, sheet_name="EdinetcodeDlInfo")

# '提出者業種'列の一意の値を取得
unique_industries = df_edinet_info['提出者業種'].unique()

# 結果の表示
print("提出者業種の全種類:")
for industry in sorted(unique_industries):
    if pd.notna(industry):  # NaN値を除外
        print(industry)

# 業種の総数を表示
print(f"\n業種の総数: {len([i for i in unique_industries if pd.notna(i)])}")

出力結果は以下のようになりました。

提出者業種の全種類:
その他製品
その他金融業
ガラス・土石製品
ゴム製品
サービス業
パルプ・紙
不動産業
保険業
倉庫・運輸関連
個人(組合発行者を除く)
個人(非居住者)(組合発行者を除く)
内国法人・組合(有価証券報告書等の提出義務者以外)
化学
医薬品
卸売業
外国政府等
外国法人・組合
外国法人・組合(有価証券報告書等の提出義務者以外)
小売業
建設業
情報・通信業
機械
水産・農林業
海運業
石油・石炭製品
空運業
精密機器
繊維製品
証券、商品先物取引業
輸送用機器
金属製品
鉄鋼
鉱業
銀行業
陸運業
電気・ガス業
電気機器
非鉄金属
食料品

業種の総数: 39

特定の項目を除外します。

import pandas as pd

# Excelファイルのパスを指定
file_path = "EDINETコードリスト.xlsx"

# 'EdinetcodeDlInfo'シートを読み込む
df_edinet_info = pd.read_excel(file_path, sheet_name="EdinetcodeDlInfo")

# 除外したい業種のリスト
exclude_industries = [
    "個人(組合発行者を除く)",
    "個人(非居住者)(組合発行者を除く)",
    "内国法人・組合(有価証券報告書等の提出義務者以外)",
    "外国政府等",
    "外国法人・組合",
    "外国法人・組合(有価証券報告書等の提出義務者以外)"
]

# 除外リストに含まれていない業種のみをフィルタリング
filtered_df = df_edinet_info[~df_edinet_info['提出者業種'].isin(exclude_industries)]

# フィルタリングされた業種の一意の値を取得
unique_industries = filtered_df['提出者業種'].unique()

# 結果の表示
print("フィルタリングされた提出者業種の全種類:")
for industry in sorted(unique_industries):
    if pd.notna(industry):  # NaN値を除外
        print(industry)

# 業種の総数を表示
print(f"\n業種の総数: {len([i for i in unique_industries if pd.notna(i)])}")

以下がその出力結果です。

フィルタリングされた提出者業種の全種類:
その他製品
その他金融業
ガラス・土石製品
ゴム製品
サービス業
パルプ・紙
不動産業
保険業
倉庫・運輸関連
化学
医薬品
卸売業
小売業
建設業
情報・通信業
機械
水産・農林業
海運業
石油・石炭製品
空運業
精密機器
繊維製品
証券、商品先物取引業
輸送用機器
金属製品
鉄鋼
鉱業
銀行業
陸運業
電気・ガス業
電気機器
非鉄金属
食料品

業種の総数: 33

卸売業に属する企業を検索します。

# '提出者業種'列で卸売業をフィルタリング
wholesale_companies = df_edinet_info[df_edinet_info['提出者業種'].str.contains('卸売業', na=False)]

# フィルタリングされた企業の名前を出力
print("卸売業の企業一覧:")
for company in wholesale_companies['提出者名'].unique():
    print(company)

# 企業数を出力
print(f"\n合計: {len(wholesale_companies['提出者名'].unique())}社")

検索したい業種を入力して企業一覧を出力します。

def search_companies_by_industry(industry):
    # '提出者業種'列で指定された業種をフィルタリング
    companies = df_edinet_info[df_edinet_info['提出者業種'].str.contains(industry, na=False, case=False)]
    
    if companies.empty:
        print(f"{industry}に該当する企業は見つかりませんでした。")
    else:
        print(f"{industry}の企業一覧:")
        for company in companies['提出者名'].unique():
            print(company)
        
        print(f"\n合計: {len(companies['提出者名'].unique())}社")

# ユーザーに業種を入力してもらう
search_industry = input("検索したい業種を入力してください: ")

# 検索を実行
search_companies_by_industry(search_industry)
タイトルとURLをコピーしました