Pythonでデータフレームの調整済み・未調整EWM(指数加重移動平均)を計算する方法
pandasでは、ewm()メソッドを使うことで、欠損値(NaN)を含むデータフレームに対しても指数加重移動平均(EWM:Exponentially Weighted Mean)を簡単に計算できます。この記事では、調整済み(adjust=True)と未調整(adjust=False)の2種類のEWMを計算する方法を解説します。
期待される出力
あるデータフレームに対して、調整済みと未調整それぞれのEWMを計算すると、結果は以下のようになります。
adjusted ewm:
Id Age
0 1.000000 12.000000
1 1.750000 12.750000
2 2.615385 12.230769
3 2.615385 13.425000
4 4.670213 14.479339
non adjusted ewm:
Id Age
0 1.000000 12.000000
1 1.666667 12.666667
2 2.555556 12.222222
3 2.555556 13.407407
4 4.650794 14.469136解決手順
以下の手順に従って問題を解決していきます。
- まず、対象となるデータフレームを定義します。
- 減衰係数(com)を0.5として、
df.ewm(com=0.5).mean()を使って調整済みEWMを計算します。
df.ewm(com=0.5).mean()
- 同様に、
adjust=Falseを指定したdf.ewm(com=0.5, adjust=False).mean()を使って未調整EWMを計算します。
df.ewm(com=0.5, adjust=False).mean()
補足:adjustパラメータの違い
adjust=True(デフォルト)は重みを初期時点まで遡って正規化して計算する方式で、adjust=Falseは再帰的な式で逐次計算する方式です。どちらも欠損値は自動的にスキップされ、直前の有効な値から計算が続行されます。
サンプルコード
import numpy as np
import pandas as pd
df = pd.DataFrame({'Id': [1, 2, 3, np.nan, 5],
'Age': [12, 13, 12, 14, 15]})
print(df)
print("adjusted ewm:\n", df.ewm(com=0.5).mean())
print("non adjusted ewm:\n", df.ewm(com=0.5, adjust=False).mean())実行結果
Id Age
0 1.0 12
1 2.0 13
2 3.0 12
3 NaN 14
4 5.0 15
adjusted ewm:
Id Age
0 1.000000 12.000000
1 1.750000 12.750000
2 2.615385 12.230769
3 2.615385 13.425000
4 4.670213 14.479339
non adjusted ewm:
Id Age
0 1.000000 12.000000
1 1.666667 12.666667
2 2.555556 12.222222
3 2.555556 13.407407
4 4.650794 14.469136このように、ewm()メソッドのadjust引数を切り替えるだけで、2つの異なる計算方式の指数加重移動平均を柔軟に取得できます。時系列データの平滑化やトレンド分析などにぜひ活用してください。
-
PythonでPandas Seriesのすべての要素を四捨五入する方法
PandasのSeriesに含まれる浮動小数点数を四捨五入したい場面はよくあります。本記事では、Seriesのすべての要素を丸めるための2つの方法を、具体的なコード例とともに解説します。入力データと期待される出力まず、以下のようなSeriesが与えられていると仮定します。0 1.3 1 2.6 2 3.9 3 4.8 4 5.6これらの値を四捨五入すると、次の出力が得られます。0 1.0 1 3.0 2 4.0 3 5.0 4 6.0方法1:round()メソッドを使うPandasのSeriesには、数値を丸めるためのround()メ
-
Pythonで数Nの桁数を数えるプログラムの書き方
ある数Nが与えられたとき、その数に含まれる桁の総数を求めることを考えましょう。例えば以下のようなケースです。入力例1:N = 891452出力:6解説: 与えられた数891452は6桁の数字で構成されているため、この場合は「6」を返します。入力例2:N = 0074515出力:5解説: 先頭の0を除いた有効な桁数が5桁であるため、出力は「5」となります。この問題を解くためのアプローチこの問題は、次の手順で解決できます。数値nを入力として受け取ります。関数countDigits(n)が入力nを受け取り、桁数をカウントして返します。数値の各桁に対してループ処理を行い、カウンター変数を1ずつ増加させ