溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何在python中使用時間序列

發(fā)布時間:2021-12-04 16:00:25 來源:億速云 閱讀:206 作者:柒染 欄目:互聯(lián)網(wǎng)科技

本篇文章為大家展示了如何在python中使用時間序列,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

時間序列是日常生活中遇到的最常見的數(shù)據(jù)類型之一。股票價格、銷售數(shù)據(jù)、氣候數(shù)據(jù)、能源使用、甚至個人體重都是可以定期收集的數(shù)據(jù)。幾乎每個數(shù)據(jù)科學(xué)家都會在工作中遇到時間序列,能夠有效地處理這些數(shù)據(jù)是數(shù)據(jù)科學(xué)工具箱中的一項(xiàng)重要技能。

如何在python中使用時間序列

下面簡要介紹了如何在python中使用時間序列。這包括使用Pandas訪問倫敦家庭智能電表能耗數(shù)據(jù)的時間序列和一些數(shù)據(jù)操作??梢栽诖颂帣z索此帖子中使用的數(shù)據(jù)。包含了我認(rèn)為可能有用的代碼。(https://data.london.gov.uk/dataset/smartmeter-energy-use-data-in-london-households)

讓我們從基礎(chǔ)知識開始看起,看看時間序列的定義:

時間序列是按時間順序索引,列出或繪制的數(shù)據(jù)點(diǎn)的集合。通常,時間序列是在連續(xù)的等間隔時間點(diǎn)采取的序列。因此,它是離散時間數(shù)據(jù)的序列。

時間序列數(shù)據(jù)圍繞相對確定的時間戳來組織的,因此,與隨機(jī)樣本相比,可能包含我們將嘗試提取的其他信息。

加載和處理時間序列

數(shù)據(jù)集

舉例來說,讓我們用千瓦時(每半小時)的能耗讀數(shù)數(shù)據(jù)為例,在2011年11月至2014年2月期間,我們從參與了英國電網(wǎng)公司領(lǐng)導(dǎo)的"低碳倫敦"項(xiàng)目的倫敦家庭提取樣本。我們可以制作一些探索圖,最好能夠?qū)Y(jié)構(gòu)和范圍有概念,這也將使我們能夠?qū)ふ业叫枰m正的最終缺失值。

如何在python中使用時間序列

對于本文的其余部分,我們將只關(guān)注DateTime和kWhcolumns。

如何在python中使用時間序列

如何在python中使用時間序列

重采樣

讓我們從簡單的重采樣技術(shù)開始。重采樣涉及更改時間序列觀察的頻率。你可能對重采樣時間序列數(shù)據(jù)感興趣的一個原因是特征工程。實(shí)際上,它可以用于為監(jiān)督學(xué)習(xí)模型提供額外的結(jié)構(gòu)或指出洞察學(xué)習(xí)問題。pandas中的重采樣方法類似于groupby方法,因?yàn)槟銓?shí)際上是按特定時間跨度來進(jìn)行分組。然后,你可以指定重采樣的方法。讓我們通過查看一些例子使重采樣更加具體化。 我們將從每周總結(jié)開始:

  • data.resample()將用于重新對我們的DataFrame的kWh列進(jìn)行采樣

  • "W"表示我們希望按周重采樣。

  • sum()用于表示我們希望在此期間使用的總和為kWh。

如何在python中使用時間序列

我們可以在每日總結(jié)中做同樣的事情,我們可以使用groupby和mean函數(shù)進(jìn)行每小時總結(jié):

如何在python中使用時間序列

如何在python中使用時間序列

為了進(jìn)一步重采樣,pandas附帶了許多內(nèi)置選項(xiàng),你甚至可以定義自己的方法。以下兩個表分別提供了表周期選項(xiàng)以及可能用于重采樣的一些常用方法。

如何在python中使用時間序列

如何在python中使用時間序列

其他探索

以下是你可以對數(shù)據(jù)進(jìn)行的一些探索:

如何在python中使用時間序列

如何在python中使用時間序列

如何在python中使用時間序列

如何在python中使用時間序列

如何在python中使用時間序列

建模與prophet框架

如何在python中使用時間序列

