Pandas の GroupBy オブジェクトの便利なローリング関数の紹介
- パンダのローリングとローリング ウィンドウ
- ローリング ウィンドウ機能
-
dataframe.rolling()
関数の構文と作業プロセス - Pandas の GroupBy オブジェクトの便利なローリング関数
-
Pandas の GroupBy オブジェクトに
rolling().sum()
関数を使用する -
Pandas の GroupBy オブジェクトに
rolling().mean()
関数を使用する -
Pandas の GroupBy オブジェクトの複数の列で
rolling().agg()
関数を使用する
今日は、Pandas のローリング ウィンドウ機能とローリング ウィンドウ機能の違いについて説明します。 ローリング ウィンドウ機能、その構文、およびその作業プロセスについて学習し、Pandas のオブジェクトによるグループのさまざまな ローリング
関数を示すさまざまなコード例を紹介します。
パンダのローリングとローリング ウィンドウ
Python にはさまざまなデータ中心のライブラリ/パッケージがあり、Pandas はその 1つです。 このライブラリのさまざまな便利な関数を使用しますが、そのうちの 1つは rolling()
関数として知られています。
dataframe.rolling()
関数は、提供されたデータに対して複雑な計算を実行します。 また、ローリング ウィンドウと呼ばれる機能も備えており、このセクションですぐに例を示します。
ローリング ウィンドウ機能は、主に時系列および信号処理データで機能します。 これを使用して、特定のオブジェクト シリーズで提供された入力データに対して計算を実行します。
たとえば、w
がウィンドウ サイズで t
が時間であると仮定すると、時間 t
でウィンドウ サイズ w
を取得して、データに必要な数学的操作を適用できます。 ウィンドウ サイズ w
は、時間 t
における w
個の連続した値を意味します。 覚えておいてください、すべての w
値は時間 t
で等しく重み付けされます。
ローリング ウィンドウ機能
ローリング ウィンドウとは、指定された日付からローリング ウィンドウ シフトまで、提供されたデータに対して計算を実行することを意味します。 たとえば、すべてのスタッフ メンバーは 1 か月のローリング ウィンドウにあり、毎年の毎月 1 日に給与を受け取ります。
最初の給与は 1 月 1 日、2 回目は 2 月 1 日、3 回目は 3 月 1 日です。 このプロセスは、すべてのスタッフが 12 月 1 日に 12 回目の給与を受け取るまで続きます。 このプロセスは毎年繰り返されます。
したがって、ローリング ウィンドウ機能は、最初に指定された日付に相対的であり、指定されたローリング ウィンドウ時間で自動的に前進すると言えます。 このシナリオでは、1 か月のローリング ウィンドウです。
ローリング ウィンドウのサイズは固定ですが、エキスパンド ウィンドウの開始点は固定されているだけです。 利用可能な場合は、拡張してデータを組み込むことができます。 違いは こちら で確認できます。
dataframe.rolling()
関数の構文と作業プロセス
dataframe.rolling()
関数は、ローリング ウィンドウ カウントの要素を提供します。 dataframe.rolling()
の概念は、ユーザーが加重ウィンドウ サイズ (w
) を 1 回だけ指定し、いくつかの操作を行う一般的なローリング ウィンドウと同じです。
dataframe.rolling()
の構文は次のとおりです。
DataFrame.rolling(window, min_periods=None, freq=None, center=False, win_type=None, on=None, axis=0, closed=None)
次のパラメータを取ることができます。
パラメータ | 説明 |
---|---|
window |
移動ウィンドウのサイズです。 計算に使用されることになっているいくつかの値/観測値があります。 |
min_periods |
値が必要なウィンドウ内の値/観察の最小数を示します。 それ以外の場合、出力は NA になります。 |
freq |
統計を計算する前にデータを確認するために使用する DateOffset オブジェクトまたは文字列頻度として指定されます。 |
center |
center パラメータは、すべてのラベルをウィンドウの中央に設定します。 |
win_type |
window タイプを指定します。 |
on |
これは、インデックスの代わりにローリング ウィンドウを決定することになっているデータ フレーム列に使用されます。 |
closed |
右端、左端、どちらも端点、または両方の端点で間隔を閉じます。 |
axis |
デフォルトでは 0 ですが、int または string にすることができます。 |
Pandas の GroupBy オブジェクトの便利なローリング関数
rolling()
関数の使用法を学習するには、いくつかのサンプル データを含むデータ フレームが必要です。 次のようなデータフレームがあります。 同じものを使用することもできます。
コード例:
import pandas as pd
n = range(0, 6)
id = ["a", "a", "a", "b", "b", "b"]
df = pd.DataFrame(zip(id, n), columns=["id", "n"])
df.set_index("id", inplace=True)
df
出力:
| id | n |
| ---- | ---- |
| a | 0 |
| a | 1 |
| a | 2 |
| b | 3 |
| b | 4 |
| b | 5 |
上記のコード スニペットでは、データ フレームを操作するために pandas
ライブラリをインポートしました。 次に、range()
関数を使用して一連の数値を取得しました。 デフォルトでは、0 から始まり、指定された数の前で終わり、1 ずつ増加します。
range()
関数の start
、stop
、および step
パラメータのデフォルト値を変更できます (必要に応じて)。 次に、データと列名のリストを取得する pd.DataFame()
を使用してデータ フレームに変換した id
という名前のリストがあります。
ここで、zip()
関数はゼロ以上の iterable を受け取り、すべての iterable から値をマップし、単一の iterator オブジェクトを返します。 set_index()
は id
をインデックスとして作成するために使用されますが、inplace
属性は、True
に設定されている場合、データ フレーム内で変更が有効になることを意味します。
Pandas の GroupBy オブジェクトに rolling().sum()
関数を使用する
コード例:
df_rolling_sum = df.groupby("id")["n"].rolling(2, min_periods=1).sum()
df_rolling_sum
出力:
| id | id | |
| ---- | ---- | ---- |
| a | a | 0.0 |
| | a | 1.0 |
| | a | 3.0 |
| b | b | 3.0 |
| | b | 7.0 |
| | b | 9.0 |
ここでは、groupby()
関数を使用して、特定の値のグループを作成し、それらに対して操作を実行しました。 この機能は、オブジェクトを分割し、必要な操作を適用し、それらを結合してグループを作成します。
上記のコード行は、min_periods=1
で 2
のウィンドウ長を実行し、列 n
で合計を実行します。 rolling().sum()
を使用した出力を理解するには、次のスクリーンショットを参照してください。
Pandas の GroupBy オブジェクトに rolling().mean()
関数を使用する
コード例:
df_rolling_mean = df.groupby("id")["n"].rolling(2, min_periods=1).mean()
df_rolling_mean
出力:
| id | id | |
| ---- | ---- | ---- |
| a | a | 0.0 |
| | a | 0.5 |
| | a | 1.5 |
| b | b | 3.0 |
| | b | 3.5 |
| | b | 4.5 |
この例は、mean()
の違いを除いて、rolling().sum()
を使用していた前のコード フェンスに似ています。 ここでは、合計を値の数で割ることによって計算されたウィンドウ内の 2つの値の平均を計算しています。
以下の画像を見て理解してください。
各グループの最初の値は、それより前に値がないため、出力列にそのまま表示されますが、min_periods
パラメータを省略すると、NaN
になります。 次の例を参照してください。
コード例:
df_rolling_mean = df.groupby("id")["n"].rolling(2).mean()
df_rolling_mean
出力:
| id | id | |
| ---- | ---- | ---- |
| a | a | NaN |
| | a | 0.5 |
| | a | 1.5 |
| b | b | NaN |
| | b | 3.5 |
| | b | 4.5 |
Pandas の GroupBy オブジェクトの複数の列で rolling().agg()
関数を使用する
コード例:
import pandas as pd
n1 = range(0, 6)
n2 = range(0, 6)
id = ["a", "a", "a", "b", "b", "b"]
df = pd.DataFrame(zip(id, n1, n1), columns=["id", "n1", "n2"])
df.set_index("id", inplace=True)
df_rolling_mean_sum = (
df.groupby("id").rolling(2, min_periods=1).agg({"n1": "sum", "n2": "mean"})
)
print(df_rolling_mean_sum)
出力:
| id | id | n1 | n2 |
| ---- | ---- | ---- | ---- |
| a | a | 0.0 | 0.0 |
| | a | 1.0 | 0.5 |
| | a | 3.0 | 1.5 |
| b | b | 3.0 | 3.0 |
| | b | 7.0 | 3.5 |
| | b | 9.0 | 4.5 |
ここでは、n1
と n2
の 2つの列があり、agg()
メソッドを使用して、n1
に sum
を、n2
に mean
を適用します (上記の出力に示されているように)。 )。
DataFrame.cumsum()
関数を使用して、Pandas の GroupBy オブジェクトのローリング サムを取得する
ここで、次のようなローリング サムが必要であるとします。
id n sum
a 0 0
a 1 1
a 2 3
b 3 3
b 4 7
b 5 12
以下の代わりに:
id n sum
a 0 0.0
a 1 1.0
a 2 3.0
b 3 3.0
b 4 7.0
b 5 9.0
どうすればそれができますか? そのために、次のように DataFrame.cumsum()
を使用できます。
コード例:
import pandas as pd
n = range(0, 6)
id = ["a", "a", "a", "b", "b", "b"]
df = pd.DataFrame(zip(id, n), columns=["id", "n"])
df.set_index("id", inplace=True)
df_cumsum = df.groupby("id").n.cumsum()
df_cumsum
出力:
| id | |
| ---- | ---- |
| a | 0 |
| a | 1 |
| a | 3 |
| b | 3 |
| b | 7 |
| b | 12 |
DataFrame
または Series
軸の累積合計を返す DataFrame.cumsum()
メソッドを使用して、上記の出力を実現できます。