您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何在python中使用時間序列,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
時間序列是日常生活中遇到的最常見的數據類型之一。股票價格、銷售數據、氣候數據、能源使用、甚至個人體重都是可以定期收集的數據。幾乎每個數據科學家都會在工作中遇到時間序列,能夠有效地處理這些數據是數據科學工具箱中的一項重要技能。
下面簡要介紹了如何在python中使用時間序列。這包括使用Pandas訪問倫敦家庭智能電表能耗數據的時間序列和一些數據操作。可以在此處檢索此帖子中使用的數據。包含了我認為可能有用的代碼。(https://data.london.gov.uk/dataset/smartmeter-energy-use-data-in-london-households)
讓我們從基礎知識開始看起,看看時間序列的定義:
時間序列是按時間順序索引,列出或繪制的數據點的集合。通常,時間序列是在連續的等間隔時間點采取的序列。因此,它是離散時間數據的序列。
時間序列數據圍繞相對確定的時間戳來組織的,因此,與隨機樣本相比,可能包含我們將嘗試提取的其他信息。
加載和處理時間序列
數據集
舉例來說,讓我們用千瓦時(每半小時)的能耗讀數數據為例,在2011年11月至2014年2月期間,我們從參與了英國電網公司領導的"低碳倫敦"項目的倫敦家庭提取樣本。我們可以制作一些探索圖,最好能夠對結構和范圍有概念,這也將使我們能夠尋找到需要糾正的最終缺失值。
對于本文的其余部分,我們將只關注DateTime和kWhcolumns。
重采樣
讓我們從簡單的重采樣技術開始。重采樣涉及更改時間序列觀察的頻率。你可能對重采樣時間序列數據感興趣的一個原因是特征工程。實際上,它可以用于為監督學習模型提供額外的結構或指出洞察學習問題。pandas中的重采樣方法類似于groupby方法,因為你實際上是按特定時間跨度來進行分組。然后,你可以指定重采樣的方法。讓我們通過查看一些例子使重采樣更加具體化。 我們將從每周總結開始:
data.resample()將用于重新對我們的DataFrame的kWh列進行采樣
"W"表示我們希望按周重采樣。
sum()用于表示我們希望在此期間使用的總和為kWh。
我們可以在每日總結中做同樣的事情,我們可以使用groupby和mean函數進行每小時總結:
為了進一步重采樣,pandas附帶了許多內置選項,你甚至可以定義自己的方法。以下兩個表分別提供了表周期選項以及可能用于重采樣的一些常用方法。
其他探索
以下是你可以對數據進行的一些探索:
建模與prophet框架
Facebook Prophet于2017年發布,它可用于Python和R. Prophet設計用于分析時間序列,每天的觀察顯示不同時間尺度上的模式。Prophet非常善于處理缺失的數據和對于趨勢的變化,并且通常能很好地處理異常值。它還具有用于假期對時間序列的影響進行建模和實現自定義變更點的高級功能,但我將堅持使用基礎知識建立并運行模型。我認為Prophet是做出快速預測的一個很好的選擇,因為它具有直觀的參數,可以由具有良好領域知識但缺乏預測模型技術技能的人對其進行調整。有關Prophet的更多信息,可以參考此處的官方文檔。(https://facebook.github.io/prophet/docs/quick_start.html)
在使用Prophet之前,我們將數據中的列重命名為正確的格式。 Date列必須被稱為'ds',而值列我們希望預測'y'。我們在下面的示例中使用了每日總結數據。
然后我們導入Prophet,創建一個模型并適合數據。在Prophet中,changepoint_prior_scale(https://facebook.github.io/prophet/docs/trend_changepoints.html)參數用于控制趨勢對變化的敏感程度,較高的值更敏感,較低的值不敏感。在嘗試了一系列值后,我將此參數從默認值0.05設置為0.10。
為了進行預測,我們需要創建所謂的未來數據幀。我們指定預測的未來周期(在我們的例子中為兩個月)和預測的頻率(每日)。 然后,我們使用我們創建的Prophet模型和未來的數據框進行預測。
這很簡單!未來的數據框包含未來兩個月的估計家庭消費。我們可以用一個圖來可視化預測:
黑點表示實際值,藍線表示預測值,淺藍色陰影區域表示不確定性。
如下圖所示,隨著我們未來的進一步發展,不確定區域也會增長,因為最初的不確定性會隨著時間的推移而傳播和增長。
Prophet也讓我們輕松地可視化整體趨勢和組件模式:
每年的模式都很有意思,因為它似乎表明秋季和冬季家庭消費增加,春季和夏季減少。直觀地說,這正是我們期望看到的。從周趨勢來看,周日的消費似乎比一周中的其他日子多。最后,總體趨勢表明,消費量在緩慢下降之前增加了一年。試圖解釋這一趨勢需要進一步調查。在下一篇文章中,我們將嘗試查找它是否與天氣有關。
LSTM預測
長期短期記憶復發神經網絡有望學習長時間的觀察序列。這篇題為"理解LSTM網絡"的文章在以易于理解的方式解釋底層復雜性方面做得非常出色。(http://colah.github.io/posts/2015-08-Understanding-LSTMs/)下圖是描述LSTM內部單元架構的圖像。
LSTM似乎非常適合時間序列預測。讓我們再次使用我們的每日總結數據。
LSTM對輸入數據的大小很敏感,特別是在使用sigmoid或tanh激活函數時。將數據重新調整到[0,1]或[-1,1]的范圍通常是一種很好的做法,也稱為規范化。我們可以使用scikit-learn庫中的MinMaxScaler預處理類輕松地規范化數據集。
現在我們可以將有序數據集拆分為訓練和測試數據集。下面的代碼計算了分割點的索引,并將數據分成訓練數據集,其中80%的觀測值可用于訓練我們的模型,剩下的20%用于測試模型。
我們可以定義一個函數來創建一個新的數據集,并使用該函數來準備建模的訓練和測試數據集。
LSTM網絡期望輸入數據以以下形式提供特定的陣列結構:[樣本,時間步驟,特性]。
我們的數據目前采用[樣本,特性]的形式,我們將問題定為每個樣本的兩個時間步驟。我們可以將準備好的訓練和測試輸入數據轉換為預期的結構,如下所示:
就這樣!我們現在已經準備好為我們的示例設計和調整我們的LSTM網絡。
從損失圖中,我們可以看到該模型在訓練和測試數據集上都具有類似的性能。
在下圖中,我們看到LSTM在擬合測試數據集方面做得非常好。
聚類
最后但同樣重要的是,我們還可以使用我們的示例數據進行聚類。有許多不同的方法來執行集群,其中一種方法是分層地形成集群。你可以通過兩種方式形成層次結構:從頂部開始拆分,或從底部開始合并。我決定在這篇文章中使用后者。
讓我們從數據開始,我們只需導入原始數據,并為一年中的某一天和一天中的小時添加兩列。
Linkage函數和樹狀圖
Linkage函數根據物體的相似性和距離信息將物體分組。這些新形成的集群彼此鏈接以創建更大的集群。這個過程被迭代,直到原始數據集中的所有對象鏈接到一個分層樹中。
對我們的數據進行聚類:
完成了!但"ward"是什么意思?這實際上是如何運作的?正如scipy linkage文檔所告訴我們的那樣,ward是可用于計算新形成的集群之間距離的方法之一。"ward"鏈接功能是Ward方差最小化算法。
現在讓我們來看看這種分層聚類的樹形圖。樹形圖是聚類的分層圖,其中樹形圖的長度表示到下一個聚類中心的距離。
如果這是你第一次看到樹狀圖,那看起來很嚇人,但不要擔心,讓我們把它分開:
· 在x軸上,你可以看到標簽。如果你沒有指定任何其他東西(比如我),它們就是X中樣本的索引。
· 在y軸上,你可以看到距離(在我們的例子中是word算法)。
· 水平線是集群合并
· 垂直線告訴你哪些集群/標簽是合并,形成新集群的一部分
· 水平線的高度告訴你新形成的集群所需要的距離
即使有解釋,先前的樹狀圖仍然不明顯。我們可以"削減"一點,以便能夠更好地查看數據。
好多了,不是嗎? 查看聚類文檔以了解更多信息并使用不同的參數。
上述內容就是如何在python中使用時間序列,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。