TShopping

 找回密碼
 註冊
搜索
查看: 384|回復: 0

[教學] pandas 的 resample 函數做時間重採樣(降採樣和升採樣)

[複製鏈接]
發表於 2021-7-22 15:58:54 | 顯示全部樓層 |閱讀模式
 
Push to Facebook
我們可以生成不同頻率的時間索引,比如按小時、按天、按周、按月等等,因此就會引出另外一個問題,如果我們相對數據做不同頻率的轉換,該怎麼做,pandas庫中是否有現成的方法可供使用呢?帶著這個問題,我們本次就來學習下數據重採樣的知識。

首先,簡單解釋什麼是數據重採樣,所謂數據重採樣就是將數據原有的頻率轉換到另一個頻率上,如果是從低頻率轉換到高頻率,那麼就是升採樣,比如原來的數據是按月統計的,通過升採樣可以轉換為按日的序列數據;相反,如果原來的數據是按日的時間序列數據,通過轉換函數轉換為按月的時間序列數據,那麼我們就將這個過程稱為降採樣。不管是升採樣還是降採樣,都通過pandas中的resample函數完成,下面我們就具體來學習這個函數。

pandas.DataFrame.resample
pandas.DataFrame.resample()這個函數主要是用來對時間序列做頻率轉換,函數原型如下:

  1. DataFrame.resample(rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention='start', kind=None, loffset=None, limit=None, base=0, on=None, level=None)
複製代碼
各參數含義如下列表:

線性填充 pandas resample 降採樣 升採樣

線性填充 pandas  resample  降採樣 升採樣

降採樣(高頻數據到低頻數據)
上面我們已經知道了重採樣的函數和函數各參數的含義,下面我們就用一個例子演示降採樣的過程。為了方便觀察,這裡我們生成10條日數據,如下:
  1. import pandas as pd
  2. import numpy as np
  3. index=pd.date_range('20190115','20190125',freq='D')
  4. data1=pd.Series(np.arange(len(index)),index=index)
  5. data1
複製代碼

線性填充 pandas resample 降採樣 升採樣

線性填充 pandas  resample  降採樣 升採樣



如上圖,這裡有10條日數據,現在我們將這按日統計的數據通過降採樣的方法轉化為按3日求和統計的數據,如下:
  1. data1.resample(rule='3D',how='sum')
複製代碼

線性填充 pandas resample 降採樣 升採樣

線性填充 pandas  resample  降採樣 升採樣



降採樣
可以看到,原來10條按日統計的數據經過降採樣轉換變為4條(最後一條是2日的數據和)按每3天統計的數據,這就是降採樣的過程,這裡需要注意的是起算的節點。上面的例子中label這個參數默認的是left,現在我們改為right,看看有什麼區別,如下:
  1. data1.resample(rule='3D',how='sum',label='right')
複製代碼

線性填充 pandas resample 降採樣 升採樣

線性填充 pandas  resample  降採樣 升採樣


通過上面的對比,可以得出label這個參數控制了分組後聚合標籤的取值。在label為right的情況下,將取分箱右側的值作為新的標籤。上面這個例子基本上演示了降採樣的過程,當然我們可以調整how這個參數值進行不同的取值,如下:
  1. data1.resample(rule='3D',how='mean')#取3天的平均值
複製代碼

線性填充 pandas resample 降採樣 升採樣

線性填充 pandas  resample  降採樣 升採樣


也可以將聚合方法寫到外面,如下:
  1. data1.resample(rule='3D',how='mean')
複製代碼

線性填充 pandas resample 降採樣 升採樣

線性填充 pandas  resample  降採樣 升採樣




取3天的最小值作為新標籤值:

線性填充 pandas resample 降採樣 升採樣

線性填充 pandas  resample  降採樣 升採樣





升採樣(低頻數據到高頻數據)
上面演示了降採樣的過程,下面我們演示升採樣的過程,根據升採樣的定義,我們只需在resample函數中改變頻率即可,但與降採樣不同的是升採樣後新增頻率的數為空值,為此,rasample也提供了3種方式進行填充,下面我們通過代碼來演示。
  1. data1.resample(rule='6H').asfreq()
複製代碼

線性填充 pandas resample 降採樣 升採樣

線性填充 pandas  resample  降採樣 升採樣




可以看到,將原來的按日的數據進行升採樣為6小時時,會產生很多空值,對於這種空值resample提供了3種方式,分別為ffill(取前面的值)、bfill(取後面的值)、interpolate(線性取值),這裡我們分別進行測試,如下:
  1. data1.resample(rule='6H').ffill()
複製代碼

線性填充 pandas resample 降採樣 升採樣

線性填充 pandas  resample  降採樣 升採樣




按前面的值進行填充
可以看到,在ffill不帶任何數字的情況下,填充了所有的空值,這裡我們可以輸入個數,從而指定要填充的空值個數,如下:
  1. data1.resample(rule='6H').ffill(2)
複製代碼

線性填充 pandas resample 降採樣 升採樣

線性填充 pandas  resample  降採樣 升採樣




  1. data1.resample(rule='6H').bfill()
複製代碼

線性填充 pandas resample 降採樣 升採樣

線性填充 pandas  resample  降採樣 升採樣




用後面的值填充
  1. data1.resample(rule='6H').interpolate()
複製代碼

線性填充 pandas resample 降採樣 升採樣

線性填充 pandas  resample  降採樣 升採樣





文章出處


 

臉書網友討論
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2021-11-29 11:37 , Processed in 0.456064 second(s), 25 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表