Skip to content
チュートリアル
NumPy
Pythonで移動平均を計算するNumpy Rolling

PythonでのNumpy Rolling - 移動平均の計算

データ分析の世界では、特に時系列データを扱う場合、移動統計量の計算能力は非常に重要です。そのため、Pythonでの主要なツールはnumpyライブラリであり、具体的にはnumpyのrolling関数です。この関数を使うと、データ全体で移動平均などのさまざまな移動統計量を計算することができます。では、具体的にはどのように動作し、どのように効果的に使うことができるのでしょうか?

Numpyのrollingは、指定したサイズの移動ウィンドウ上で関数を適用するための関数です。これは時系列分析で特に役立ちます。ここでは、短期的な変動を滑らかにして長期的なトレンドをより良く見るために使用します。この記事では、numpyのrollingの詳細について解説し、その構文、異なるウィンドウサイズでの使用方法、2D配列への適用方法、およびフィルタの使用方法について説明します。

Python Pandas DataframeからNo codeでデータ可視化を素早く作成したいですか?

PyGWalkerは、可視化を伴う探索的データ分析のためのPythonライブラリです。 PyGWalker (opens in a new tab)は、pandas dataframe(およびpolars dataframe)をTableauスタイルのユーザーインターフェースに変換することにより、Jupyter Notebookのデータ分析とデータ可視化のワークフローを簡素化できます。

データ可視化のためのPyGWalker (opens in a new tab)

Numpyのrollingの理解

Numpyのrollingは、配列に移動ウィンドウを適用し、そのウィンドウ内のデータに関数を実行する関数です。ウィンドウは配列を移動し、関数はそれぞれのステップで新しいウィンドウに適用されます。ウィンドウのサイズはユーザーによって指定され、配列のサイズ以下の任意の整数にすることができます。

numpyのrolling関数の構文は次のようになります:

numpy.rolling(ウィンドウ)

ここで、ウィンドウは移動ウィンドウのサイズです。これは整数で、配列の連続した要素数を指定します。

たとえば、1次元の値の配列があり、ウィンドウサイズが3の移動平均を計算したい場合、次のコードを使用します:

import numpy as np
 
# 1次元配列の作成
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
 
# ウィンドウサイズが3の移動平均を計算
rolling_mean = np.rolling(3).mean(data)
 
print(rolling_mean)

これにより、次の配列が出力されます:

array([nan, nan, 2., 3., 4., 5., 6., 7., 8.])

最初の2つの値はnanです。これは、サイズ3のウィンドウを埋めるための十分な前の値がないためです。3番目の値は2であり、最初の3つの値(1、2、3)の平均が2であるため、以降も同様です。

NumpyのrollingとNumpyのrollの比較

NumpyのrollingとNumpyのrollは似ているかもしれませんが、それぞれ異なる目的があります。Numpyのrollは、指定された軸に沿って配列の要素をシフトし、要素を配列のもう一方の側に回り込ませる関数です。一方、Numpyのrollingは、配列に移動ウィンドウを適用し、そのウィンドウ内のデータに関数を実行します。

たとえば、次の1次元配列がある場合:

import numpy as np
 
# 1次元配列の作成
data = np.array([1, 2, 3, 4, 5])
 
# numpyのrollを使用して要素を右に2つシフトする
rolled_data = np.roll(data, 2)
 
print(rolled_data)

これにより、次の配列が出力されます:

array([4, 5, 1, 2, 3])

要素が右に2つシフトされ、末尾から押し出された要素は配列の先頭にラップされていることがわかります。

2D配列にNumpyのrollingを適用する

Numpyのrollingは、2D配列にも適用することができます。この場合、移動ウィンドウは配列の各行または列(指定した軸による)に適用され、ウィンドウ内のデータに対して関数が適用されます。

たとえば、2D配列の値があり、行ごとにウィンドウサイズが3の移動平均を計算したい場合、次のコードを使用します:

import numpy as np
 
# 2D配列の作成
data = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]])
 
# 行ごとにウィンドウサイズが3の移動平均を計算
rolling_mean = np.rolling(3, axis=1).mean(data)
 
print(rolling_mean)

これにより、次の2D配列が出力されます:

array([[nan, nan,  2.,  3.,  4.],
       [nan, nan,  7.,  8.,  9.],
       [nan, nan, 12., 13., 14.]])

各行の最初の2つの値はnanです。これは、ウィンドウサイズ3を埋めるための行内の十分な前の値がないためです。各行の3番目の値は2であり、行内の最初の3つの値(1、2、3)の平均が2であるため、以降も同様です。

Numpyのrollingとフィルタの使用

Numpyのrollingでは、移動ウィンドウ内のデータにフィルタを適用することもできます。これは、データのスムージングや外れ値の除去に役立ちます。

たとえば、ウィンドウサイズが3の移動中央値(平均よりも外れ値に対して感度が低い)を計算したい場合、次のコードを使用します:

import numpy as np
 
# 1次元配列の作成
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
 
# ウィンドウサイズが3の移動中央値を計算
rolling_median = np.rolling(3).median(data)
 
print(rolling_median)

これにより、次の配列が出力されます:

array([nan, nan, 2., 3., 4., 5., 6., 7., 8.])

最初の2つの値は nan ですが、前の値が不足しているため、サイズ3のウィンドウを埋めるための値がありません。3つ目の値は2です。最初の3つの値(1、2、3)の中央値は2で、それ以降も同様です。

