Pandas の GroupBy オブジェクトの便利なローリング関数の紹介

Mehvish Ashiq 2024年2月15日
  1. パンダのローリングとローリング ウィンドウ
  2. ローリング ウィンドウ機能
  3. dataframe.rolling() 関数の構文と作業プロセス
  4. Pandas の GroupBy オブジェクトの便利なローリング関数
  5. Pandas の GroupBy オブジェクトに rolling().sum() 関数を使用する
  6. Pandas の GroupBy オブジェクトに rolling().mean() 関数を使用する
  7. Pandas の GroupBy オブジェクトの複数の列で rolling().agg() 関数を使用する
Pandas の GroupBy オブジェクトの便利なローリング関数の紹介

今日は、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() 関数の startstop、および 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=12 のウィンドウ長を実行し、列 n で合計を実行します。 rolling().sum() を使用した出力を理解するには、次のスクリーンショットを参照してください。

pandas の groupby オブジェクトの便利なローリング関数の紹介 - ローリング サム

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つの値の平均を計算しています。

以下の画像を見て理解してください。

パンダの groupby オブジェクトの便利なローリング関数の紹介 - ローリング平均

各グループの最初の値は、それより前に値がないため、出力列にそのまま表示されますが、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  |

ここでは、n1n2 の 2つの列があり、agg() メソッドを使用して、n1sum を、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() メソッドを使用して、上記の出力を実現できます。

著者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

関連記事 - Pandas GroupBy