Facebook Prophet于2017年發(fā)布,它可用于Python和R. Prophet設(shè)計用于分析時間序列,每天的觀察顯示不同時間尺度上的模式。Prophet非常善于處理缺失的數(shù)據(jù)和對于趨勢的變化,并且通常能很好地處理異常值。它還具有用于假期對時間序列的影響進(jìn)行建模和實(shí)現(xiàn)自定義變更點(diǎn)的高級功能,但我將堅(jiān)持使用基礎(chǔ)知識建立并運(yùn)行模型。我認(rèn)為Prophet是做出快速預(yù)測的一個很好的選擇,因?yàn)樗哂兄庇^的參數(shù),可以由具有良好領(lǐng)域知識但缺乏預(yù)測模型技術(shù)技能的人對其進(jìn)行調(diào)整。有關(guān)Prophet的更多信息,可以參考此處的官方文檔。(https://facebook.github.io/prophet/docs/quick_start.html)

在使用Prophet之前,我們將數(shù)據(jù)中的列重命名為正確的格式。 Date列必須被稱為'ds',而值列我們希望預(yù)測'y'。我們在下面的示例中使用了每日總結(jié)數(shù)據(jù)。

如何在python中使用時間序列

然后我們導(dǎo)入Prophet,創(chuàng)建一個模型并適合數(shù)據(jù)。在Prophet中,changepoint_prior_scale(https://facebook.github.io/prophet/docs/trend_changepoints.html)參數(shù)用于控制趨勢對變化的敏感程度,較高的值更敏感,較低的值不敏感。在嘗試了一系列值后,我將此參數(shù)從默認(rèn)值0.05設(shè)置為0.10。

如何在python中使用時間序列

為了進(jìn)行預(yù)測,我們需要創(chuàng)建所謂的未來數(shù)據(jù)幀。我們指定預(yù)測的未來周期(在我們的例子中為兩個月)和預(yù)測的頻率(每日)。 然后,我們使用我們創(chuàng)建的Prophet模型和未來的數(shù)據(jù)框進(jìn)行預(yù)測。

如何在python中使用時間序列

這很簡單!未來的數(shù)據(jù)框包含未來兩個月的估計家庭消費(fèi)。我們可以用一個圖來可視化預(yù)測:

如何在python中使用時間序列

如何在python中使用時間序列

黑點(diǎn)表示實(shí)際值,藍(lán)線表示預(yù)測值,淺藍(lán)色陰影區(qū)域表示不確定性。

如下圖所示,隨著我們未來的進(jìn)一步發(fā)展,不確定區(qū)域也會增長,因?yàn)樽畛醯牟淮_定性會隨著時間的推移而傳播和增長。

如何在python中使用時間序列

Prophet也讓我們輕松地可視化整體趨勢和組件模式:

如何在python中使用時間序列

如何在python中使用時間序列

如何在python中使用時間序列

如何在python中使用時間序列

如何在python中使用時間序列

每年的模式都很有意思,因?yàn)樗坪醣砻髑锛竞投炯彝ハM(fèi)增加,春季和夏季減少。直觀地說,這正是我們期望看到的。從周趨勢來看,周日的消費(fèi)似乎比一周中的其他日子多。最后,總體趨勢表明,消費(fèi)量在緩慢下降之前增加了一年。試圖解釋這一趨勢需要進(jìn)一步調(diào)查。在下一篇文章中,我們將嘗試查找它是否與天氣有關(guān)。

LSTM預(yù)測

