パンダと比較すると、numpyには直接的なローリング方法はありませんが、numpyにはCコード内でこのループを実行できるようにするトリックがあります。
これは、ウィンドウサイズと同じサイズと適切なストライドを追加することで実現されます。
import numpy as np
data = np.arange(20)
def rolling_window(a, window):
shape = a.shape[:-1]+(a.shape[-1]- window +1, window)
strides = a.strides +(a.strides[-1],)return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)rolling_window(data,10)
Out[12]:array([[0,1,2,3,4,5,6,7,8,9],[1,2,3,4,5,6,7,8,9,10],[2,3,4,5,6,7,8,9,10,11],[3,4,5,6,7,8,9,10,11,12],[4,5,6,7,8,9,10,11,12,13],[5,6,7,8,9,10,11,12,13,14],[6,7,8,9,10,11,12,13,14,15],[7,8,9,10,11,12,13,14,15,16],[8,9,10,11,12,13,14,15,16,17],[9,10,11,12,13,14,15,16,17,18],[10,11,12,13,14,15,16,17,18,19]])
np.mean(rolling_window(data,10))
Out[13]:9.5
np.mean(rolling_window(data,10),-1)
Out[14]:array([4.5,5.5,6.5,7.5,8.5,9.5,10.5,11.5,12.5,13.5,14.5])
補足知識:パンダのローリングウィンドウローリング機能と拡張ウィンドウ拡張機能
データ分析では、特に時系列データを分析する場合、移動平均の計算など、固定長ウィンドウのシーケンスでローリング計算と分析を実行する必要があることがよくあります。シーケンスに従って新しいシーケンスを取得する必要がある限り、ウィンドウのスクロールが必要になることがよくあります。パンダでは、DataFrameとSeiesの両方にrolling()と呼ばれるウィンドウをローリングするための関数があります。具体的なパラメータは次のとおりです。DataFrame.rolling(window、min_periods = None、center = False、win_type = None、on = None、axis = 0、closed = None)
パラメータwindowは、正の整数またはオフセット(時間間隔の長さと見なすことができます)にすることができ、ウィンドウの長さはこのパラメータによって設定されます。min_periodsは、ウィンドウのメンバー数がこの設定より少ない場合に、ウィンドウで必要な最小観測値を表します。このウィンドウの値は、計算後にNaNを返します。たとえば、min_periodsが3に設定されているが、現在のウィンドウにメンバーが2つしかない場合、ウィンドウの対応する位置はnull値を返します。centerパラメーターがTrueに設定されている場合、ウィンドウカバレッジ間隔を取得するときに、現在のラベルを中央として両側に配置することを意味します。Falseの場合、現在のラベルをウィンドウの右端として取得し、左側に移動することを意味します。デフォルトはFalseです。 Trueの場合、ウィンドウの長さが奇数の場合、中央の位置である中央の位置が適切に決定されますが、長さが偶数の場合、デフォルトの中央の位置は右中央の位置です。win_typeパラメーターはさまざまなウィンドウタイプを示します。 、このパラメータを使用してウィンドウメンバーに異なる重みを割り当てることができます。デフォルトは等しい重みです。onパラメータは、インデックスのデフォルトではなく、特定の列がローリング用に指定されていることを示します。onパラメータが指定されている場合、指定されていることに注意してください。列は時系列である必要があります。そうでない場合、ローリング機能は失敗します。
簡単な例を見てみましょう。次の例では、ウィンドウの長さが3で、min_periodsが2に設定されている場合、最初のウィンドウには値1が1つしかないため、結果の最初の要素はNaNであり、min_periodsは2であるため、少なくとも2つの数値が含まれている必要があります。 OK、最初の値はnull値であり、2番目の要素から始まるnull以外の値があります。これがmin_periodsパラメーターの意味です。 centerがTrueに設定されている場合、ウィンドウの長さが偶数4の場合、たとえばウィンドウ[a、b、c、d]の場合、center値はcenterの右側の位置、つまりcであるため、最初のウィンドウは以下に示すように、要素は1と2であるため、合計は3になります。
import pandas as pd
import numpy as np
df=pd.DataFrame([1,2,3,5],columns=['a'])
df
a
01122335
df.rolling(3,min_periods=2).sum()
a
0 NaN13.026.0310.0
df.rolling(4,min_periods=2,center=True).sum()
a
03.016.0211.0310.0
ローリング関数は、ウィンドウオブジェクトまたはローリングサブクラスを返します。返されるウィンドウの値は、オブジェクトのmean()、sum()、std()、count()などの関数、およびオブジェクトのapply(func)を呼び出すことで計算できます。 )関数、カスタム関数を使用してウィンドウの特定の値を計算します。詳細については、ドキュメントを参照してください。
上記から、ローリングウィンドウは前方と両側の値を取ることができますが、後方の値はありません。実際には、元のシーケンスを逆の順序で配置してから、値を前方に取るだけで、後方の値を実現できます。 DataFrame.expanding(min_periods = 1、center = False、axis = 0)である拡張関数についてもう一度説明します。パラメーターの意味は、固定ウィンドウ長ではなく、その長さが常に拡張されていることを除いて、ローリングと同じです。
python numpyを使用してローリングを実装する上記の例は、エディターによって共有されるすべてのコンテンツです。参照を提供したいと思います。
Recommended Posts