您好,登錄后才能下訂單哦!
小編給大家分享一下pandas中時序數(shù)據(jù)分組運算的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
我們在使用pandas
分析處理時間序列數(shù)據(jù)時,經(jīng)常需要對原始時間粒度下的數(shù)據(jù),按照不同的時間粒度進行分組聚合運算,譬如基于每個交易日的股票收盤價,計算每個月的最低和最高收盤價。
而在pandas
中,針對不同的應(yīng)用場景,我們可以使用resample()
、groupby()
以及Grouper()
來非常高效快捷地完成此類任務(wù)。
在pandas
中根據(jù)具體任務(wù)場景的不同,對時間序列進行分組聚合可通過以下兩類方式實現(xiàn):
resample
原始的意思是「重采樣」,可分為「上采樣」與「下采樣」,而我們通常情況下使用的都是「下采樣」,也就是從高頻的數(shù)據(jù)中按照一定規(guī)則計算出更低頻的數(shù)據(jù),就像我們一開始說的對每日數(shù)據(jù)按月匯總那樣。
如果你熟悉pandas
中的groupby()
分組運算,那么你就可以很快地理解resample()
的使用方式,它本質(zhì)上就是在對時間序列數(shù)據(jù)進行“分組”,最基礎(chǔ)的參數(shù)為rule
,用于設(shè)置按照何種方式進行重采樣,就像下面的例子那樣:
import pandas as pd
# 記錄了2013-02-08到2018-02-07之間每個交易日蘋果公司的股價
AAPL = pd.read_csv('AAPL.csv', parse_dates=['date'])
# 以月為統(tǒng)計窗口計算每月股票最高收盤價
(
AAPL
.set_index('date') # 設(shè)置date為index
.resample('M') # 以月為單位
.agg({
'close': ['max', 'min']
})
)
可以看到,在上面的例子中,我們對index為日期時間類型的DataFrame
應(yīng)用resample()
方法,傳入的參數(shù)'M'
是resample
第一個位置上的參數(shù)rule
,用于確定時間窗口的規(guī)則,譬如這里的字符串'M'
就代表「月且聚合結(jié)果中顯示對應(yīng)月的最后一天」,常用的固化的時間窗口規(guī)則如下表所示:
規(guī)則 | 說明 |
---|---|
W | 星期 |
M | 月,顯示為當月最后一天 |
MS | 月,顯示為當月第一天 |
Q | 季度,顯示為當季最后一天 |
QS | 季度,顯示為當季第一天 |
A | 年,顯示為當年最后一天 |
AS | 年,顯示為當年第一天 |
D | 日 |
H | 小時T |
T或min | 分鐘 |
S | 秒 |
L或 ms | 毫秒 |
且這些規(guī)則都可以在前面添加數(shù)字實現(xiàn)倍數(shù)效果:
# 以6個月為統(tǒng)計窗口計算每月股票平均收盤價且顯示為當月第一天
(
AAPL
.set_index('date') # 設(shè)置date為index
.resample('6MS') # 以6個月為單位
.agg({
'close': 'mean'
})
)
且resample()
非常貼心之處在于它會自動幫你對齊到規(guī)整的時間單位上,譬如我們這里只有交易日才會有記錄,如果我們設(shè)置的時間單位下無對應(yīng)記錄,也會為你保留帶有缺失值記錄的時間點:
(
AAPL
.set_index('date') # 設(shè)置date為index
.resample('1D') # 以1日為單位
.agg({
'close': 'mean'
})
)
而通過參數(shù)closed
我們可以為細粒度的時間單位設(shè)置區(qū)間閉合方式,譬如我們以2日為單位,將closed
設(shè)置為'right'
時,從第一行記錄開始計算所落入的時間窗口時,其對應(yīng)為時間窗口的右邊界,從而影響后續(xù)所有時間單元的劃分方式:
(
AAPL
.set_index('date') # 設(shè)置date為index
.resample('2D', closed='right')
.agg({
'close': 'mean'
})
)
而即使你的數(shù)據(jù)框index
不是日期時間類型,也可以使用參數(shù)on
來傳入日期時間列名實現(xiàn)同樣的效果。
有些情況下,我們不僅僅需要利用時間類型列來分組,也可能需要包含時間類型在內(nèi)的多個列共同進行分組,這種情況下我們就可以使用到Grouper()
。
它通過參數(shù)freq
傳入等價于resample()
中rule
的參數(shù),并利用參數(shù)key
指定對應(yīng)的時間類型列名稱,但是可以幫助我們創(chuàng)建分組規(guī)則后傳入groupby()
中:
# 分別對蘋果與微軟每月平均收盤價進行統(tǒng)計
(
pd
.read_csv('AAPL&MSFT.csv', parse_dates=['date'])
.groupby(['Name', pd.Grouper(freq='MS', key='date')])
.agg({
'close': 'mean'
})
)
且在此種混合分組模式下,我們可以非常方便的配合apply
、transform
等操作,這里就不再贅述。
以上是“pandas中時序數(shù)據(jù)分組運算的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。