【開発記】配当金の自動計算アプリ作成にチャレンジ#3

こんにちは

hiroエンジニアです。

前回に引き続き、配当金の自動計算アプリを作っていきます。

今回は、SBIネオモバイルから取得できる情報以外の株式の情報を取得しCSVに一緒に出力するところまでを実装していきたいと思います。

前回は、SBIネオモバイルから取得できる項目しかスクレイピングできませんでした。

しかし、両学長が提供していた、エクセルのシートでは、以下の情報が必要になります。

SBIネオモバイルの画面から取得できてない項目として以下があります。

  • 市場
  • 業種
  • EPS
  • 1株配当

市場と、業種に関しては、株式会社のマスタ情報を取得する必要があります。

ネットで探すと、日本取引所グループというサイトに、毎月の上場企業のリストを集計して公開してくれていました。非常にありがたいですね。

また、EPS、1株配当の情報は上記サイトにはなく、色々なサイトを探しているうちに、おそらく正しそうな情報をまとめているサイトを発見しました。(取引所グループのような公式のサイトではないため、念の為リンクは控えておきます)

ようやく、マーケット情報と、配当、EPSの情報を取得できたので、次にPythonでCSVに出力する方を試します。

まずは、pandasを使っている箇所の理解から始める必要があります。

    #コード
    code_list=list()
    for codes in soup.find_all(class_="ticker"):
        code=codes.get_text()
        code=code.strip()
        code_list.append(code)
     
    df_code=pandas.Series(code_list)

上記のdf_codeの定義で、「pandas.Series(code_list)」を使っています。

pandasでは様々なデータの管理をすることができますが、Seriesでは、1次元の情報を扱うことができるようです。今回の例では、株式のコードのリストを配列に持ち、それをpandasの1次元の情報として持っているようです。

更に下の方に、列名のラベルをつけています。

df_result2.columns=['コード', '銘柄名' #・・・・略

途中経過は省略しますが、pandasに格納されている1次元の情報に対して、「コード」、「銘柄名」といったラベルをつけることができるようです。

これで、CSVのヘッダ行と中身がそれぞれpandasで表現できます。そして最後に以下の処理でCSVに出力が可能になってます。

df_result2.to_csv(name + '.csv')

以上を踏まえ、新しくCSVに項目を追加する流れをまとめると以下の1〜5のようになります。

  1. マスタ用のCSVからデータを読み取る
  2. 1から銘柄のコードに一致する、市場、業種、EPS、1株配当を取得
  3. 2の内容をpandasで1次元で管理する
  4. ヘッダに市場、業種、EPS、1株配当を追加する
  5. pandasからCSVに出力する

1.マスタ用のCSVからデータを読み取る

  def get_stock_from_master():
            csv_file = open("../data/japanese_stock_master.csv", "r", encoding="utf-8", errors="", newline="" )
            csv_list = csv.DictReader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)
            # ヘッダー情報
            # header = next(csv_list)
            # print(header)

            stock_list = list()
            for row in csv_list:
                stock_list.append(row)

            return stock_list

2.1から銘柄のコードに一致する、市場、業種、EPS、1株配当を取得 & 3.2の内容をpandasで1次元で管理する

stock_master = Stock.get_stock_from_master()
 
# 市場と業種を取得
    market_list=list()
    sector_list=list()
    for code in code_list:
        target = (list(filter(lambda item : item['code'] == code, stock_master)))
        print(target)
        market_list.append(target[0]['market'])
        sector_list.append(target[0]['sector'])

    df_market=pandas.Series(market_list)
    df_sector=pandas.Series(sector_list)

取得した市場、業種をpandasに追加(EPS、1株配当も同じように取得)

4.ヘッダに市場、業種、EPS、1株配当を追加する

df_result2.columns=['コード','市場','銘柄名','業種','保有数量(株)','平均取得単価(円)','評価額(円)','損益(円)','EPS','1株配当'] 

今回追加した項目も含めて、両学長のエクセルと同じ項目をヘッダに指定

5.pandasからCSVに出力する

df_result2.to_csv(name + '.csv', index=False)

indexの数字は不要なためFalseにしてます。

最終的なCSVは、こんな感じで表示されるようになりました。

これで手動で株式保有数や、配当を入力せずともデータが用意できるようになりました。

次回は、Pythonで取得したCSVをAPIとして返却するAPIを作りたいと思います。