您好,登錄后才能下訂單哦!
小編這次要給大家分享的是python中numpy如何實現rolling滾動,文章內容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。
相比較pandas,numpy并沒有很直接的rolling方法,但是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])
補充知識:pandas中的滾動窗口rolling函數和擴展窗口expanding函數
在數據分析時,特別是在分析時間序列數據時,常會需要對一個序列進行固定長度窗口的滾動計算和分析,比如計算移動均線。只要是需要根據一個時序得到一個新的時序,就往往需要進行窗口滾動。在pandas中,DataFrame和Seies都有一個針對滾動窗口的函數,叫做rolling()。其具體的參數為:DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
其中參數window可以為一個正整數或者一個offset(可以認為是時間區間長度),通過這個參數設置窗口長度;min_periods表示窗口中需要的最小的觀測值,如果窗口中的成員個數少于這個設定的值,則這個窗口經過計算后就會返回NaN,比如,如果min_periods設為3,但當前的窗口中只有兩個成員,那么該窗口對應的位置就會返回空值;center參數如果設為True,表示在取窗口覆蓋的區間時,以當前label為中心,向兩邊取,若為False,則表示以當前label為窗口的最右側,向左側取,默認為False,要注意的是,當為True時,如果窗口長度為奇數,則中心位置很好確定,就是最中間的位置,但是如果長度為偶數,則默認中心位置為中間偏右的那一個位置;win_type參數表示不同的窗口類型,可以通過這個參數給窗口成員賦予不同的權重,默認為等權重;on參數表示指定對某一列進行rolling,而不是默認的對index進行rolling,要注意的是,當指定on參數時,指定的列必須是時間序列,不然rolling函數就會失效。
下面看一個簡單的例子。下面的例子中,當窗口長度為3,設min_periods為2時,可知結果中第一個元素為NaN,因為第一個窗口只有一個值1,由于min_periods為2,所以至少需要包含兩個數才行,故第一個值為空值,從第二個元素開始才有非空值,這就是min_periods參數的含義。當設置center為True時,如果窗口長度為偶數4,比如對于一個窗口[a,b,c,d],則中心值為中心偏右的那個位置,就是c,故此時第1個窗口覆蓋的元素為1和2,所以和為3,如下所示。
import pandas as pd import numpy as np df=pd.DataFrame([1,2,3,5],columns=['a']) df a 0 1 1 2 2 3 3 5 df.rolling(3,min_periods=2).sum() a 0 NaN 1 3.0 2 6.0 3 10.0 df.rolling(4,min_periods=2,center=True).sum() a 0 3.0 1 6.0 2 11.0 3 10.0
rolling函數返回的是window對象或rolling子類,可以通過調用該對象的mean(),sum(),std(),count()等函數計算返回窗口的值,還可以通過該對象的apply(func)函數,通過自定義函數計算窗口的特定的值,具體可看文檔。
從以上可以看出,rolling的窗口可以向前取值,向兩邊取值,但是沒有向后取值,實際上只需要把原序列倒序排列后再向前取值就可以實現向后取值。下面我們再講一下expanding函數,其為DataFrame.expanding(min_periods=1, center=False, axis=0),其中參數的意義和rolling一樣,只是其不是固定窗口長度,其長度是不斷的擴大的。
看完這篇關于python中numpy如何實現rolling滾動的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。