1.はじめに
EDINET API ver.2が公開されました!
今までのxbrlとの格闘がなくなればいいなと思います。
2.経緯
現状、(上場)企業の財務情報や「研究開発活動」の部分のテキストを取ろうとすると、xbrlというファイル形式と格闘しないといけません。(buffetコードなどプラン使えば一発ですが)
なので自分でコードを書くとこんな感じで地獄でした。そしてこれが正しい項目なのかもちょっと怪しい。うまく取得できないパターンに対応していくと大変なことになります。
#@title 共通処理(edinet-xbrlとmojimojiインストる)
import pandas as pd
!pip install edinet-xbrl
from edinet_xbrl.edinet_xbrl_parser import EdinetXbrlParser
!pip install mojimoji
import mojimoji
import re
def extract_data(edinet_xbrl_object,keys):
rep_pat = "<.*?>|\n|\xa04|\xa0"
dlist = []
for k,v in keys.items():
if v == "Duration" or v == "Instant":
context_ref_current = "CurrentYear" + v
context_ref_current_anot = "CurrentYear" + v + "_NonConsolidatedMember"
else:
context_ref_current = v
context_ref_1yr = v
try:
match = edinet_xbrl_object.get_data_by_context_ref(k, context_ref_current)
if match is not None:
v1 = edinet_xbrl_object.get_data_by_context_ref(k, context_ref_current).get_value()
except:
match = edinet_xbrl_object.get_data_by_context_ref(k, context_ref_current_anot)
if match is not None:
v1 = edinet_xbrl_object.get_data_by_context_ref(k, context_ref_current_anot).get_value()
try:
match = edinet_xbrl_object.get_data_by_context_ref(k, "Prior4YearDuration")
if match is not None:
v1 = edinet_xbrl_object.get_data_by_context_ref(k, "Prior4YearDuration").get_value()
except:
v1 = ""
v2 = re.sub(rep_pat, "", str(v1))
v3 = mojimoji.zen_to_han(v2,kana=False)
dlist.append(v3)
return dlist
xbrlとの苦闘は沢山のネット情報があります(^_^;)。
今年はじめあたりからEDINETのAPIが刷新されるという情報の中に、xbrlをcsvに変換した情報も取れるようになった!との情報がありました。8/21に解禁されましたので、早速AIPキーを申請して、csvで取れるか試してみます。
3.試しで取得してみる
簡単!ちょっと苦労したのはエンコードでutf-16だったのと、zipファイル解凍後のフォルダ構造で勘違いして手こずりました。
FNAME = "S100RB3P"
url = "https://api.edinet-fsa.go.jp/api/v2/documents/"+ FNAME + "?Subscription-Key=API_KEY&type=5"
import requests
r = requests.get(url, params=payload)
from urllib.request import urlretrieve
filename = FNAME + ".zip"
urlretrieve(url, filename)
#中身を覗くとファイルが複数あったのでとりあえず回答
!unzip $filename -d $FNAME
#globで抜き出し
import pandas as pd
import glob
csvfiles = glob.glob(FNAME+"/XBRL_TO_CSV/jpcrp*.csv")
#結局必要だったのは1ファイルのみ
for csvf in csvfiles:
print(csvf)
df = pd.read_table(csvf,encoding="utf-16",error_bad_lines=False)
いい感じにとれました!1651も項目がありました。
4.その他
異常な使い方にならないように気をつけながら、分析業務の基本データとして、各社データを蓄積したいと思います。特にテキスト系情報。
なお、NYSEの企業情報であれば、opendataでBigQueryに蓄積してくれています。これは便利!
csvからの情報取得は薄いwrapperを書きたいなと思います。
Commentaires