有価証券報告書内の表をデータとして活用できないか、Pythonで読み込んでみたいと思います。
今回使う有価証券報告書は前回の記事と同じ某夢の国を運営している会社です。
今回読み込むデータは貸借対照表です。
前回の続きではありますが、ライブラリのインポート、データの読み込みから。
import pandas as pd
import numpy as np
import tabula
dfs = tabula.read_pdf('test_pdf.pdf', lattice=True, pages=['2', '71-74', '77'])
for df in dfs:
display(df) # Jupyter notebookの環境で実行可能なコード
#--------------------------------------------------
# 回次 第 59 期 第 60 期 第 61 期 第 62 期 第 63 期 Unnamed: 0
#0 決算年月 2019年3月 2020年3月 2021年3月 2022年3月 2023年3月 NaN
#1 売上高 百万円 データ割愛
#2 経常利益又は経常損失\r(△) 百万円
# ⁞
# Unnamed: 0 Unnamed: 1 (単位:百万円
#0 NaN 前連結会計年度\r(2022年3月31日) 当連結会計年度\r(2023年3月31日)
#1 資産の部 データ割愛
#2 流動資産
# ⁞
# Unnamed: 0 Unnamed: 1 (単位:百万円
#0 NaN 前連結会計年度\r(2022年3月31日) 当連結会計年度\r(2023年3月31日)
#1 負債の部 データ割愛
#2 流動負債
# ⁞
#<以下省略>貸借対照表はページが分かれているのでdf[1]、df[2]に入っています。
dfs[1] #-------------------------------------------------- # Unnamed: 0 Unnamed: 1 (単位:百万円 #0 NaN 前連結会計年度\r(2022年3月31日) 当連結会計年度\r(2023年3月31日) #1 資産の部 データ割愛 #2 流動資産 # ⁞
dfs[2] #-------------------------------------------------- # Unnamed: 0 Unnamed: 1 (単位:百万円 #0 NaN 前連結会計年度\r(2022年3月31日) 当連結会計年度\r(2023年3月31日) #1 負債の部 データ割愛 #2 流動負債 # ⁞
dfs[1]とdfs[2]が対象なのでまずは結合します。
ですが、その前にdfs[2]の最初の行は不要なので落とします。
dfs_bs = pd.concat([dfs[1], dfs[2].drop([0], axis=0)], axis=0) dfs_bs #-------------------------------------------------- # Unnamed: 0 Unnamed: 1 (単位:百万円 #0 NaN 前 連結会計年度\r(2022年3月31日) 当連結会計年度\r(2023年3月31日) #1 資産の部 NaN NaN #2 流動資産 NaN NaN # ⁞ #31 純資産合計 データ割愛 #32 負債純資産合計
概況の時のように行名、列名を付けます。
index_name = []
for i in range(1,len(dfs_bs)):
index_name.append(dfs_bs.iloc[i, 0])
bs = pd.DataFrame(columns=[dfs_bs.iloc[0, 1].replace('\r', ''), dfs_bs.iloc[0, 2].replace('\r', '')],
index=index_name)
bs
#--------------------------------------------------
# 前連結会計年度(2022年3月31日) 当連結会計年度(2023年3月31日)
#資産の部 NaN NaN
#流動資産 NaN NaN
#現金及び預金 NaN NaN
#... ... ...
#純資産合計 NaN NaN
#負債純資産合計 NaN NaNDataFrameに要素を格納していきます。
for i in range(0, len(bs)):
bs.iloc[i, :] = dfs_bs.iloc[i+1, 1:]
bs
#--------------------------------------------------
# 前連結会計年度(2022年3月31日) 当連結会計年度(2023年3月31日)
#資産の部 NaN NaN
#流動資産 NaN NaN
#現金及び預金 データ割愛
#...
#純資産合計
#負債純資産合計このままではDataFrameに入っている要素は文字列なので数値として
扱えるように型を変換します。
その前に※印やスペースなど邪魔な文字列を除去しないといけませんね。
for i in range(0, bs.shape[0]):
for j in range(0, bs.shape[1]):
if type(bs.iloc[i, j]) != float:
bs.iloc[i, j] = bs.iloc[i, j].replace('※1', '').replace('※2', '').replace(' ', '').replace(',', '').replace('△', '-')
for i in range(0, bs.shape[0]):
for j in range(0, bs.shape[1]):
if type(bs.iloc[i, j]) == float:
pass
elif bs.iloc[i, j] == '-':
bs.iloc[i, j] = 0
else:
bs.iloc[i, j] = int(bs.iloc[i, j])
type(bs.iloc[-1,-1])
#--------------------------------------------------
#int最後の要素の方がintになっているので全部置き換わってると思います。
これでindexを指定して貸借対照表の値を呼び出せるようになったと思います。
bs.loc['流動資産合計'] #-------------------------------------------------- #前連結会計年度(2022年3月31日) 271410 #当連結会計年度(2023年3月31日) 348941 #Name: 流動資産合計, dtype: object
bs.loc['流動負債合計'] #-------------------------------------------------- #前連結会計年度(2022年3月31日) 85247 #当連結会計年度(2023年3月31日) 161249 #Name: 流動負債合計, dtype: object
ryudo_rate = bs.loc['流動資産合計'][1] / bs.loc['流動負債合計'][1]
print('流動比率は%.3fです。'%ryudo_rate)
#--------------------------------------------------
#流動比率は2.164です。bs.loc['流動資産合計'][1] - bs.loc['負債合計'][1] #-------------------------------------------------- #-27789
ベンジャミン・グレアムの投資手法に関わる正味流動資産もこうすれば項目名を
呼び出して計算できるようになりました。
概況でもそうですが、会社によって表の書き方は違うと思うので、この方法で完全に
自動化はできないと思いますが、index名で計算できることは実現したいので、
いくつかの会社の有価証券報告書を使ってやってみたいと思います。

