使用Pandas的resample函數處理時間序列數據的技巧

2021-03-02 DeepHub IMBA

時間序列數據在數據科學項目中很常見。通常,可能會對將時序數據重新採樣到要分析數據的頻率或從數據中汲取更多見解的頻率感興趣。

在本文中,我們將介紹一些使用Pandas resample()函數對時間序列數據進行重採樣的示例。我們將介紹以下常見問題,並應幫助您開始使用時序數據操作。

下採樣並執行聚合

使用自定義基數進行下採樣

上採樣和填充值

一個實際的例子


向下採樣和執行聚合

下採樣是將一個時間序列數據集重新採樣到一個更大的時間框架。例如,從幾分鐘到幾小時,從幾天到幾年。結果的行數將減少,並且可以使用mean()、min()、max()、sum()等聚合值。

讓我們通過一個示例來了解它是如何工作的。

假設我們有一個關於銷售的數據集。

df_sales = pd.read_csv(
  'sales_data.csv',
  parse_dates=['date'],
  index_col=['date']
)


要獲得每2小時添加的總銷售額,只需使用resample()將DataFrame向下採樣到2小時的容器中,並將落入容器中的時間戳的值相加。

df_sales.resample('2H').sum()

要執行多個聚合,我們可以向agg()方法傳遞一個聚合函數列表。

df_sales.resample('2H').agg(['min','max', 'sum'])

使用自定義基數向下採樣

默認情況下,對於平均細分為1天/月/年的頻率,聚合間隔的「原點」默認為0。所以2H頻率的結果範圍是00:00:00,02:00:00,04:00:00,…,22:00:00。

對於我們正在使用的銷售數據,第一個記錄的日期值為2017-01-02 09:02:03,因此將輸出範圍從09:00:00開始比從08:00開始更有意義。為此,我們可以使用參數base將聚合間隔的「原點」設置為不同的值,例如,set base=1,這樣結果範圍就可以從09:00:00開始。

df_sales.resample('2H', base=1).sum()

上採樣和填充值

上採樣是下採樣的相反操作。它將時間序列數據重新採樣到一個更小的時間框架。例如,從小時到分鐘,從年到天。結果將增加行數,並且附加的行值默認為NaN。內置的方法ffill()和bfill()通常用於執行前向填充或後向填充來替代NaN。

讓我們為演示創建一個DataFrame。

df = pd.DataFrame(
  { 'value': [1, 2, 3] },
  index=pd.period_range(
      '2012-01-01',
        freq='A',
        periods=3
  )
)

按季度重新採樣一年並向前填充值。前向填充方法ffill()將使用最後一個已知值來替換NaN。

df.resample('Q').ffill()

按季度重新採樣一年並向後填充值。向後填充方法bfill()將使用下一個已知值來替換NaN。

df.resample('Q').bfill()

一個實際的例子

讓我們看看如何使用Pandas resample()來處理一個現實世界的問題。

假設我們有兩個數據集,一個是月銷售額df_sales,另一個是價格df_price。df_price只有關於價格變化的記錄。

我們想計算一下每個月的銷售總額,下面是預期的產量。

這個計算中比較困難的部分是,我們需要檢索每個月的價格,並將其合併到數據中,以便計算總價格。

一種簡潔的解決方案是使用Pandas的resample()函數。一行代碼可以檢索每個月的價格。

步驟1:按月重新取樣價格數據集,並向前填充值

df_price = df_price.resample('M').ffill()

通過調用resample('M')來按月重新採樣給定的時間序列。在此之後,調用ffill()來轉發填充值。你是不是有點困惑?查看下面的圖片了解細節。

步驟2:結合結果並計算總銷售額

df = pd.concat([df_sales, df_price], axis = 1)
df['total_sales'] = df['num_sold'] * df['price']

使用參數axis=1的Pandas concat()函數水平組合df_sales和df_price。在此之後,可以使用元素方面的乘法df['num_sold'] * df['price']來計算總銷售額。

通過執行上述語句,您應該得到如下輸出:

結論

Pandas resample()函數是一個簡單、強大、高效的函數,用於在頻率轉換期間執行重採樣操作。

我希望本文能幫助您節省分析時間序列數據的時間。我建議您查看resample() API的文檔,了解您可以做的其他事情。

