python numpy實現(xiàn)rolling滾動案例
相比較pandas,numpy并沒有很直接的rolling方法,但是numpy 有一個技巧可以讓NumPy在C代碼內(nèi)部執(zhí)行這種循環(huán)。
這是通過添加一個與窗口大小相同的額外尺寸和適當(dāng)?shù)牟椒鶃韺崿F(xiàn)的。
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函數(shù)和擴展窗口expanding函數(shù)
在數(shù)據(jù)分析時,特別是在分析時間序列數(shù)據(jù)時,常會需要對一個序列進行固定長度窗口的滾動計算和分析,比如計算移動均線。只要是需要根據(jù)一個時序得到一個新的時序,就往往需要進行窗口滾動。在pandas中,DataFrame和Seies都有一個針對滾動窗口的函數(shù),叫做rolling()。其具體的參數(shù)為:DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
其中參數(shù)window可以為一個正整數(shù)或者一個offset(可以認(rèn)為是時間區(qū)間長度),通過這個參數(shù)設(shè)置窗口長度;min_periods表示窗口中需要的最小的觀測值,如果窗口中的成員個數(shù)少于這個設(shè)定的值,則這個窗口經(jīng)過計算后就會返回NaN,比如,如果min_periods設(shè)為3,但當(dāng)前的窗口中只有兩個成員,那么該窗口對應(yīng)的位置就會返回空值;center參數(shù)如果設(shè)為True,表示在取窗口覆蓋的區(qū)間時,以當(dāng)前l(fā)abel為中心,向兩邊取,若為False,則表示以當(dāng)前l(fā)abel為窗口的最右側(cè),向左側(cè)取,默認(rèn)為False,要注意的是,當(dāng)為True時,如果窗口長度為奇數(shù),則中心位置很好確定,就是最中間的位置,但是如果長度為偶數(shù),則默認(rèn)中心位置為中間偏右的那一個位置;win_type參數(shù)表示不同的窗口類型,可以通過這個參數(shù)給窗口成員賦予不同的權(quán)重,默認(rèn)為等權(quán)重;on參數(shù)表示指定對某一列進行rolling,而不是默認(rèn)的對index進行rolling,要注意的是,當(dāng)指定on參數(shù)時,指定的列必須是時間序列,不然rolling函數(shù)就會失效。
下面看一個簡單的例子。下面的例子中,當(dāng)窗口長度為3,設(shè)min_periods為2時,可知結(jié)果中第一個元素為NaN,因為第一個窗口只有一個值1,由于min_periods為2,所以至少需要包含兩個數(shù)才行,故第一個值為空值,從第二個元素開始才有非空值,這就是min_periods參數(shù)的含義。當(dāng)設(shè)置center為True時,如果窗口長度為偶數(shù)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函數(shù)返回的是window對象或rolling子類,可以通過調(diào)用該對象的mean(),sum(),std(),count()等函數(shù)計算返回窗口的值,還可以通過該對象的apply(func)函數(shù),通過自定義函數(shù)計算窗口的特定的值,具體可看文檔。
從以上可以看出,rolling的窗口可以向前取值,向兩邊取值,但是沒有向后取值,實際上只需要把原序列倒序排列后再向前取值就可以實現(xiàn)向后取值。下面我們再講一下expanding函數(shù),其為DataFrame.expanding(min_periods=1, center=False, axis=0),其中參數(shù)的意義和rolling一樣,只是其不是固定窗口長度,其長度是不斷的擴大的。
以上這篇python numpy實現(xiàn)rolling滾動案例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- Python如何實現(xiàn)大型數(shù)組運算(使用NumPy)
- Python常用庫Numpy進行矩陣運算詳解
- Python numpy矩陣處理運算工具用法匯總
- python numpy庫np.percentile用法說明
- python求numpy中array按列非零元素的平均值案例
- Python過濾掉numpy.array中非nan數(shù)據(jù)實例
- Python 實現(xiàn)將numpy中的nan和inf,nan替換成對應(yīng)的均值
- Python替換NumPy數(shù)組中大于某個值的所有元素實例
- 計算Python Numpy向量之間的歐氏距離實例
- Python使用Numpy模塊讀取文件并繪制圖片
- Numpy實現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)(CNN)的示例
相關(guān)文章
淺談Python函數(shù)式編程的返回函數(shù)與匿名函數(shù)
這篇文章主要介紹了淺談Python函數(shù)式編程的返回函數(shù)與匿名函數(shù),如果一個變量指向了一個函數(shù),那么,可以通過該變量來調(diào)用這個函數(shù),需要的朋友可以參考下2023-04-04python抓取網(wǎng)頁圖片示例(python爬蟲)
這篇文章主要介紹了python抓取網(wǎng)頁圖片示例(python爬蟲),需要的朋友可以參考下2014-04-04分位數(shù)回歸模型quantile regeression應(yīng)用詳解及示例教程
這篇文章主要為大家介紹了介紹了分位數(shù)回歸quantile regeression的概念詳解及代碼示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11實例講解Python中函數(shù)的調(diào)用與定義
這篇文章主要介紹了Python中函數(shù)的調(diào)用與定義,是Python入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2016-03-03Python實現(xiàn)列表刪除重復(fù)元素的三種常用方法分析
這篇文章主要介紹了Python實現(xiàn)列表刪除重復(fù)元素的三種常用方法,結(jié)合實例形式對比分析了Python針對列表元素的遍歷、判斷、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下2017-11-11Python函數(shù)可變參數(shù)定義及其參數(shù)傳遞方式實例詳解
這篇文章主要介紹了Python函數(shù)可變參數(shù)定義及其參數(shù)傳遞方式,以實例形式較為詳細(xì)的分析了Python函數(shù)參數(shù)的使用技巧,需要的朋友可以參考下2015-05-05Django結(jié)合使用Scrapy爬取數(shù)據(jù)入庫的方法示例
這篇文章主要介紹了Django結(jié)合使用Scrapy爬取數(shù)據(jù)入庫的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03