Python/Pandasで時系列データを月毎に集計する方法

  • このエントリーをはてなブックマークに追加
Advertisements

Pandasは機械学習の入力データ前処理で重宝されるPythonのライブラリです。ここではPandasデータフレームで読み込んだタイムスタンプ付きの時系列データを月毎に集計(合計・平均・最大値・最小値)する方法を紹介します。

こんにちは。wat(@watlablog)です。今回は時系列データ処理として、Pandasの月毎の集計方法を学びます

時系列データの概要とサンプルデータ説明

時系列データとは?

時系列データTime-series data)とは、直訳すると時間によって変化するデータの総称です。

例えば毎日の気温といった気象情報、株価や外国為替といった金融情報等あらゆるデータ種があてはまります。

振動実験に代表されるような時間刻みのオーダーがmsやμsのデータも時系列データと呼びますが、このページではday)、month)、year)といったタイムスタンプで記録されたデータを扱います。

タイムスタンプTimestamp)とは、ある出来事が発生した日付や時刻を示す文字列のことです。

古くは郵便屋さんが郵便物に押印することで発送の証明に使っていたのでスタンプという名称が付いているそうですが、現在ではコンピュータ用語としても広く知られています。

タイムスタンプで記録された時系列データのメリットは、なんといっても年、月といったある程度の期間で集計可能であることにあります。

このような「期間」でデータを分析する例としては毎月の予算管理や各種月度報告が挙げられます。時系列データを分析することで、何かしらの施策を打った時の効果が変化として現れたかどうかを調べたり、分析結果から今後どうすべきかといった未来の行動の決定判断をしたりすることが可能です。

Excel等の表計算ソフトの場合、あらかじめマクロや計算式を用意しておけばグラフ化まで容易に処理することもできますが、Python等のプログラミング言語でできるようにしておくと各種ライブラリを併用したり、機械学習に利用したりと活用の幅が拡がります。

このページではタイムスタンプを利用した集計コードの例を紹介します。

タイムスタンプの例

年月日のタイムスタンプ例を以下に示します。年の順番は日本と欧米で異なったり、月を英単語の略で表現したりと様々なフォーマットがあります。

ちなみに、これらのタイムスタンプは以下のコードのようにpd.to_datetimeで簡単に文字列からPandasで扱えるTimestamp型に変換することができます。

このコードを実行すると、コンソールに以下の結果が表示されます。全てのデータが「year-month-day」に変換されました。

今回のサンプルデータ:Googleトレンド

今回サンプルとして使用するデータは、Googleトレンドで得た主な機械学習フレームワークの検索インタレストデータです。

検索インタレストとは、値が高ければGoogle検索回数が多かったことを示す、一種の傾向分析用のデータです。

今回はGoogleトレンドからダウンロードしたcsvを以下のように少し加工したファイルを使います。

GoogleトレンドのデータはPandas標準のタイムスタンプフォーマットの文字列が使われています。

google trend data

これをそのままmatplotlibでプロットすると…

Googleトレンドのデータ

特にこれでも問題ないかも知れませんが、毎日の細かい変動成分が多く、ごちゃごちゃして見難いですね。

今回はこのデータを月毎に集計します。

Pandasの基本操作

Pandasの基本操作は「Python/Pandasの基本操作!データフレーム行列の取扱い」にまとめています。まだPandasに不慣れな方は、是非こちらの記事も参考にしてみて下さい。

Pandasで月毎に集計するコード

Advertisements

全コード

詳細説明の前に、全コードを以下に示します。
基本的には先ほど紹介したPandas基本操作の記事に記載の内容ばかりです。

実行結果

上記コードを実行すると以下のグラフがプロットされます。

実行結果

月毎の総和を集計することでPyTorchの躍進という要点を表現した非常に見易い結果となりました(…なりましたよね?)。

コード説明

集計に使う要素をインデックスに登録する

ここはやり方が色々あると思いますが、僕の場合は以下のコードで、まず「年」と「月」の要素をパースしてマルチインデックスに登録しました。

この時点のdfの中身は以下になります。左のインデックスが3列になっています。

月の集計をする

以下のコードの.sumで総和を集計しています。他にも.max、.min、.meanといった基本的な統計量も集計することが出来ます。ここで、引数にlevel=('year', 'month')と2種類のレベルを同時に指定しています。

月で集計するからといって'month'だけにすると、2015年1月も2016年1月も全て1月として集計されてしまうので、2つ設定することが重要です。

集計結果プロットの横軸を作る

レベルを設定して集計すると、date列が無くなります。matplotlibでグラフにプロットするためには横軸が必要なので、以下のコードで横軸を作成しています。

横軸はタイムスタンプにするため、先ほど生成したyearとmonthを一度.astypeで文字列に変換し、文字列として.str.catで結合してから.to_datetimeでタイムスタンプに変換しています。

まとめ

Advertisements

本ページでは時系列データの概要と集計のメリット、タイムスタンプの例を説明し、Pandasで月毎に集計する方法の例を紹介しました。

使いこなせばExcelよりも高速なデータ処理ができると考えられ、これから様々なデータセットに対しても使っていける内容と思います。

こんなに簡単に集計処理ができるとは思ってなかったので、かなり驚いています!Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*