茶ぶろぐ

おとなのライフスタイル@TOKYOブログ

pythonでEDINETコードリストをデータベースに登録するあるいはDataFrameの勉強をちょろっと

pythonで「EDINETコードリストをpostgresqlに登録する」をやってみた。

  • EDINETコードリスト(csv)をとってくる(webサイトからリンクをたどってダウンロード)
  • posgresqlをいれる、DBを作る、テーブルを作る(スクリプトを書く)
  • pythoncsvファイルを読み込み、DBのテーブルにINSERTする


 これだけ。新人の研修ぐらい(ウソです)
 むかしはこれくらいちょろかったかどうかはわからないけど、csvのデータをDBにいれるのにどのような作業が発生するか、だいたいなんとなくぼんやりとは知っている。
 EDINETのコードリストというとても大事なものの存在について、つい最近やっとわかったので、DBにいれるかあ、と考える。
 pythonの勉強をしたいからだ。
 となるとまずはpostgresqlをいれなければならない。

posgresql
 ちょっと前にMacいれた。どうやっていれたか思い出せない。
 データベースを作る。コマンドで。ちまちま調べながらやる。ユーザーも作る。いや作っていないのか、忘れた。postgresというユーザーがいる。
 テーブルを作る。元になるcsvは日本語の見出し。ちょっと考えたが、へなちょこローマ字や英語に置き換える。いやそもそも、このテーブルを使って何かするかとか、まだ決まってないんで。桁数とかわからんので適当。いつものことながら、スクリプトの管理がぼんやりしている。あとでpgAdminをいれた。(スクリプトを書いている途中に、コメントはどうやって書くんだっけな〜と思い出せなかったが、ある瞬間に勝手に手が動いて怖かった)


python
 業務経験はない。ちゃんと基礎は学んでいない。それなのにpandasとか使っていて、今回ついにきれいにはまった。いままでだましだましやっていたが、csvで勉強できた。便利ぃ。
 ぱんだ? pandasのなんとかというのは、やたらとみかけるリストやハッシュか辞書かみたいなやつらで、よくわからねえなーとなんとなく目を逸らしていたが、間に合わなくなってきて、ちょっとやる

 このpandasのread_csvcsvを簡単に読み込める。
 読み込んだcsvは pandas.core.frame.DataFrame で、一行が pandas.core.series.Series である。

 DataFrameから、位置やカラム名でアクセスできるかんじ。EDINETコードリストの見出しは日本語なので日本語。
 自分がアホではまったのは、全体の行数を知りたいために、DataFrameのsizeをみていたのだが、ぜんぜん違う数字がでていることにしばらく気づいていなくてはまった。
 データ件数は最初にちゃんと確認しような! sizeじゃなくて、pythonのlen(オブジェクト)で行数がとれる。sizeは何がでているかまだわかっていない。

 名前をキーにして取得できるだけなら、ただの辞書とリストになるが、かっこいいのは絞り込みとかできるところ。

df1がread_csvで読み込んだDataFrame
df2 = df1[df1['上場区分'] == '上場']

という書き方になる。(df1とdf2をわける理由はあんまりないかもしんない、わかんない)
 この書き方が自分にはちょっと変わっているので、すぐ忘れそう。

 df2を全件回して、SQL文をつくってINSERTする、というアナログな、他に効率のいい正しいやり方があるんじゃないのというやり方をやる。(このiterrowsも全然わからなくて混乱していた)

    connに接続
    with conn.cursor() as cursor:
        for index, row in df2.iterrows():
            #row['提出者種別'] #値の取り出し方
            sql文をつくりcursorをexecuteしてconnをcommitするを1件ずつやる


 どうやってコミットするとか、とりあえず1件ずつで。

 何回かやってたら(最初はsql分は短くして、3項目だけとかやる)、「提出者法人番号」という項目がfloatで読み込まれているのに気づいた。read_csvでDataFrameになる時点でそうなっているらしい。読み込み時にデータ型を指定できるのかなと調べたら、できた、

df = pd.read_csv(ファイルへのふるぱす, skiprows=1,encoding='cp932' 
    , dtype={'提出者法人番号': str} )

 データ型がは必要なものだけ指定できるらしいすごい。
(いま気づいたがskiprowsはなにやってんだろ。項目名と判断してくれるの、おりこう何も考えずにコピーしていたので知らんかった)



 いろんなedinet関連のpythonのコードをみて思ったこと

  • 学生さんがわりといる。会計の人?
  • 大人で極めている人はそもそも有価証券報告書とかについてわかっているようでかつコードを書くとかわけがわからない
  • pythonの書き方はばらばら。コードを書いた時期とか、仕事かエンジニアかツールか、とかいろいろ?


 久しぶりにそれっぽいものを作って思ったこと

  • 勝手に手が動くところは怖い
  • pythonをちゃんと勉強するができない
  • INSERT文とか面倒くせい
  • こんなのいまどきChatFGPTにやらせるべきではなかろうかと思いつつ
  • こういうことをやってもすぐに忘れるのに綺麗にブログにまとめる忍耐がない


 こういう作業をやりだすとイコール家事放棄なので、あかんですね。