pagetakaBlog

最近リフォームと鳥取県日南町の記事多め。写真、PC、ネット等の話題も

Python:VSCodeでPDFMinerを使って、東証株日報PDFから表抽出(3)

東証株日報からのデータ抽出、少し前進。耄碌爺にこれ以上できるか全く不明ですが、ひとまず、世間様へ恥さらしながら…。

追記・10月12日:できあがったCSVと東証株式相場表(日報、PDF)に齟齬

事項掲載の10日付スクリプトでファイル容量の改善がありました。しかし、日ごとに容量差があり、一部チェックしたところ、取引無し、上場廃止など、当初意図したとおりの結果によるもののほか、必要項目数があるのに収載されてない銘柄もあるのがわかりました。結果、スクリプトでできるCSVと東証株式相場表(日報、PDF)には一定の齟齬が起こっています。関連のスクリプトは当面掲載見合わせることにしました。

10/28追記:「まとめ」UP

東証株式相場表をDLし、PDFMinerでCSV化。「LOAD DATA INFILE」でMySQLへUP、というながれをまとめました。

追記・10月10日:スクリプトの修正があります。

この記事下の方に載せたPythonスクリプト、修正があります。
pagetaka.hatenablog.jp
東証株式相場表の日報中、銘柄コードのなかに1文字挿入されているのがありました。「配当落ち」などを示す記号のようです。1銘柄当たりの項目数に齟齬を来たすため、ひとまず削除するスクリプトを、リンク先に掲載しました。

現状:約4000件のデータ、CSVに保存できた。

PDFで提供されている東証株相場表から、銘柄コード、株価などを抽出し、CSVで保存する目論見、なんとかできているようです。目視でこんなものかな、という程度ですので錯誤の可能性もありますが、ご寛容のほど。

銘柄コード(4桁数字)から銘柄英語名までの17項目を得ることができました。

【東証株式相場表PDFから抽出。CSVをExcelで開いた状態(部分)】
【東証株式相場表PDFから抽出。CSVをExcelで開いた状態(部分)】

課題:データとしてはまだ不十分かと…。


PDFにはありますが、CSVには業種名がありません。PDFMinerの結果から直接使うことはできませんでした。また、取引日も1行分にはありません。この二つは1行内に補うか、MySQLなどで使う際にリンクして補うかするようになるかな~などと妄想しています。

銘柄コードをキーにすれば、銘柄名、銘柄英語名をその都度記録の必要は無さそうです。また、売買単位も日常変更される可能性は低いですし、重要なのは1単位購入する総額のような気もしますが、単位未満株売買が重要という場合には必須の情報ですし…扱いは使う側の都合による、ということでしょうか。

1日分をDLしCSVにしてもほぼほぼ意味はありません。一定日数分を蓄積することが必要です。今年4月4日から市場区分が変わっています。それも含めややこしいです。区分変更前の最終日(4月1日)は旧区分(1部、2部など)でPDFができています。また、前月までのPDFはアーカイブに月別保管で、同じ月でも表示される保管フォルダが異なるという塩梅で使いにくいことこの上ありません。

【相場表のURL、同月でも上位パスが異なる例も】
【相場表のURL、同月でも上位パスが異なる例も】

1日分データをCSVで提供する、1か月分まとめてDLできるようする、など東証が改善していただければ、非力な耄碌爺には助かるんですけどね…ええ。

参考程度のスクリプト

関数化していません、悪しからず。replace、splitなどではもっと簡便な方法もあるかと思うのですが、爺にはひとまずこれが目の前の壁…ということで、恥ずかしながらスクリプトを載せます。全部を順につなぐと動くのかと…妄想・幻覚の可能性もありますが…。

モジュールなどのインポート
# PDFファイルを読込みPDFMinerで解析し、CSV出力する
# Pdfminer.sixモジュールインポート
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.converter import TextConverter
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.layout import LAParams
#PDF構文解析情報関係
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfparser import PDFParser
#正規表現、CSV、IO
import re
import csv
from io import StringIO
PDFMinerの設定など

「boxes_flow= None」の設定で、PDF上の縦罫線をほぼ無視し、1銘柄分のデータをほぼ一連で取得できるようになりました。

# 標準組込み関数open()でFileオブジェクト取得
#東証株相場表のファイルをopenする
fp = open("C:\\xxx\\yyy.pdf", 'rb') #VSCodeで使うPythonフォルダ(=パスが通っている)にPDFを配置
# 出力先をPythonコンソールするためにIOストリーム取得
outfp = StringIO()
# PDFParserオブジェクト取得
parser = PDFParser(fp)
# PDFDocumentオブジェクト取得
doc = PDFDocument(parser)
rmgr = PDFResourceManager() # PDFResourceManagerオブジェクト取得
lprms = LAParams(boxes_flow=None)   # LAParamsオブジェクト取得 ※ここ大切
device = TextConverter(rmgr, outfp, laparams=lprms)    # TextConverterオブジェクト取得
iprtr = PDFPageInterpreter(rmgr, device) # PDFPageInterpreterオブジェクト取得
PDFを解析しテキスト抽出、銘柄コード位置取得

数字3桁区切り「,」を削除しました。

# ※※10/12追記:齟齬が見つかりましたので掲載を当面見合わせることにしました。
# ※※10/11追記:以下のスクリプトには一部不都合(頁先頭追記をご参照ください)があります。
# 銘柄コードをINDEXとして使用するためslice位置取得のため各ページの銘柄コード文字位置取得

爺のWin11(64)HOME、intel-i5(9600k)、32GBメモリで約85秒かかりました。耄碌爺が書いたスクリプトです。わかった方が見たら一笑に付すようなもの、またはそれ以下かと…。ということで、もっと便利な方法をご存知の方、どうぞご教示ください。