/Python/Pandasで時系列データを月毎に集計する方法2020.01.26Python/Pandasで時系列データを月毎に集計する方法TweetPandasは機械学習の入力データ前処理で重宝されるPythonのライブラリです。)する方法を紹介します。wat(@watlablog)です。data)とは、直訳すると時間によって変化するデータの総称です。毎日の気温といった気象情報、株価や外国為替といった金融情報等あらゆるデータ種があてはまります。振動実験に代表されるような時間刻みのオーダーがmsやμsのデータも時系列データと呼びますが、このページでは日(day)、月(month)、年(year)といったタイムスタンプで記録されたデータを扱います。タイムスタンプ(Timestamp)とは、ある出来事が発生した日付や時刻を示す文字列のことです。古くは郵便屋さんが郵便物に押印することで発送の証明に使っていたのでスタンプという名称が付いているそうですが、現在ではコンピュータ用語としても広く知られています。タイムスタンプで記録された時系列データのメリットは、なんといっても年、月といったある程度の期間で集計可能であることにあります。このような「期間」でデータを分析する例としては毎月の予算管理や各種月度報告が挙げられます。時系列データを分析することで、何かしらの施策を打った時の効果が変化として現れたかどうかを調べたり、分析結果から今後どうすべきかといった未来の行動の決定判断をしたりすることが可能です。Excel等の表計算ソフトの場合、あらかじめマクロや計算式を用意しておけばグラフ化まで容易に処理することもできますが、Python等のプログラミング言語でできるようにしておくと各種ライブラリを併用したり、機械学習に利用したりと活用の幅が拡がります。このページではタイムスタンプを利用した集計コードの例を紹介します。年月日のタイムスタンプ例を以下に示します。年の順番は日本と欧米で異なったり、月を英単語の略で表現したりと様々なフォーマットがあります。2020-Jan-05ちなみに、これらのタイムスタンプは以下のコードのようにpd.to_datetimeで簡単に文字列からPandasで扱えるTimestamp型に変換することができます。pd.to_datetime(df['date4'])print(df)print(type(df.iloc[0,0]))このコードを実行すると、コンソールに以下の結果が表示されます。全てのデータが「year-month-day」に変換されました。'pandas._libs.tslibs.timestamps.Timestamp'>今回のサンプルデータ:Googleトレンド今回サンプルとして使用するデータは、Googleトレンドで得た主な機械学習フレームワークの検索インタレストデータです。検索インタレストとは、値が高ければGoogle検索回数が多かったことを示す、一種の傾向分析用のデータです。今回はGoogleトレンドからダウンロードしたcsvを以下のように少し加工したファイルを使います。GoogleトレンドのデータはPandas標準のタイムスタンプフォーマットの文字列が使われています。これをそのままmatplotlibでプロットすると...特にこれでも問題ないかも知れませんが、毎日の細かい変動成分が多く、ごちゃごちゃして見難いですね。今回はこのデータを月毎に集計します。Pandasの基本操作Pandasの基本操作は「Python/Pandasの基本操作!データフレーム行列の取扱い」にまとめています。Pandasに不慣れな方は、是非こちらの記事も参考にしてみて下さい。Pandasで月毎に集計するコード全コード詳細説明の前に、全コードを以下に示します。基本的には先ほど紹介したPandas基本操作の記事に記載の内容ばかりです。上記コードを実行すると以下のグラフがプロットされます。月毎の総和を集計することでPyTorchの躍進という要点を表現した非常に見易い結果となりました(...なりましたよね?)。集計に使う要素をインデックスに登録するここはやり方が色々あると思いますが、僕の場合は以下のコードで、まず「年」と「月」の要素をパースしてマルチインデックスに登録しました。インデックスの名前を付けるこの時点のdfの中身は以下になります。左のインデックスが3列になっています。11月の集計をする以下のコードの.sumで総和を集計しています。他にも.max、.min、.meanといった基本的な統計量も集計することが出来ます。'month')と2種類のレベルを同時に指定しています。月で集計するからといって'month'だけにすると、2015年1月も2016年1月も全て1月として集計されてしまうので、2つ設定することが重要です。年月単位で平均を集計する集計結果プロットの横軸を作るレベルを設定して集計すると、date列が無くなります。matplotlibでグラフにプロットするためには横軸が必要なので、以下のコードで横軸を作成しています。横軸はタイムスタンプにするため、先ほど生成したyearとmonthを一度.astypeで文字列に変換し、文字列として.str.catで結合してから.to_datetimeでタイムスタンプに変換しています。sep='-'))まとめ本ページでは時系列データの概要と集計のメリット、タイムスタンプの例を説明し、Pandasで月毎に集計する方法の例を紹介しました。使いこなせばExcelよりも高速なデータ処理ができると考えられ、これから様々なデータセットに対しても使っていける内容と思います。集計SNSでもご購読できます。技術系の職に就き日々実験やシミュレーションを使う仕事をしています。このブログでは初心者が科学技術プログラムを作れるようになることを目標に、学習結果を記録していきます。*メールアドレス(公開はされません。*次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。