pandas庫之DataFrame滑動窗口的實(shí)現(xiàn)
(1)DataFrame的滑動窗口
提供滑動窗口計(jì)算,可用于時間序列(時間和日期)數(shù)據(jù)
DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None, method='single')
參數(shù):
window:int, offset, or BaseIndexer subclass
移動窗口的大小,如果是整數(shù),代表每個窗口覆蓋的固定數(shù)量;如果是offset(pandas時間序列),代表每個窗口的時間段,每個窗口的大小將根據(jù)時間段中包含的觀察值而變化,僅對datetimelike索引有效。
min_periods:int, default None
窗口計(jì)算值要求至少有min_periods個觀測值。窗口由時間類型指定,則min_periods默認(rèn)為1,窗口為整數(shù),則min_periods默認(rèn)為窗口大小
center:bool, default False
是否將窗口中間索引設(shè)為窗口計(jì)算后的標(biāo)簽
win_type:str, default None
觀測值的權(quán)重分布。如果為None,則所有點(diǎn)的權(quán)重均相等。如果是字符串,要求是 scipy.signal window function函數(shù)
on:str, optional
對于 DataFrame,計(jì)算滾動窗口所依照的列標(biāo)簽或索引級別,而不是 DataFrame 的索引
axis:int or str, default 0
如果是0或’index’,按行滾動;如果是1或’columns’,按列滾動
closed:str, default None
‘right’:窗口中的第一個點(diǎn)將從計(jì)算中排除;‘left‘:窗口中的最后一個點(diǎn)將從計(jì)算中排除;‘both’:窗口中沒有點(diǎn)將從計(jì)算中排除;‘neither’:窗口中的第一個點(diǎn)和最后一個點(diǎn)將從計(jì)算中排除;默認(rèn)’right’
Example
窗口大小為2的求和
>>> import pandas as pd >>> import numpy as np >>> df = pd.DataFrame({'B':[0,1,2,np.nan,4]}) >>> df B 0 0.0 1 1.0 2 2.0 3 NaN 4 4.0 >>> df.rolling(2).sum() B 0 NaN 1 1.0 2 3.0 3 NaN 4 NaN
窗口為2s的求和
>>> df_time = pd.DataFrame({'B':[0,1,2,np.nan,4]}, index = [ pd.Timestamp('20130101 09:00:00'), pd.Timestamp('20130101 09:00:02'), pd.Timestamp('20130101 09:00:03'), pd.Timestamp('20130101 09:00:05'), pd.Timestamp('20130101 09:00:06')]) >>> df_time B 2013-01-01 09:00:00 0.0 2013-01-01 09:00:02 1.0 2013-01-01 09:00:03 2.0 2013-01-01 09:00:05 NaN 2013-01-01 09:00:06 4.0 >>> df_time.rolling('2s').sum() B 2013-01-01 09:00:00 0.0 2013-01-01 09:00:02 1.0 2013-01-01 09:00:03 3.0 2013-01-01 09:00:05 NaN 2013-01-01 09:00:06 4.0
有 2 個觀測值的前視窗口的滾動求和(a和a+1)
# 設(shè)置前向窗口 >>> indexer = pd.api.indexers.FixedForwardWindowIndexer(window_size=2) >>> df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]}) >>> df.rolling(window=indexer,min_periods=1).sum() B 0 1.0 1 3.0 2 2.0 3 4.0 4 4.0
窗口長度為 2 個觀測值的滾動和,但至少需要 1 個觀測值才可計(jì)算值
>>> df.rolling(2,min_periods=1).sum() B 0 0.0 1 1.0 2 3.0 3 2.0 4 4.0
滾動總和,并將結(jié)果分配到窗口索引的中心
>>> df.rolling(3, min_periods=1, center=True).sum() B 0 1.0 1 3.0 2 3.0 3 6.0 4 4.0 >>> df.rolling(3, min_periods=1, center=False).sum() B 0 0.0 1 1.0 2 3.0 3 3.0 4 6.0
高斯分布窗口
>>> df.rolling(2,win_type='gaussian').sum(std=3) B 0 NaN 1 0.986207 2 2.958621 3 NaN 4 NaN
(2)pandas的窗口操作
窗口由從當(dāng)前觀測值回溯窗口長度組成
>>> import pandas as pd >>> s = pd.Series(range(5)) >>> s 0 0 1 1 2 2 3 3 4 4 dtype: int64 # 5個分區(qū) >>> for window in s.rolling(window=2): print(window) 0 0 dtype: int64 0 0 1 1 dtype: int64 1 1 2 2 dtype: int64 2 2 3 3 dtype: int64 3 3 4 4 dtype: int64
panadas支持4種窗口操作
- Rolling window:值的固定/變動的滑動窗口
- Weighted window:由 scipy.signal 庫提供的加權(quán)非矩形窗口
- Expanding window:值的累積窗口
- Exponentially Weighted window:值的累積和指數(shù)加權(quán)窗
其中滑動窗口支持時間序列的計(jì)算
>>> s = pd.Series(range(5),index = pd.date_range('2020-01-01',periods=5,freq='1D')) >>> s 2020-01-01 0 2020-01-02 1 2020-01-03 2 2020-01-04 3 2020-01-05 4 Freq: D, dtype: int64 >>> s.rolling(window='2D').sum() 2020-01-01 0.0 2020-01-02 1.0 2020-01-03 3.0 2020-01-04 5.0 2020-01-05 7.0 Freq: D, dtype: float64
部分窗口支持先分組再執(zhí)行窗口操作
>>> df = pd.DataFrame({'A':['a', 'b', 'a', 'b', 'a'],'B':range(5)}) >>> df A B 0 a 0 1 b 1 2 a 2 3 b 3 4 a 4 >>> df.groupby('A').expanding().sum() B A a 0 0.0 2 2.0 4 6.0 b 1 1.0 3 4.0
Rolling window
>>> times = ['2020-01-01', '2020-01-03', '2020-01-04', '2020-01-05', '2020-01-29'] >>> s = pd.Series(range(5),index = pd.DatetimeIndex(times)) >>> s 2020-01-01 0 2020-01-03 1 2020-01-04 2 2020-01-05 3 2020-01-29 4 dtype: int64 # 兩個觀測值的窗口 >>> s.rolling(2).sum() 2020-01-01 NaN 2020-01-03 1.0 2020-01-04 3.0 2020-01-05 5.0 2020-01-29 7.0 dtype: float64 # 兩天的窗口 >>> s.rolling('2D').sum() 2020-01-01 0.0 2020-01-03 1.0 2020-01-04 3.0 2020-01-05 5.0 2020-01-29 4.0 dtype: float64
Centering windows
窗口計(jì)算后默認(rèn)標(biāo)簽是窗口的最后一個,center可以使中間索引作為標(biāo)簽
>>> s = pd.Series(range(10)) >>> s.rolling(window=5).mean() 0 NaN 1 NaN 2 NaN 3 NaN 4 2.0 5 3.0 6 4.0 7 5.0 8 6.0 9 7.0 dtype: float64 >>> s.rolling(window=5, center=True).mean() 0 NaN 1 NaN 2 2.0 3 3.0 4 4.0 5 5.0 6 6.0 7 7.0 8 NaN 9 NaN dtype: float64
Rolling apply
自定義窗口計(jì)算公式
>>> import numpy as np >>> def mad(x): return np.fabs(x - x.mean()).mean() >>> s = pd.Series(range(10)) >>> s.rolling(window=4).apply(mad, raw=True) 0 NaN 1 NaN 2 NaN 3 1.0 4 1.0 5 1.0 6 1.0 7 1.0 8 1.0 9 1.0 dtype: float64
Weighted window
為窗口中的值添加權(quán)重
>>> s = pd.Series(range(10)) >>> s.rolling(window=5, win_type="gaussian").mean(std=0.1) 0 NaN 1 NaN 2 NaN 3 NaN 4 2.0 5 3.0 6 4.0 7 5.0 8 6.0 9 7.0 dtype: float64
到此這篇關(guān)于pandas庫之DataFrame滑動窗口的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)pandas DataFrame滑動窗口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python讀取excel指定列數(shù)據(jù)并寫入到新的excel方法
今天小編就為大家分享一篇python讀取excel指定列數(shù)據(jù)并寫入到新的excel方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07Python爬蟲爬取百度搜索內(nèi)容代碼實(shí)例
這篇文章主要介紹了Python爬蟲爬取百度搜索內(nèi)容代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06python 正則表達(dá)式貪婪模式與非貪婪模式原理、用法實(shí)例分析
這篇文章主要介紹了python 正則表達(dá)式貪婪模式與非貪婪模式原理、用法,結(jié)合實(shí)例形式詳細(xì)分析了python 正則表達(dá)式貪婪模式與非貪婪模式的功能、原理、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-10-10比較兩個numpy數(shù)組并實(shí)現(xiàn)刪除共有的元素
這篇文章主要介紹了比較兩個numpy數(shù)組并實(shí)現(xiàn)刪除共有的元素,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02python機(jī)器學(xué)習(xí)算法與數(shù)據(jù)降維分析詳解
這篇文章主要為大家介紹了python機(jī)器學(xué)習(xí)算法與數(shù)據(jù)降維的分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11Python設(shè)計(jì)模式編程中Adapter適配器模式的使用實(shí)例
這篇文章主要介紹了Python設(shè)計(jì)模式編程中Adapter適配器模式的使用實(shí)例,一般來說適配器模式可以細(xì)分為類適配器和對象適配器模式,需要的朋友可以參考下2016-03-03