銘柄コード取得
先日、「株価を取得して毎年同じ月に上がるかを調べる」Pythonコードを紹介しました。
今回は、そのプログラムの中身について、どんな処理をしているのかを何回かに分けて解説していきます。
まずは 銘柄コードを取得する部分 のPythonプログラムです。
import pandas as pd
import os
# 東証の上場銘柄一覧のURL
url = "https://www.jpx.co.jp/markets/statistics-equities/misc/tvdivq0000001vg2-att/data_j.xls"
# 保存ファイル名
file_name = "stock_code.csv"
def read_excel_url(url):
try:
df = pd.read_excel(url)
return df
except Exception as e:
print(f"Error reading the Excel file: {e}")
return None
def save_to_csv(stock_code, file_name):
try:
stock_code.to_csv(file_name, encoding="utf-8-sig", index=False)
print(f"Data saved to {file_name}")
except Exception as e:
print(f"Error saving to CSV: {e}")
def main():
script_dir = os.path.dirname(os.path.abspath(__file__))
save_path = os.path.join(script_dir, file_name)
data = read_excel_url(url)
if data is not None:
print(data.head())
save_to_csv(data, save_path)
if __name__ == "__main__":
main()
プログラム全体の構成
このプログラムは大きく分けて 3つの関数 と、最後の if文 で構成されています。
-
read_excel_url() → Web上のExcelファイルを読み込む
-
save_to_csv() → DataFrameをCSVとして保存する
-
main() → 実行の流れをまとめた関数
そして最後に
if __name__ == "__main__ "
main()
と書くことで、このファイルを直接実行したときだけ main() を呼び出すことができます。
こうしておくメリットは次の通りです。
-
ファイルを直接実行した場合 → main() が動作する
-
他のPythonプログラムからインポートした場合 → 各関数を自由に呼び出して再利用できる
関数の再利用例
このファイルを 「銘柄コード取得.py」 として保存したとします。
同じフォルダに 「再利用.py」 というファイルを作って次のように書くと、銘柄コード取得.py の main() が実行されます。
import 銘柄コード取得
銘柄コード取得.main()
もちろん main() 以外の関数も呼び出せます。
import 銘柄コード取得
url = "https://www.jpx.co.jp/markets/statistics-equities/misc/tvdivq0000001vg2-att/data_j.xls"
print(銘柄コード取得.read_excel_url(url))
このように 自分で作った関数を別のプログラムから再利用できるのが大きなメリットです。
main() の詳しい解説
def main():
script_dir = os.path.dirname(os.path.abspath(__file__))
save_path = os.path.join(script_dir, file_name)
data = read_excel_url(url)
if data is not None:
print(data.head())
save_to_csv(data, save_path)
この関数は「プログラム全体の流れ」をまとめています。
保存先のパスを決定
script_dir = os.path.dirname(os.path.abspath(__file__))
save_path = os.path.join(script_dir, file_name)
-
_ _ file_ _ : 実行中のファイルの場所を指す特別な変数
-
os.path.abspath(_ _ file_ _) : 絶対パスを取得
-
os.path.dirname(...) : フォルダ部分を取り出す
-
os.path.join(...) : 保存ファイル名と結合
これで「実行中のスクリプトと同じ場所に stock_code.csv を保存する」ようになります。
フォルダの場所を移動しても対応できるので便利です。
データを取得
data = read_excel_url(url)
- read_excel_url() を呼び出してWeb上のExcelを読み込み
- 取得結果はPandasのDataFrameとして data に入れる
読み込みチェック & 保存
if data is not None:
print(data.head())
save_to_csv(data, save_path)
-
読み込みに失敗していないかを確認
-
成功していれば head() で先頭5行を表示(確認用)
-
CSVファイルとして保存
read_excel_url 関数の解説
def read_excel_url(url):
try:
df = pd.read_excel(url)
return df
except Exception as e:
print(f"Error reading the Excel file: {e}")
return None
-
pd.read_excel(url) : Web上のExcelを読み込み、DataFrameに変換
-
変数 df に入れて return で呼び出し元(main())に渡す
-
try-except で失敗時もプログラムが止まらず、None を返す
補足:デバッグ中は try-except を一時的にコメントアウトして、エラーの内容を直接確認するのもおすすめです。
save_to_csv 関数の解説
def save_to_csv(stock_code, file_name):
try:
stock_code.to_csv(file_name, encoding="utf-8-sig", index=False)
print(f"Data saved to {file_name}")
except Exception as e:
print(f"Error saving to CSV: {e}")
-
to_csv(..., encoding="utf-8-sig") : 日本語が文字化けしないように指定
-
index=False : 不要な行番号を保存しない
-
try-except : 保存エラーが出ても原因を表示して処理が止まらないようにする
まとめ
-
プログラムは 3つの関数とif文 で構成されている
-
main() で全体の流れをまとめ、if _ _ name_ _ == "_ _ main_ _": で使い分け
-
関数化しておくことで 他のプログラムから再利用できる
-
read_excel_url() : Excelを取得
-
save_to_csv() : CSVに保存
取得した銘柄コードです。 B列にコードが表示されています。
yfinanceから、このコードを使って、株価を取得できるようになります。