2017-07-17 69 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])(前三個正數)或std([1,2])(前三個元素的正數)。 – ayhan

+0

我將它用於時間序列(因此是滾動功能)。因此,在你的例子中,對於索引-1,3的窗口將看std([nan,4,nan]),而索引0則看std([1,nan,2])。 –

回答

2

你必須瞭解滾動窗口是如何工作的。我們提供的窗口大小是計算統計數據的連續元素的大小。如果任何元素是NaN,那麼平均值將是NaN。對於例如 讓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 
... 

,如果我提供了滾動窗口爲100,則前99個元素將始終爲NaN,與所有那些在甚至還有一個NaN的窗口一起。

解決此問題的一種方法是爲參數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循環一樣,因此應用的函數表現相同。 –