python numpy實(shí)現(xiàn)rolling滾動(dòng)案例
相比較pandas,numpy并沒(méi)有很直接的rolling方法,但是numpy 有一個(gè)技巧可以讓NumPy在C代碼內(nèi)部執(zhí)行這種循環(huán)。
這是通過(guò)添加一個(gè)與窗口大小相同的額外尺寸和適當(dāng)?shù)牟椒鶃?lái)實(shí)現(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])
補(bǔ)充知識(shí):pandas中的滾動(dòng)窗口rolling函數(shù)和擴(kuò)展窗口expanding函數(shù)
在數(shù)據(jù)分析時(shí),特別是在分析時(shí)間序列數(shù)據(jù)時(shí),常會(huì)需要對(duì)一個(gè)序列進(jìn)行固定長(zhǎng)度窗口的滾動(dòng)計(jì)算和分析,比如計(jì)算移動(dòng)均線。只要是需要根據(jù)一個(gè)時(shí)序得到一個(gè)新的時(shí)序,就往往需要進(jìn)行窗口滾動(dòng)。在pandas中,DataFrame和Seies都有一個(gè)針對(duì)滾動(dòng)窗口的函數(shù),叫做rolling()。其具體的參數(shù)為:DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
其中參數(shù)window可以為一個(gè)正整數(shù)或者一個(gè)offset(可以認(rèn)為是時(shí)間區(qū)間長(zhǎng)度),通過(guò)這個(gè)參數(shù)設(shè)置窗口長(zhǎng)度;min_periods表示窗口中需要的最小的觀測(cè)值,如果窗口中的成員個(gè)數(shù)少于這個(gè)設(shè)定的值,則這個(gè)窗口經(jīng)過(guò)計(jì)算后就會(huì)返回NaN,比如,如果min_periods設(shè)為3,但當(dāng)前的窗口中只有兩個(gè)成員,那么該窗口對(duì)應(yīng)的位置就會(huì)返回空值;center參數(shù)如果設(shè)為True,表示在取窗口覆蓋的區(qū)間時(shí),以當(dāng)前l(fā)abel為中心,向兩邊取,若為False,則表示以當(dāng)前l(fā)abel為窗口的最右側(cè),向左側(cè)取,默認(rèn)為False,要注意的是,當(dāng)為True時(shí),如果窗口長(zhǎng)度為奇數(shù),則中心位置很好確定,就是最中間的位置,但是如果長(zhǎng)度為偶數(shù),則默認(rèn)中心位置為中間偏右的那一個(gè)位置;win_type參數(shù)表示不同的窗口類型,可以通過(guò)這個(gè)參數(shù)給窗口成員賦予不同的權(quán)重,默認(rèn)為等權(quán)重;on參數(shù)表示指定對(duì)某一列進(jìn)行rolling,而不是默認(rèn)的對(duì)index進(jìn)行rolling,要注意的是,當(dāng)指定on參數(shù)時(shí),指定的列必須是時(shí)間序列,不然rolling函數(shù)就會(huì)失效。
下面看一個(gè)簡(jiǎn)單的例子。下面的例子中,當(dāng)窗口長(zhǎng)度為3,設(shè)min_periods為2時(shí),可知結(jié)果中第一個(gè)元素為NaN,因?yàn)榈谝粋€(gè)窗口只有一個(gè)值1,由于min_periods為2,所以至少需要包含兩個(gè)數(shù)才行,故第一個(gè)值為空值,從第二個(gè)元素開始才有非空值,這就是min_periods參數(shù)的含義。當(dāng)設(shè)置center為True時(shí),如果窗口長(zhǎng)度為偶數(shù)4,比如對(duì)于一個(gè)窗口[a,b,c,d],則中心值為中心偏右的那個(gè)位置,就是c,故此時(shí)第1個(gè)窗口覆蓋的元素為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對(duì)象或rolling子類,可以通過(guò)調(diào)用該對(duì)象的mean(),sum(),std(),count()等函數(shù)計(jì)算返回窗口的值,還可以通過(guò)該對(duì)象的apply(func)函數(shù),通過(guò)自定義函數(shù)計(jì)算窗口的特定的值,具體可看文檔。
從以上可以看出,rolling的窗口可以向前取值,向兩邊取值,但是沒(méi)有向后取值,實(shí)際上只需要把原序列倒序排列后再向前取值就可以實(shí)現(xiàn)向后取值。下面我們?cè)僦v一下expanding函數(shù),其為DataFrame.expanding(min_periods=1, center=False, axis=0),其中參數(shù)的意義和rolling一樣,只是其不是固定窗口長(zhǎng)度,其長(zhǎng)度是不斷的擴(kuò)大的。
以上這篇python numpy實(shí)現(xiàn)rolling滾動(dòng)案例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Python如何實(shí)現(xiàn)大型數(shù)組運(yùn)算(使用NumPy)
- Python常用庫(kù)Numpy進(jìn)行矩陣運(yùn)算詳解
- Python numpy矩陣處理運(yùn)算工具用法匯總
- python numpy庫(kù)np.percentile用法說(shuō)明
- python求numpy中array按列非零元素的平均值案例
- Python過(guò)濾掉numpy.array中非nan數(shù)據(jù)實(shí)例
- Python 實(shí)現(xiàn)將numpy中的nan和inf,nan替換成對(duì)應(yīng)的均值
- Python替換NumPy數(shù)組中大于某個(gè)值的所有元素實(shí)例
- 計(jì)算Python Numpy向量之間的歐氏距離實(shí)例
- Python使用Numpy模塊讀取文件并繪制圖片
- Numpy實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)(CNN)的示例
相關(guān)文章
django自動(dòng)添加接口文檔的實(shí)現(xiàn)
本文詳細(xì)介紹了使用Django和drf-yasg生成API接口文檔的步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03
Flask框架學(xué)習(xí)筆記之消息提示與異常處理操作詳解
這篇文章主要介紹了Flask框架學(xué)習(xí)筆記之消息提示與異常處理操作,結(jié)合實(shí)例形式分析了flask框架表單登陸消息提示、錯(cuò)誤模板調(diào)用及異常處理相關(guān)操作技巧,需要的朋友可以參考下2019-08-08
Python 實(shí)現(xiàn)引用其他.py文件中的類和類的方法
下面小編就為大家分享一篇Python 實(shí)現(xiàn)引用其他.py文件中的類和類的方法,具有的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
循環(huán)神經(jīng)網(wǎng)絡(luò)TextRNN實(shí)現(xiàn)情感短文本分類任務(wù)
這篇文章主要為大家介紹了循環(huán)神經(jīng)網(wǎng)絡(luò)TextRNN實(shí)現(xiàn)情感短文本分類任務(wù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
python實(shí)現(xiàn)一個(gè)簡(jiǎn)單RPC框架的示例
本文將會(huì)使用Python實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的RPC框架,不具有實(shí)用意義,但可以讓你清醒地理解RPC框架的幾個(gè)組成部分,只是比看Python自帶的xmlrpc清晰。2020-10-10
python實(shí)現(xiàn)測(cè)試工具(二)——簡(jiǎn)單的ui測(cè)試工具
這篇文章主要介紹了python如何實(shí)現(xiàn)簡(jiǎn)單的ui測(cè)試工具,幫助大家更好的利用python進(jìn)行測(cè)試工作,感興趣的朋友可以了解下2020-10-10

