今回はPandasのresample()
という関数を使って株価データなどの時系列データを月/日/時ごとに再集計する方法について紹介したいと思います。
pandas_datareaderでデータを用意する
まずはデータを用意します。もう既にある場合は別にこれでなくともかまいません。
# ライブラリのインポート import pandas_datareader.data as web import datetime # 日経平均株価を取得する start = '1996-4-1' end = '2019-4-1' nikkei = web.DataReader('^N225', 'yahoo', start, end) df = nikkei.copy()
pandas-datareaderをインストールしていない場合はコマンドプロンプトなどからPIPでインストールしてください。
# pandas-datareaderをインストールする
pip install pandas-datareader
関連記事:【Python】pandasを使って日経平均株価のデータをスクレイピングで取得する
取得したデータを確認する
データが取得出来たら、まずが異常値がないか確認します。
# データに欠損値がないか確認する df.isnull().any(axis=0)
欠損値を確認する関数であるisnull()の後ろにany(axis=0)と指定することで列ごとに欠損値がないかを返すように設定しています。axis=1にすると行になります。
High False Low False Open False Close False Volume False Adj Close False dtype: bool
全ての列がfalseと返ってきているおり、欠損値がないことがわかるので、特に欠損値処理はしません。
時系列データを一定期間(月/週/時/分)ごとに再集計する
いよいよ今回の本題に入っていきます。pandasでは、データフレームのインデックスをdatetimeにしておくことで、resample()
という関数を使用して集計することが可能です。pandasでの時系列データ処理ではresample()
は超便利なので絶対に覚えておきましょう。
それではresample()
を使用して先ほどの株価データを再集計してみます。
#日ごとに再集計する df.resample('D').mean()
今回の場合はデータが既に一日ごとにまとめられているので、使用しませんが、分時単位のデータとかを一日分ごとにデータのまとめるときとかに重宝します。
#週ごとに再集計する df.resample('W').mean()
<実行結果>
Date High Low Open Close Volume Adj Close
1996-04-07 21690.073828 21432.056250 21522.628125 21558.440234 0.0 21558.440234
1996-04-14 21781.271875 21581.612109 21675.159766 21663.001953 0.0 21663.001953
1996-04-21 21956.631641 21749.537891 21823.351953 21852.753906 0.0 21852.753906
#月ごとに再集計する df.resample('M').mean()
<実行結果>
Date High Low Open Close Volume Adj Close
1996-04-30 21936.505580 21732.291946 21810.289528 21828.725353 0.000000 21828.725353
1996-05-31 21917.828869 21631.406901 21782.001395 21770.738095 0.000000 21770.738095
1996-06-30 22297.111035 22077.245508 22172.985547 22185.516113 0.000000 22185.516113
1996-07-31 21705.521739 21456.902599 21630.849609 21558.508152 0.000000 21558.508152
mean()
(平均値)だけではなく、median()
(中央値)、sum()
(合計)などのメソッドを呼ぶことで集約された値が算出されます。加えて、引数は’D’や’M’や’W’だけでなく、’6H’や’2Dみたいな感じで指定することも可能です。
終わり
ほかにもPandasには、ohlc()
やrolling()
など関数1つで簡単にできるのがいろいろあります。Python&Pandasでの時間処理系関数は知っているか知らないかだけで作業に大きな差が出てくるので知っておくようにしておきたいですね。
知らないでfor文とかで地道にやろうとするとスクリプト言語なのででかいデータの処理だと地獄を見ます(笑)。
コメント
[…] 関連記事:【Python】pandasのresample()で株価データを月/日/時ごとに再集計 […]