Numpyローリングを時系列データに適用する

Numpyローリングの最も一般的な使用例の1つは、時系列データの分析です。時系列データとは、通常一定の間隔で収集されるデータ点のシーケンスです。Numpyローリングを使用することで、時系列データ上でのローリング統計量の計算が可能となり、トレンドやパターンに関する洞察を提供します。

Numpyローリングを時系列データに適用するためには、まずデータが適切にフォーマットされていることを確認する必要があります。通常、時系列データは1次元配列または2次元配列の列として表現され、各要素が特定の時点でのデータ点を表します。データを所望の形式に変換した後、numpyローリングを使用してローリング統計量を計算することができます。

例えば、過去1年間のある都市の日々の気温を記録した時系列データセットがあるとします。日々の変動を平滑化し、長期の気温トレンドを特定するために、7日間のローリング平均気温を計算したいとします。以下にその方法を示します。

import numpy as np
 
# デイリー気温値を持つ1次元配列 'temperature' があるとします
# 7日間のローリング平均気温を計算する
rolling_avg = np.rolling(7).mean(temperature)
 
print(rolling_avg)

rolling_avg 配列には、7日間のローリング平均気温の値が含まれます。各値は、7日間のウィンドウ上の平均気温を表し、時間の経過に伴う全体的な気温トレンドを観察することができます。

時系列データにnumpyローリングを適用することで、季節性の特定、異常の検出、将来のトレンドの予測など、貴重な洞察を明らかにすることができます。これは、ファイナンス、気候、株式市場分析など、さまざまなドメインで時間依存パターンを分析・理解するための強力なツールです。

Numpyローリングで軸を操作する

Numpyローリングは、2次元配列の行または列に移動ウィンドウを適用するだけでなく、軸を操作する柔軟性も提供します。この機能は、多次元配列で作業し、特定の次元に沿って計算を実行する際に特に有用です。

例えば、異なる場所と時間期間にわたる月別の気温測定値を表す3次元配列があるとします。各場所ごとに時間軸に沿ってローリング平均気温を計算したいとします。以下に、numpyローリングを使用してそれを実現する方法を示します。

import numpy as np
 
# 形状が(num_locations、num_time_periods、num_months)の3次元配列 'temperature' があるとします
# 時間軸に沿ったローリング平均気温を計算する
rolling_avg = np.rolling(3, axis=1).mean(temperature)
 
print(rolling_avg)

この例では、axis=1 を指定して、時間軸に沿ってローリングウィンドウを適用したいことを示しています。結果の rolling_avg 配列には、各場所のローリング平均気温値が含まれ、元の配列の形状が保持されます。

numpyローリングで軸を操作することで、特定の次元に沿ってローリング計算を実行し、多次元データから有意な情報を抽出し分析することができます。

データ分析のためのNumpyローリングの最適化

大規模なデータセットで作業したり、numpyローリングを使用して複雑な計算を行ったりする場合、最適化は効率的な計算と処理時間の削減を確保するために重要です。データ分析のためにnumpyローリングを最適化するためのいくつかのヒントを以下に示します。

  1. dtypeを指定する:numpyで配列を作成するかデータをロードする際に、適切なデータ型(dtype)を指定します。正しいデータ型を使用することは、メモリを節約するだけでなく、計算速度も向上させます。

  2. ウィンドウサイズを適切に設定する:データと分析の要件に応じてウィンドウサイズを調整します。ウィンドウサイズを小さくすると、より細かな洞察が得られますが、ノイズに敏感になる可能性があります。一方、ウィンドウサイズを大きくすると、変動が平滑化されますが、短期のパターンを見逃す可能性があります。

  3. ベクトル演算を活用する:numpyはベクトル演算に最適化されており、パフォーマンスを大幅に向上させることができます。ループや反復計算ではなく、numpyの組み込み関数や演算を使用して計算を行うように心がけてください。

  4. 並列化を考慮する:システムが並列計算をサポートしている場合は、numpyローリングの計算を並列化するオプションを探してみてください。並列化により、計算を複数のコアやプロセッサに分散することができ、大規模データセットの処理時間を短縮することができます。

これらの最適化テクニックに従うことで、numpyローリングの計算パフォーマンスを向上させ、データ分析のフルポテンシャルを引き出すことができます。


よくある質問

numpyローリングに関するよくある質問をいくつか紹介します。

  1. numpyローリングとは何ですか? numpyローリングは、numpyライブラリの関数で、配列上でのローリング統計量の計算を可能にするものです。データに移動ウィンドウを適用し、ウィンドウ内のデータに指定した関数を適用します。これは特に時系列分析やデータの平滑化に非常に便利です。

  2. numpyを使用してローリング統計量をどのように計算しますか? numpyを使用してローリング統計量を計算するには、numpy.rolling() 関数を使用し、ウィンドウサイズと適用したい関数(平均、中央値など)を指定します。この関数は配列上をイテレートし、それぞれのデータウィンドウに指定した関数を適用します。

  3. numpyのローリング関数の構文はどのようなものですか? numpyのローリング関数の構文は numpy.rolling(window, axis=0) です。ここで、window は移動ウィンドウのサイズを指定し、axis(オプション)でローリング操作を行う軸を指定します。この関数は、mean、medianなどのさまざまな関数を適用するために使用できるローリングウィンドウオブジェクトを返します。