2017-07-17 6 views
0

正の数の標準偏差を計算しようとしています。パンダブレイクを使用してローリング

np.random.seed(42) 
d = pd.Series(data = np.random.randn(1000)) 

私は次の操作を実行した場合:

(d.where(d>0))[-100:].std(skipna=True) 

を私は0.56972171400539895 を取得するしかし、私は私たちに、私が唯一nanを得るローリング機能をしようとした場合:

(d.where(d>0)).rolling(100).std(skipna=True).iloc[-1] 

をする方法はありますローリング機能を働かせますか? python 3.5とpandasでテストしました。0.20

+2

ブーリアンインデックスの代わりに 'where'を使用する特別な理由はありますか?たとえば、3のウィンドウの場合、 '[1、-1、2、-2、3、-3、4、-4]'あなたの標準偏差は何ですか? std([1,2,3])(最初の3つの陽性)またはstd([1,2])(最初の3つの要素の陽性) – ayhan

+0

私はそれを時系列(それゆえローリング関数)に使用しています。つまり、インデックス-1ではstd([nan、4、nan])が表示され、インデックス0ではstd([1、nan、2])が表示されます。 –

答えて

2

ローリングウィンドウの仕組みを理解しておく必要があります。私たちが提供するウィンドウのサイズは、統計が計算される連続する要素のサイズです。要素がNaNの場合、平均はNaNになります。例えば、私は100としてローリング・ウィンドウを提供する場合 d.where(d>0)今すぐ

0   NaN 
1   NaN 
2   NaN 
3   NaN 
4   NaN 
5  0.384464 
6  0.384464 
7  0.275835 
8  0.414436 
9  0.414436 
10 0.428174 
... 

でみましょう、その後、最初の99の要素は、常に1つでもNaNのが存在するすべてのものを窓とともに、NaNになります。

これに対処する1つの方法は、引数min_periodに値を指定することです。これは、値を持つために必要なウィンドウ内の観測の最小数です。私はd.where(d>0).rolling(100,min_periods=2).std()をすれば

ので、私が手:最小値が満たされていないので、

0   NaN 
1   NaN 
2   NaN 
3   NaN 
4   NaN 
5  0.384464 
6  0.384464 
7  0.275835 
8  0.414436 
9  0.414436 
10 0.428174 
... 

注意をここにインデックス4までよりも、すべての値は、NaNです。その後、ウィンドウサイズ100で、少なくとも2つの値があるため、値が入力されます。

+0

編集ありがとうございました;) –

+0

ありがとうございます。ある意味では、私は、 'rolling'メソッドがインデックス上のforループのようになることを期待していました。そのように関数は同じように動作するように適用されました。 –

関連する問題