
はてなキーワード:財政状態計算書とは
あっぷでーと:
そして、今のところ対応できないのが、決算短信の財務諸表を画像データで添付している場合。
pytesseractとかを試してみたけど、OCRの精度低すぎて使えない。
気が付くと朝4時になっていた。
なんか動くところまで出来たので貼っておく。
importpdfplumberimport re#クリーンアップdef cleanuptext(text): #決算書の合計値を太字にしたことでpdfplumberが暴走するケースへの対処 #例流動資産 -> 流流流流流動動動動動資資資資資産産産産産 #誤爆が怖いので、これが起きている時だけ補正します if "流流流流流動動動動動資資資資資産産産産産" intext:text = re.sub(r'(.)92;1{4,}', r'92;1',text) #△をマイナスに。数字中のカンマを消して結合するtext = re.sub(r'△([0-9])', r'-92;1',text)text = re.sub(r'▲([0-9])', r'-92;1',text)text = re.sub(r'([0-9]),([0-9])', r'92;192;2',text) #たまに、煽り屋みたいに文字の後にスペースが入る嫌がらせを修正する #例: 投 資 有 価 証 券 ->投資有価証券text = re.sub(r'(?<=[92;u4E00-92;u9FFF92;u3040-92;u30FF])92;s(?=[92;u4E00-92;u9FFF92;u3040-92;u30FF])', '',text) returntext#今期の勘定科目の数字を取得def get_AccountName(text,need): pattern =rf'^{need} -?[0-9]+ (-?[0-9]+)' r = re.search(pattern,text, re.MULTILINE) if ris not None: return float(r[1]) return 0#清原ネットキャッシュを計算する。def calc_KiyoharaNetCash(text): total_current_assets = get_AccountName(text,'流動資産合計') if total_current_assets == 0: #要約財政状態計算書しか公開していない、楽天のような素敵な会社様への対処 total_assets = get_AccountName(text,'資産合計') if total_assets != 0: #とりあえず、資産の部の6割を流動資産とみなす total_current_assets = total_assets * 0.6 else: #流動資産合計ではなく、流動資産という単語を使っている我が道を行く東北電力への対処 total_current_assets = get_AccountName(text,'流動資産') if total_current_assets == 0: raise Exception("流動資産合計の勘定科目が見つかりませんでした。"+text) total_liabilities = get_AccountName(text,'負債合計') if total_liabilities == 0: #負債合計ではなく、負債の部合計に拘るオムロンの嬉しい決算書への対策。なんでや・・・ total_liabilities = get_AccountName(text,'負債の部合計') if total_liabilities == 0: raise Exception("負債合計の勘定科目が見つかりませんでした。"+text) #負債をご丁寧にマイナス表記で書いてくれる中外製薬の親切な決算書への対策。いい加減にしろよ・・・ if total_liabilities < 0: total_liabilities = total_liabilities * -1 #投資有価証券はないこともあるので、0を容認する marketable_securities = get_AccountName(text,'投資有価証券') #print(total_current_assets,marketable_securities,total_liabilities) netcash = total_current_assets + (marketable_securities*0.7) - total_liabilities #たまに単位を1000円にしている銘柄があるので補正する ifis_tanni_senyen(text): netcash = netcash / 1000 return netcash# "流動資産合計" と "負債合計" の間に "単位:千円" があるかをチェックdefis_tanni_senyen(text): if "単位:千円" intext: returnTrue if "単位: 千円" intext: returnTrue if "単位 : 千円" intext: returnTrue if "単位 :千円" intext: returnTrue returnFalsedefpdf_to_kiyohara_netcash(pdfpath): withpdfplumber.open(pdfpath)aspdf:text = ''.join(page.extract_text() for page inpdf.pages)text = cleanuptext(text) #print(text) kiyohara_netcash = calc_KiyoharaNetCash(text) #print(kiyohara_netcash) return kiyohara_netcashdef mymain(): import sys args = sys.argv argc =len(args) if argc <= 1:print('''これは、清原達郎氏のネットキャッシュ比率(以下、清原ネットキャッシュ比率)を決算短信のpdfから求めるソフトです。清原ネットキャッシュ=流動資産合計+(投資有価証券*0.7)-負債合計清原ネットキャッシュ比率=清原ネットキャッシュ/時価総額*100遊び方1.決算短信pdfから清原ネットキャッシュを求めるpython calc_kiyohara_netcash.py 140120240514594985.pdf結果: 30757.0決算書には、100万円単位で数字が書かれているはずなので、この数字の単位は100万円です。つまり、3075700万円。2.時価総額を億円単位で追加することで、清原ネットキャッシュ比率を求める時価総額が146億円なら146と書いてください。python calc_kiyohara_netcash.py 140120240514594985.pdf 146結果: 210.66%このコードはNYSLライセンスです。無保証、自己責任ですが、ご自由に。かぶ探とかとつなげるといいかもね。 ''') return if argc <= 2: kiyohara_netcash =pdf_to_kiyohara_netcash(args[1])print(kiyohara_netcash) return if argc <= 3: market_cap=float(args[2])*100 #億円から百万円表記に kiyohara_netcash =pdf_to_kiyohara_netcash(args[1]) ratio = round(kiyohara_netcash/market_cap*100,2)print(f"{ratio}%") returnif __name__ == '__main__': mymain()