本文示例代碼及文件已上傳至個人
Github
倉庫https://github.com/CNFeffery/DataScienceStudyNotesgit
咱們在使用pandas
分析處理時間序列數據時,常常須要對原始時間粒度下的數據,按照不一樣的時間粒度進行分組聚合運算,譬如基於每一個交易日的股票收盤價,計算每月的最低和最高收盤價。github
而在pandas
中,針對不一樣的應用場景,咱們可使用resample()
、groupby()
以及Grouper()
來很是高效快捷地完成此類任務。app
在pandas
中根據具體任務場景的不一樣,對時間序列進行分組聚合可經過如下兩類方式實現:code
resample
原始的意思是重採樣,可分爲上採樣與下采樣,而咱們一般狀況下使用的都是下采樣,也就是從高頻的數據中按照必定規則計算出更低頻的數據,就像咱們一開始說的對每日數據按月彙總那樣。orm
若是你熟悉pandas
中的groupby()
分組運算,那麼你就能夠很快地理解resample()
的使用方式,它本質上就是在對時間序列數據進行「分組」,最基礎的參數爲rule
,用於設置按照何種方式進行重採樣,就像下面的例子那樣:blog
import pandas as pd # 記錄了2013-02-08到2018-02-07之間每一個交易日蘋果公司的股價 AAPL = pd.read_csv('AAPL.csv', parse_dates=['date']) # 以月爲統計窗口計算每個月股票最高收盤價 ( AAPL .set_index('date') # 設置date爲index .resample('M') # 以月爲單位 .agg({ 'close': ['max', 'min'] }) )
能夠看到,在上面的例子中,咱們對index爲日期時間類型的DataFrame
應用resample()
方法,傳入的參數'M'
是resample
第一個位置上的參數rule
,用於肯定時間窗口的規則,譬如這裏的字符串'M'
就表明月且聚合結果中顯示對應月的最後一天,經常使用的固化的時間窗口規則以下表所示:ci
規則 | 說明 |
---|---|
W | 星期 |
M | 月,顯示爲當月最後一天 |
MS | 月,顯示爲當月第一天 |
Q | 季度,顯示爲當季最後一天 |
QS | 季度,顯示爲當季第一天 |
A | 年,顯示爲當年最後一天 |
AS | 年,顯示爲當年第一天 |
D | 日 |
H | 小時T |
T或min | 分鐘 |
S | 秒 |
L或 ms | 毫秒 |
且這些規則均可以在前面添加數字實現倍數效果:字符串
# 以6個月爲統計窗口計算每個月股票平均收盤價且顯示爲當月第一天 ( AAPL .set_index('date') # 設置date爲index .resample('6MS') # 以6個月爲單位 .agg({ 'close': 'mean' }) )
且resample()
很是貼心之處在於它會自動幫你對齊到規整的時間單位上,譬如咱們這裏只有交易日纔會有記錄,若是咱們設置的時間單位下無對應記錄,也會爲你保留帶有缺失值記錄的時間點:get
( AAPL .set_index('date') # 設置date爲index .resample('1D') # 以1日爲單位 .agg({ 'close': 'mean' }) )
而經過參數closed
咱們能夠爲細粒度的時間單位設置區間閉合方式,譬如咱們以2日爲單位,將closed
設置爲'right'
時,從第一行記錄開始計算所落入的時間窗口時,其對應爲時間窗口的右邊界,從而影響後續全部時間單元的劃分方式:pandas
( AAPL .set_index('date') # 設置date爲index .resample('2D', closed='right') .agg({ 'close': 'mean' }) )
而即便你的數據框index
不是日期時間類型,也可使用參數on
來傳入日期時間列名實現一樣的效果。
有些狀況下,咱們不單單須要利用時間類型列來分組,也可能須要包含時間類型在內的多個列共同進行分組,這種狀況下咱們就可使用到Grouper()
。
它經過參數freq
傳入等價於resample()
中rule
的參數,並利用參數key
指定對應的時間類型列名稱,可是能夠幫助咱們建立分組規則後傳入groupby()
中:
# 分別對蘋果與微軟每個月平均收盤價進行統計 ( pd .read_csv('AAPL&MSFT.csv', parse_dates=['date']) .groupby(['Name', pd.Grouper(freq='MS', key='date')]) .agg({ 'close': 'mean' }) )
且在此種混合分組模式下,咱們能夠很是方便的配合apply
、transform
等操做,這裏就再也不贅述。
以上就是本文的所有內容,歡迎在評論區與我進行討論~