時間序列數據在數據科學項目中很常見。 通常,可能會對將時序數據重新採樣到要分析數據的頻率或從數據中汲取更多見解的頻率感興趣。
在本文中,我們將介紹一些使用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()來處理一個現實世界的問題。
假設我們有兩個數據集,一個是月銷售額dfsales,另一個是價格dfprice。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()函數水平組合dfsales和dfprice。在此之後,可以使用元素方面的乘法df['num_sold'] * df['price']來計算總銷售額。
通過執行上述語句,您應該得到如下輸出:
結論
Pandas resample()函數是一個簡單、強大、高效的函數,用於在頻率轉換期間執行重採樣操作。
我希望本文能幫助您節省分析時間序列數據的時間。我建議您查看resample() API的文檔,了解您可以做的其他事情。
感謝你的閱讀。如果您對機器學習的實踐方面感興趣,請查看筆記本以獲取原始碼,請繼續關注。
github/BindiChen/machine-learning/blob/master/data-analysis/020-pandas-resample/pandas-resample.ipynb
作者:B. Chen
deephub翻譯組