點擊上方"藍字"關注咱們git
記錄 分享 成長github
❝本文示例代碼及文件已上傳至個人
❞Github
倉庫https://github.com/CNFeffery/DataScienceStudyNotesweb
1 簡介
咱們在使用pandas
分析處理時間序列數據時,常常須要對原始時間粒度下的數據,按照不一樣的時間粒度進行分組聚合運算,譬如基於每一個交易日的股票收盤價,計算每月的最低和最高收盤價。微信
而在pandas
中,針對不一樣的應用場景,咱們可使用resample()
、groupby()
以及Grouper()
來很是高效快捷地完成此類任務。app
2 在pandas中進行時間分組聚合
在pandas
中根據具體任務場景的不一樣,對時間序列進行分組聚合可經過如下兩類方式實現:less
2.1 利用resample()對時序數據進行分組聚合
resample
原始的意思是「重採樣」,可分爲「上採樣」與「下采樣」,而咱們一般狀況下使用的都是「下采樣」,也就是從高頻的數據中按照必定規則計算出更低頻的數據,就像咱們一開始說的對每日數據按月彙總那樣。編輯器
若是你熟悉pandas
中的groupby()
分組運算,那麼你就能夠很快地理解resample()
的使用方式,它本質上就是在對時間序列數據進行「分組」,最基礎的參數爲rule
,用於設置按照何種方式進行重採樣,就像下面的例子那樣:大數據
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'
就表明「月且聚合結果中顯示對應月的最後一天」,經常使用的固化的時間窗口規則以下表所示:flex
規則 | 說明 |
---|---|
W | 星期 |
M | 月,顯示爲當月最後一天 |
MS | 月,顯示爲當月第一天 |
Q | 季度,顯示爲當季最後一天 |
QS | 季度,顯示爲當季第一天 |
A | 年,顯示爲當年最後一天 |
AS | 年,顯示爲當年第一天 |
D | 日 |
H | 小時T |
T或min | 分鐘 |
S | 秒 |
L或 ms | 毫秒 |
且這些規則均可以在前面添加數字實現倍數效果:ui
# 以6個月爲統計窗口計算每個月股票平均收盤價且顯示爲當月第一天
(
AAPL
.set_index('date') # 設置date爲index
.resample('6MS') # 以6個月爲單位
.agg({
'close': 'mean'
})
)
且resample()
很是貼心之處在於它會自動幫你對齊到規整的時間單位上,譬如咱們這裏只有交易日纔會有記錄,若是咱們設置的時間單位下無對應記錄,也會爲你保留帶有缺失值記錄的時間點:
(
AAPL
.set_index('date') # 設置date爲index
.resample('1D') # 以1日爲單位
.agg({
'close': 'mean'
})
)
而經過參數closed
咱們能夠爲細粒度的時間單位設置區間閉合方式,譬如咱們以2日爲單位,將closed
設置爲'right'
時,從第一行記錄開始計算所落入的時間窗口時,其對應爲時間窗口的右邊界,從而影響後續全部時間單元的劃分方式:
(
AAPL
.set_index('date') # 設置date爲index
.resample('2D', closed='right')
.agg({
'close': 'mean'
})
)
而即便你的數據框index
不是日期時間類型,也可使用參數on
來傳入日期時間列名實現一樣的效果。
2.2 利用groupby()+Grouper()實現混合分組
有些狀況下,咱們不只僅須要利用時間類型列來分組,也可能須要包含時間類型在內的多個列共同進行分組,這種狀況下咱們就可使用到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
等操做,這裏就再也不贅述。
以上就是本文的所有內容,歡迎在評論區與我進行討論~
加入咱們的知識星球【Python大數據分析】
愛上數據分析!
Python大數據分析
data creates value
掃碼關注咱們
本文分享自微信公衆號 - 氣象雜貨鋪(meteogs)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。