※超初心者向けの記事です。
仕事で時系列データの集計をやる機会があってPythonで行ったのでまとめます。
タイトルのようにデータ分析でよく使いそうな操作を行いつつ時系列データの集計を行います。
#この記事の目的
・時系列データを集計する
実際はFileMakerからレコードのExcelファイルでエクスポートし少し加工を加えてPythonに読み込ませて行いました。
日付ごとに作成されるデータ、例えば検査数やオペ数の月毎・年毎の集計が一瞬で終わります。
読み込むデータを代えるといろんな集計が簡単に行えるかと思います。
#環境
・Python 3.8.5
#テストデータ
今回は2015/1/1~2020/12/1までのある検査のcsvファイルを用意しました。
1ヶ月毎に1件検査をしたという感じにしました。
#ライブラリのインポート
まずはよく使うライブラリをインポートします。
(今回使わないライブラリが混在しています)
計算と可視化はデータ分析する際は必ずと言っていいほど使うので何かに保存しておいてコピペすると良いです。
#計算系
import pandas as pd
import numpy as np
#可視化系
import matplotlib.pyplot as plt
import matplotlib as mpl
import seaborn as sns
%matplotlib inline
#データの読み込み
csvでもExcelでも良いかと思います。
今回は感覚的に馴染みのあるDataFrameの形(イメージとしてはExcelのようなスプレッドシート)で読み込んでいます。
Excelの場合は引数にsheet_nameを指定するとシート番号(0始まり)やシート名で指定することができます。
#csvの読み込み
df = pd.read_csv('/パス名/ファイル名.csv')
# Excelファイルの読み込み
df = pd.read_excel('/パス名/ファイル名.xlsx' , sheet_name=シートの番号or'シート名')
#読み込みの確認とデータの型の確認
※ jupyterなどで使う場合は1行ごとに実行してください。
#先頭の行を表示
df.head()
#データの型を確認
df.dtypes
1列目に日付、2列目に種類(今回は検査)という値が入力されています。
#指定の文字列を整数の1に置き換える
集計するためには指定の文字列をカウントするのもありですが、今回集計する方法では数値をカウントするようなので、検査の列を整数の「1」に置き換える作業が必要となります。
df.replace('検査', 1, inplace=True)
#日付の列をdatetime型に変換し、indexに指定する
#ライブラリのインポート
import datetime
#1列目をdatetime型でindexにする
#dayの列をdatetime型にする
df['date']=pd.to_datetime(df['date'])
#date列をindexに割り当てる
df.set_index('date', inplace=True)
#集計
最後にExcelファイルで書き出すために新しいDateFrameを作成しています。
#年毎に集計
df2 = df.resample(rule='Y').sum().head()
#可視化
# グラフ作成
fig = plt.figure(figsize=(10,5))
plt.title('Title')
plt.ylabel('Y Label')
plt.xlabel('Year')
plt.plot(df2['type'])
plt.show()
今回は1ヶ月毎に1件の検査を行ったという体のデータセットなので1年毎に12件でこんな感じのグラフになります。
(X軸が変ですが)
#Excelファイルの書き出し
凝ったグラフを作成したい場合や集計結果を共有・保存する場合は大抵の人が見れて使えるExcelファイルなどに保存しておくと良いでしょう。
import openpyxl
#to_excelでdfを書き出し
df2.to_excel('任意のファイル名.xlsx')
#おまけ
可視化した画像の保存。画像を用いて資料を作るときに便利です。
fig.savefig("任意のファイル名.png")
#参考文献・サイト
・pandas.DataFrame, Seriesの要素の値を置換するreplace/note.nkmk.me
"https://note.nkmk.me/python-pandas-replace/"
・pandasで時系列データの曜日や月、四半期、年ごとの合計や平均を算出/note.nkmk.me
"https://note.nkmk.me/python-pandas-time-series-multiindex/"