2017-11-07 24 views
0

https://turi.com/products/create/docs/generated/graphlab.toolkits.anomaly_detection.moving_zscore.create.htmlのように、移動するzスコアを計算するためのオープンソース関数はありますか?私はstdを計算するためにpandas rolling_stdにアクセスできますが、それを拡張してローリングzのスコアを計算できるかどうかを見たいと思っています。パンダのデータフレームにおけるローリングzスコアを計算する

+0

ええ、 'rolling.apply'を使用してください。 –

答えて

2

rolling.applyカスタム関数を使用すると、組み込みのローリング関数(meanやstdなど)を使用するよりも大幅に遅くなります。したがって、平均値とstd圧延の圧延の圧延Zスコアを計算する:

def zscore(x, window): 
    r = x.rolling(window=window) 
    m = r.mean().shift(1) 
    s = r.std(ddof=0).shift(1) 
    z = (x-m)/s 
    return z 

this page上を転動Zスコアを与えられた定義によれば、直前の現在位置にローリング平均とstdに依存します。この効果を達成するために、​​が上記で使用されています。以下


、偶数(長さ100の)小さなシリーズのために、zscoreが速くrolling.applyを使用するよりも5倍以上です。 rolling.apply(zscore_func)は本質的にPythonループの各ローリングウィンドウに対してzscore_funcを1回呼び出すので、Cython化されたr.mean()r.std()関数を使用する利点は、ループのサイズが大きくなるにつれてさらに顕著になります。 したがって、シリーズの長さが増えるにつれて、速度の利点はzscoreとなります。

In [58]: %timeit zscore(x, N) 
1000 loops, best of 3: 903 µs per loop 

In [59]: %timeit zscore_using_apply(x, N) 
100 loops, best of 3: 4.84 ms per loop 

これは、ベンチマークのために使用されたセットアップです:

enter image description here

あなた:

import numpy as np 
import pandas as pd 
np.random.seed(2017) 

def zscore(x, window): 
    r = x.rolling(window=window) 
    m = r.mean().shift(1) 
    s = r.std(ddof=0).shift(1) 
    z = (x-m)/s 
    return z 


def zscore_using_apply(x, window): 
    def zscore_func(x): 
     return (x[-1] - x[:-1].mean())/x[:-1].std(ddof=0) 
    return x.rolling(window=window+1).apply(zscore_func) 

N = 5 
x = pd.Series((np.random.random(100) - 0.5).cumsum()) 

result = zscore(x, N) 
alt = zscore_using_apply(x, N) 

assert not ((result - alt).abs() > 1e-8).any() 
+0

おかげさまで@unubtu、素晴らしい答え!私は最初にpandas groupbyの操作をしてからzolling z score計算をしていたので、ローリング・アプリケーションに興味があった – user308827

+0

シフトをコーディングしていただきありがとうございます( - : – piRSquared

0

は、私たちは、あなたがデータフレームは、このようになりますこれは、データと呼ばれているとしましょう次のコードを実行します。

data_zscore = data.apply(lambda X:。)/ x.expanding(((平均))(xx.expanding)STD())

enter image description hereそれは標準偏差を有していないように、第1行は常にNaN値を有するであろうことに注意してください。

+1

)このコードスニペットは[ //meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)は、あなたの投稿の質を向上させるのに本当に役立ちます。将来の読者の質問に答えていることを忘れないでください。あなたのコード提案の理由を知ってください。 –

関連する問題