掌握pandas中的時序數據分組運算

點擊上方"藍字"關注咱們git





Python大數據分析


記錄   分享   成長github


添加微信號" CNFeffery "加入技術交流羣

本文示例代碼及文件已上傳至個人Github倉庫https://github.com/CNFeffery/DataScienceStudyNotesweb

1 簡介

咱們在使用pandas分析處理時間序列數據時,常常須要對原始時間粒度下的數據,按照不一樣的時間粒度進行分組聚合運算,譬如基於每一個交易日的股票收盤價,計算每月的最低和最高收盤價。微信

而在pandas中,針對不一樣的應用場景,咱們可使用resample()groupby()以及Grouper()來很是高效快捷地完成此類任務。app

圖1

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']
    })
)

圖2

能夠看到,在上面的例子中,咱們對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'
    })
)

圖3

resample()很是貼心之處在於它會自動幫你對齊到規整的時間單位上,譬如咱們這裏只有交易日纔會有記錄,若是咱們設置的時間單位下無對應記錄,也會爲你保留帶有缺失值記錄的時間點:

(
    AAPL
    .set_index('date'# 設置date爲index
    .resample('1D'# 以1日爲單位
    .agg({
        'close''mean'
    })
)

圖4

而經過參數closed咱們能夠爲細粒度的時間單位設置區間閉合方式,譬如咱們以2日爲單位,將closed設置爲'right'時,從第一行記錄開始計算所落入的時間窗口時,其對應爲時間窗口的右邊界,從而影響後續全部時間單元的劃分方式:

(
    AAPL
    .set_index('date'# 設置date爲index
    .resample('2D', closed='right')
    .agg({
        'close''mean'
    })
)

圖5

而即便你的數據框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'
    })
)

圖6

且在此種混合分組模式下,咱們能夠很是方便的配合applytransform等操做,這裏就再也不贅述。


以上就是本文的所有內容,歡迎在評論區與我進行討論~

加入咱們的知識星球【Python大數據分析】

愛上數據分析!



· 往期精選 ·
1

Github | 推薦一個Python腳本集合項目

2

在模仿中精進數據可視化05:疫情期間市值增加top25公司

3

最詳細的PyCharm 安裝+破解詳細使用指南




Python大數據分析

data creates value

掃碼關注咱們

本文分享自微信公衆號 - 氣象雜貨鋪(meteogs)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索