ここでは「Python」をコマンドプロンプト環境下使用し、株価情報をPandasを用いて取得する方法を紹介します。
この記事を読むことで
pandasを使った株価情報の取得方法
head()、tail()メソッドの使い方
to_numeric()、dropna()メソッドの使い方
などを学ぶことができます。
株価情報をサイト内で見るときに、表(テーブル)で表示されているサイトもありますよね。
今回はこの表(テーブル)から株価情報をPythonで取得していきます。
Python の動作環境とパッケージのDL
最初に今回Pythonを使用する上での動作環境と使用するパッケージのインストールについて記載します。
Pythonをコマンドプロンプトで動作
この記事ではPython をコマンドプロンプト(cmd)にて動作させています。
Windowsの方なら、画面左下の検索窓に「コマンドプロンプト」または「cmd」を入力することでコマンドプロンプトアプリが起動できます。
Pythonのインストールおよびコマンドプロンプトの細かな使い方については、割愛します。
※当サイトでは「C:¥code」と「Cドライブ直下」に「code」というファイルにPython ファイルを入れて、実行させています。
したがって、パッケージ等はすべて「pip install」を使用します。
また、Python ファイルの実行ですがコマンドプロンプト内で
とコマンド入力して実行させます。
コマンドプロンプトで結果を表示させるため、print文を多用している点もご理解いただけると幸いです。
スクレイピングに必要なPython パッケージをDL
続いて、Python に必要なパッケージである
をインストールしていきます。
「pip install beautifulsoup4 lxml html5lib」
は3つのパッケージを1つのpipで一度にインストールしているだけで
と記述していることは変わりません。
「lxml」はXpathで特定の要素を指定できるなどHTMLを扱うために使用するPython ライブラリの一つです。
「html5lib」はHTMLを解析するための標準ライブラリになります。
今回はサイト読み込みのために
というPython のコードを使用できるようにするためにこれらをpipでインストールします。
PythonのPandasを使い株価情報を取得する
下準備ができたら、実際にyahoo!financeからPython のPandasを使って株価情報を解析していきます。
read_htmlを使いサイト情報を解析する
まずはpandasをPythonでインポートします
続いて、yahoo! financeからダウ平均株価の毎月の株価情報を取得していきます。
yahoo! financeの公式ページの検索窓に「^DJI」と打ち込み
Historical Data
Frequency : Monthly
として毎月の「ダウ平均株価」の株価情報を表示させます。
※分析する銘柄は各自お好みで
このページまで進めたら、このページのURLをコピペしてPython 内の「url引数」に格納します。
続いて、read_html()を使い
ページの読み込みと、表内のデータ説明語句を取得します。
header=0は表の「High」、「Low」といった列名を取得しています。
あとはprint文を使いページをコマンドプロンプトに表示させます。
stock.py
import pandas as pd url = "URLをコピペ" #ページの読み込み&最初のデータ説明取得 df = pd.read_html(url,header=0) print(df[0].head()) print(df[0].tail())
今回はデータの先頭・末尾の行を返す「head()」、「tail()」メソッドを使い株価データを取得します。
このPython プログラムを実行すると
のようになりました。
見にくいかもしれませんが、head()メソッドで取得した株価データはしっかりとコマンドプロンプトで表示されています。
一方、tail()メソッドで取得した株価データは100行目に
と変な文字列が入ってしまいました。
Python では取得した文字列を数値に変換するメソッドや、行を削除するメソッドがあるのでこれらを使って、上記の変な文字列を無くしていきます。
Python で文字列が入っている行の削除を行う
Python には文字列を数値に変換する「to_numeric()」メソッドと、NaNが含まれている行を削除する「dropna()」メソッドがあります。
よって、これらを使って文字列を含む行を削除します。
まずは四本音などから適当に文字列を含む列名を選び、その列名に文字列を含む場合、「NaN」に変換するPython の記述を書きます。
ここでは四本音のなかから終値である「Close*」を選びました。
# 文字列(終値)「Close*」を数値「NaN」に変換
df[0][“Close*”] = pd.to_numeric(df[0][“Close*”],errors=”coerce”)
to_numeric()メソッドの説明は下記Qiitaのサイトで詳しく説明されています。
Qiita:pandas.DataFrameの型を変えたいけど例外レコードがあってastypeできない時の対処法
続いて、NaNが含まれている行を削除する「dropna()」メソッドを使用します。
# NaNが含まれている行を削除
df[0].dropna(inplace=True)
と記述するとNaNが含まれている行を削除してくれます。
これらをprint()文の前に記述して実行すると
と文字列を含む行を削除することができました。
これをcsvファイルに書き出したり、表やグラフにすると面白そうだと思います。
参考にしたサイト
note.nkmk.me:python,pandasでwebページの表をスクレイピング
Qiita:pandas.DataFrameの型を変えたいけど例外レコードがあってastypeできない時の対処法
DeepAge:Pandasでnan値を削除、穴埋めするfillna、dropnaの使い方
また当サイトでは、IBM Watsonを使ったPythonによる「画像分析」なども紹介しているので興味がある方は挑戦してみてください。
お疲れ様でした。