感謝你的閱讀。如果您對機器學習的實踐方面感興趣,請查看筆記本以獲取原始碼

https://github.com/BindiChen/machine-learning/blob/master/data-analysis/020-pandas-resample/pandas-resample.ipynb


作者:B. Chen

deephub翻譯組


相關焦點

  • Python數據分析實戰:用Pandas 處理時間序列
    ,在數據科學和機器學習的背景下,時間序列分析所包含的內容更加複雜。今天我們就討論pandas在時間序列處理中應用。這裡我們採用美國能源消耗數據集進行分析和討論,數據集可以在kaggle上下載,如果有問題,可以留言討論。該數據集包含了美國一家能源公司的長達數十年的能源消耗數據,數據解析度為小時。
  • Pandas處理時間序列數據的20個關鍵知識點
    舉幾個例子:一段時間內的股票價格每天,每周,每月的銷售額流程中的周期性度量一段時間內的電力或天然氣消耗率在這篇文章中,我將列出20個要點,幫助你全面理解如何用Pandas處理時間序列數據。1.不同形式的時間序列數據時間序列數據可以是特定日期、持續時間或固定的自定義間隔的形式。時間戳可以是給定日期的一天或一秒,具體取決於精度。
  • Pandas處理時間序列數據的20個關鍵知識點
    2.時間序列數據結構Pandas提供靈活和高效的數據結構來處理各種時間序列數據。歐洲風格的日期我們可以使用to_datetime函數處理歐洲風格的日期(即日期在先)。dayfirst參數被設置為True。
  • resample()函數! 【量化小講堂】極簡方法將日線數據轉為周線、月線或其他周期
    如何快速上手使用Python進行金融數據分析2. windows下如何安裝Python、pandas3.統計師的Python日記【第2天:再接著介紹一下Python唄】→ 本集涉及到的一些知識(您可以先看看,也可以看完原文再回過來按需索取):pandas裡的resample函數:重採樣(resampling)指的是將時間序列從一個頻率轉換到另一個頻率的過程。
  • Pandas處理時序數據(初學者必會)!
    每日乾貨 & 每月組隊學習,不錯過作者:耿遠昊,Datawhale成員,華東師範大學時序數據是指時間序列數據時間序列數據是同一統一指標按時間順序記錄的數據列。在同一數據列中的各個數據必須是同口徑的,要求具有可比性。時序數據可以是時期數,也可以時點數。時間序列分析的目的是通過找出樣本內時間序列的統計特性和發展規律性,構建時間序列模型,進行樣本外預測。本文目錄    1. 時序的創建        1.1.
  • python時間序列分析之_用pandas中的rolling函數計算時間窗口數據
    上篇文章中,我們講解了如何對時間數據進行重採樣及重採樣中降採樣和升採樣的概覽和使用方法,通過重採樣我們可以得到任何想要頻率的數據,但是這些數據也是一個時點的數據,那麼就存在這樣一個問題:時點的數據波動較大,某一點的數據不能很好的表現它本身的特性,於是我們就想,能否用一個區間的的數據去表現呢,這樣數據的準確性是不是更好一些呢?
  • Pandas 數據處理|Datetime 時間模塊在 Pandas 中的使用
    Datatime 作為 Python 中的時間模塊類型,處理時間有關數據是非常方便的, Pandas 作為數據分析程序包同樣也支持 DataTime 數據機制,例如1,函數 to_datetime() 將數據列表中的 Series 列轉化為 datetime 類型,#Convert the type to datetimeapple.Date =
  • 數據處理利器pandas入門
    我們以全國空氣品質歷史數據(http://beijingair.sinaapp.com)為例,通過實際的數據處理來介紹一下常用的操作。因為 .loc 只能用於行列標籤索引,整數位置索引需要使用 .iloc。
  • Pandas的介紹與基本使用
    1、什麼是Pandas當大家談論到數據分析時,提及最多的語言就是Python和SQL,而Python之所以適合做數據分析,就是因為他有很多強大的第三方庫來協助,pandas就是其中之一,它是基於Numpy構建的,正因pandas的出現,讓Python語言也成為使用最廣泛而且強大的數據分析環境之一。
  • Pandas中groupby的這些用法你都知道嗎?
    是pandas中用於數據分析的一個重要功能,其功能與SQL中的分組操作類似,但功能卻更為強大。這裡apply函數實際上是一個應用非常廣泛的轉換函數,例如面向series對象,apply函數的處理粒度是series的每個元素(標量);面向dataframe對象,apply函數的處理粒度是dataframe的一行或一列(series
  • Pandas 數據處理 | Datetime 時間模塊在 Pandas 中的使用
    Datatime 作為 Python 中的時間模塊類型,處理時間有關數據是非常方便的, Pandas 作為數據分析程序包同樣也支持 DataTime 數據機制,例如1,函數 to_datetime() 將數據列表中的 Series 列轉化為 datetime 類型,#Convert the type to datetimeapple.Date
  • 【數據分析】Pandas
    Python數據分析的工具包,它是基於Numpy構建的,正因pandas的出現,讓Python語言也成為使用最廣泛而且強大的數據分析環境之一。4、時間對象處理時間序列類型時間戳:特定時刻固定時期:如2019年1月時間間隔:起始時間-結束時間Python庫:datatime靈活處理時間對象:dateutil包
  • Pandas入門(時間序列)
    一.時間戳(Timestamp)
  • 使用Pandas進行數據處理
    引言我們將深入講解pandas庫在數據處理階段的功能數據處理又可以細分為三個階段,我們將通過例子詳細講解各個階段都會涉及哪些操作,以及如何充分利用pandas庫提供的函數來完成這些操作。數據處理的三個階段為:數據準備、數據轉換和數據聚合。數據準備開始處理數據工作之前,需要先行準備好數據,把數據組裝成便於用pandas庫的各種工具處理的數據結構。
  • 使用Pandas數據處理與分析
    前言:這是關於個人關於對pandas可以進行的數據處理和數據分析的見解的初版,其中肯定不乏一些錯誤之處,希望大家能多多指正。pandas提供了一些用於將表格型數據讀取為DataFrame對象的函數。這些pandas的解析函數參數較為複雜,具體了解可以在pandas官網上自行查閱,或者可以再Jupyter Notebook 中採用help(pd.read_excel)命令查閱。2.審閱數據在成功導入數據以後,需要對數據進行審閱,目的是,了解數據結構、類型、大小等情況。
  • 寫一個resample的函數
    之前因為需要自己寫了一個resample的函數。因為傳統實現resample的方法好像沒有做迭代,只會重抽一次。這就導致了每次重抽會有一些差別。於是我加入了迭代。懶得寫成獨立的函數了,就這樣放出來,可以看到我每一步的想法。思路是對於每個樣本,先將每一個OTU和其對應的序列數相乘,從這個結果中進行重抽,並加入迭代。
  • 用 Pandas 玩轉時間序列數據
    進行金融數據分析或量化研究時,總避免不了時間序列數據的處理,時間序列是指在一定時間內按時間順序測量的某個變量的取值序列。常見的時間序列數據有一天內隨著時間變化的溫度序列,又或者交易時間內不斷波動的股票價格序列。
  • 掌握pandas中的transform
    ❝本文示例代碼及文件已上傳至我的Github倉庫https://github.com/CNFeffery/DataScienceStudyNotes❞1 簡介開門見山,在pandas中,transform是一類非常實用的方法,通過它我們可以很方便地將某個或某些函數處理過程(非聚合)作用在傳入數據的每一列上,從而返回與輸入數據形狀一致的運算結果
  • 數據處理技巧 | 帶你了解Pandas.groupby() 常用數據處理方法
    今天我們繼續推出一篇數據處理常用的操作技能匯總:靈活使用pandas.groupby()函數,實現數據的高效率處理,主要內容如下:pandas.groupby()三大主要操作介紹說到使用Python進行數據處理分析,那就不得不提其優秀的數據分析庫-Pandas,
  • Python數據處理庫pandas入門教程
    另外,pandas常常和NumPy一起使用,本文中的源碼中也會用到NumPy。建議讀者先對NumPy有一定的熟悉再來學習pandas,我之前也寫過一個NumPy的基礎教程,參見這裡:Python 機器學習庫 NumPy 教程核心數據結構pandas最核心的就是Series和DataFrame兩個數據結構。