Python

Python基礎:rolling( )を使って移動平均を求める

スポンサーリンク

はじめに

今回も事例列データを扱う際によく利用する処理をみていきます。rolling( )メソッドです。

rolling関数は窓関数と呼ばれるものを指定した要素の数の幅だけ適用する関数となっており、窓関数を適用することでそれぞれの要素に重みがついたものがそれぞれの要素に格納されています。

https://deepage.net/features/pandas-rolling.html

サンプルデータの作成

今回も、前回で作成したデータを利用することにしましょう。

# ライブラリのインポート
import pandas as pd
import random

# 日付データの作成
dates=pd.date_range('2020-09-01','2020-09-30')
# アクセスデータの作成
access_list=[random.randint(5000, 20000) for i in range(len(dates))]

# データフレームの作成
df_webdata=pd.DataFrame({'日付':dates,'アクセス数':access_list})
df_webdata.head()

rolling( ) メソッド

今回はrolling( )メソッドを使って、移動平均を求めてみることにしましょう。まずは、rolling( )メソッドの基本的な使い方を整理しましょう。

<rolling()メソッドの基本的な使い方>

  • 引数window:window幅を指定
  • 引数center:windowの中心に結果の値を格納:
  • 引数min_periods:データの最小個数を指定

となります。やってみた方がわかりやすいかと思います。引数windowは引数の名前を省略することができます。今回はwindow=3の場合とします。

df_webdata['アクセス数'].rolling(3)

このようにrolling( )メソッドを適用しただけでは何か値が返されるわけではなく、window.Rolling型のメソッドが返されます。これに適用したいメソッドを指定していきます。

df_webdata['移動平均']=df_webdata['アクセス数'].rolling(3,min_periods=3).mean()
df_webdata.head(10)

window幅を3にしており、計算に必要なデータ数を3としているので、はじめの2つのデータは計算されません。3つ目は前の2つと合わせた3つのデータで平均を計算した結果が格納されています。これはdefaultでは引数centerがFalseであるため、前の2つのデータを合わせた処理がされています。center=Trueを指定すると、前後2つと合わせた3つのデータでの処理結果が格納されるようになります。

df_webdata['移動平均(center)']=df_webdata['アクセス数'].rolling(3,min_periods=3,center=True).mean()
df_webdata.head(10)

今度は、2つ目にも値が計算されています。これは、1つ目、3つ目と合わせた3つのデータで計算しているからです。

せっかくなので可視化しておきましょう。7日間の移動平均をもとめてプロットしてみます。

# ライブラリのインポートと初期設定
import matplotlib.pyplot as plt
import japanize_matplotlib
import seaborn as sns
sns.set_style('whitegrid',{'grid.linestyle':'--'})
%matplotlib inline

# 7日間移動平均の計算
df_webdata['移動平均7(center)']=df_webdata['アクセス数'].rolling(7,min_periods=5,center=True).mean()

# 可視化
plt.figure(figsize=(12,4))
plt.plot(df_webdata['アクセス数'],label='アクセス数')
plt.plot(df_webdata['移動平均7(center)'],label='7日間移動平均')
plt.legend()
スポンサーリンク

まとめ

いかがでしたか?時系列データのおいては、長期的な傾向をつかむために、ある一定区間ごとの平均を区間をずらしながら求める、「移動平均」をプロットすることがよくありますね。

コメント

タイトルとURLをコピーしました