長期短期記憶復(fù)發(fā)神經(jīng)網(wǎng)絡(luò)有望學(xué)習(xí)長時間的觀察序列。這篇題為"理解LSTM網(wǎng)絡(luò)"的文章在以易于理解的方式解釋底層復(fù)雜性方面做得非常出色。(http://colah.github.io/posts/2015-08-Understanding-LSTMs/)下圖是描述LSTM內(nèi)部單元架構(gòu)的圖像。

如何在python中使用時間序列

LSTM似乎非常適合時間序列預(yù)測。讓我們再次使用我們的每日總結(jié)數(shù)據(jù)。

如何在python中使用時間序列

LSTM對輸入數(shù)據(jù)的大小很敏感,特別是在使用sigmoid或tanh激活函數(shù)時。將數(shù)據(jù)重新調(diào)整到[0,1]或[-1,1]的范圍通常是一種很好的做法,也稱為規(guī)范化。我們可以使用scikit-learn庫中的MinMaxScaler預(yù)處理類輕松地規(guī)范化數(shù)據(jù)集。

如何在python中使用時間序列

現(xiàn)在我們可以將有序數(shù)據(jù)集拆分為訓(xùn)練和測試數(shù)據(jù)集。下面的代碼計算了分割點(diǎn)的索引,并將數(shù)據(jù)分成訓(xùn)練數(shù)據(jù)集,其中80%的觀測值可用于訓(xùn)練我們的模型,剩下的20%用于測試模型。

如何在python中使用時間序列

我們可以定義一個函數(shù)來創(chuàng)建一個新的數(shù)據(jù)集,并使用該函數(shù)來準(zhǔn)備建模的訓(xùn)練和測試數(shù)據(jù)集。

如何在python中使用時間序列

如何在python中使用時間序列

LSTM網(wǎng)絡(luò)期望輸入數(shù)據(jù)以以下形式提供特定的陣列結(jié)構(gòu):[樣本,時間步驟,特性]。

我們的數(shù)據(jù)目前采用[樣本,特性]的形式,我們將問題定為每個樣本的兩個時間步驟。我們可以將準(zhǔn)備好的訓(xùn)練和測試輸入數(shù)據(jù)轉(zhuǎn)換為預(yù)期的結(jié)構(gòu),如下所示:

如何在python中使用時間序列

就這樣!我們現(xiàn)在已經(jīng)準(zhǔn)備好為我們的示例設(shè)計和調(diào)整我們的LSTM網(wǎng)絡(luò)。

如何在python中使用時間序列

從損失圖中,我們可以看到該模型在訓(xùn)練和測試數(shù)據(jù)集上都具有類似的性能。

如何在python中使用時間序列

如何在python中使用時間序列

在下圖中,我們看到LSTM在擬合測試數(shù)據(jù)集方面做得非常好。

如何在python中使用時間序列

聚類

最后但同樣重要的是,我們還可以使用我們的示例數(shù)據(jù)進(jìn)行聚類。有許多不同的方法來執(zhí)行集群,其中一種方法是分層地形成集群。你可以通過兩種方式形成層次結(jié)構(gòu):從頂部開始拆分,或從底部開始合并。我決定在這篇文章中使用后者。

讓我們從數(shù)據(jù)開始,我們只需導(dǎo)入原始數(shù)據(jù),并為一年中的某一天和一天中的小時添加兩列。

如何在python中使用時間序列

如何在python中使用時間序列

Linkage函數(shù)和樹狀圖

Linkage函數(shù)根據(jù)物體的相似性和距離信息將物體分組。這些新形成的集群彼此鏈接以創(chuàng)建更大的集群。這個過程被迭代,直到原始數(shù)據(jù)集中的所有對象鏈接到一個分層樹中。

對我們的數(shù)據(jù)進(jìn)行聚類:

如何在python中使用時間序列

完成了!但"ward"是什么意思?這實(shí)際上是如何運(yùn)作的?正如scipy linkage文檔所告訴我們的那樣,ward是可用于計算新形成的集群之間距離的方法之一。"ward"鏈接功能是Ward方差最小化算法。

現(xiàn)在讓我們來看看這種分層聚類的樹形圖。樹形圖是聚類的分層圖,其中樹形圖的長度表示到下一個聚類中心的距離。

如何在python中使用時間序列

如何在python中使用時間序列

如果這是你第一次看到樹狀圖,那看起來很嚇人,但不要擔(dān)心,讓我們把它分開:

· 在x軸上,你可以看到標(biāo)簽。如果你沒有指定任何其他東西(比如我),它們就是X中樣本的索引。

· 在y軸上,你可以看到距離(在我們的例子中是word算法)。

· 水平線是集群合并

· 垂直線告訴你哪些集群/標(biāo)簽是合并,形成新集群的一部分

· 水平線的高度告訴你新形成的集群所需要的距離

即使有解釋,先前的樹狀圖仍然不明顯。我們可以"削減"一點(diǎn),以便能夠更好地查看數(shù)據(jù)。

如何在python中使用時間序列

如何在python中使用時間序列

如何在python中使用時間序列

好多了,不是嗎? 查看聚類文檔以了解更多信息并使用不同的參數(shù)。

上述內(nèi)容就是如何在python中使用時間序列,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI