您好,登錄后才能下訂單哦!
在建模過(guò)程中,我們常常需要需要對(duì)有時(shí)間關(guān)系的數(shù)據(jù)進(jìn)行整理。比如我們想要得到某一時(shí)刻過(guò)去30分鐘的銷量(產(chǎn)量,速度,消耗量等),傳統(tǒng)方法復(fù)雜消耗資源較多,pandas提供的rolling使用簡(jiǎn)單,速度較快。
函數(shù)原型和參數(shù)說(shuō)明
DataFrame.rolling(window, min_periods=None, freq=None, center=False, win_type=None, on=None, axis=0, closed=None)
window:表示時(shí)間窗的大小,注意有兩種形式(int or offset)。如果使用int,則數(shù)值表示計(jì)算統(tǒng)計(jì)量的觀測(cè)值的數(shù)量即向前幾個(gè)數(shù)據(jù)。如果是offset類型,表示時(shí)間窗的大小。pandas offset相關(guān)可以參考這里。
min_periods:最少需要有值的觀測(cè)點(diǎn)的數(shù)量,對(duì)于int類型,默認(rèn)與window相等。對(duì)于offset類型,默認(rèn)為1。
freq:從0.18版本中已經(jīng)被舍棄。
center:是否使用window的中間值作為label,默認(rèn)為false。只能在window是int時(shí)使用。
# 為方便觀察,并列排列 df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]}) df.rolling(3, min_periods=1).sum() df.rolling(3, min_periods=1, center=True).sum() B B1 B2 0 0.0 0.0 1.0 1 1.0 1.0 3.0 2 2.0 3.0 3.0 3 NaN 3.0 6.0 4 4.0 6.0 4.0
win_type:窗口類型,默認(rèn)為None一般不特殊指定,了解支持的其他窗口類型,參考這里。
on:對(duì)于DataFrame如果不使用index(索引)作為rolling的列,那么用on來(lái)指定使用哪列。
closed:定義區(qū)間的開閉,曾經(jīng)支持int類型的window,新版本已經(jīng)不支持了。對(duì)于offset類型默認(rèn)是左開右閉的即默認(rèn)為right??梢愿鶕?jù)情況指定為left both等。
axis:方向(軸),一般都是0。
舉例
一個(gè)簡(jiǎn)單的場(chǎng)景,從A向B運(yùn)送東西,我們想看一下以3秒作為一個(gè)時(shí)間窗運(yùn)送的量。
# A地有兩個(gè)倉(cāng)庫(kù),都運(yùn)往B。 df = pd.DataFrame({'1': ['A1', 'A2', 'A1', 'A2', 'A2', 'A1', 'A2'], '2': ['B1', 'B1', 'B1', 'B1', 'B1', 'B1', 'B1'], 'num': [1,2,1,3,4,2,1]}, index = [pd.Timestamp('20130101 09:00:00'), pd.Timestamp('20130101 09:00:01'), pd.Timestamp('20130101 09:00:02'), pd.Timestamp('20130101 09:00:03'), pd.Timestamp('20130101 09:00:04'), pd.Timestamp('20130101 09:00:05'), pd.Timestamp('20130101 09:00:06')]) # 1 2 num # 2013-01-01 09:00:00 A1 B1 1 # 2013-01-01 09:00:01 A2 B1 2 # 2013-01-01 09:00:02 A1 B1 1 # 2013-01-01 09:00:03 A2 B1 3 # 2013-01-01 09:00:04 A2 B1 4 # 2013-01-01 09:00:05 A1 B1 2 # 2013-01-01 09:00:06 A2 B1 1
使用rolling進(jìn)行計(jì)算
# 首先我們先對(duì)groupby進(jìn)行聚合(如果只有從A->B,那么不用聚合一個(gè)rolling就可以) # 以9:00:04秒為例,由于時(shí)間窗是3s,默認(rèn)的closed是right,所以我們相加04,03,02秒的num,共有4+3+0=7 df.groupby(['1', '2'])['num'].rolling('3s').sum() # 1 2 # A1 B1 2013-01-01 09:00:00 1.0 # 2013-01-01 09:00:02 2.0 # 2013-01-01 09:00:05 2.0 # A2 B1 2013-01-01 09:00:01 2.0 # 2013-01-01 09:00:03 5.0 # 2013-01-01 09:00:04 7.0 # 2013-01-01 09:00:06 5.0 # Name: num, dtype: float64
由于使用groupby,所以最后的結(jié)果是MultiIndex,想使用正常格式在DataFrame上使用reset_index()即可。
以上這篇對(duì)pandas中時(shí)間窗函數(shù)rolling的使用詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。