在大數(shù)據(jù)分析如何使用pandas進行時間序列分析中,我們將學習pandas庫中功能強大的時間序列工具。
pandas最初是為金融時間序列(例如每日股票市場價格)開發(fā)的,其強大而靈活的數(shù)據(jù)結(jié)構可應用于任何領域的時間序列數(shù)據(jù),包括商業(yè),科學,工程,公共衛(wèi)生等。使用這些工具,您可以輕松地以任何粒度級別組織,轉(zhuǎn)換,分析和可視化數(shù)據(jù)-在感興趣的特定時間段檢查詳細信息,并縮小以探索不同時間范圍的變化,例如每月或每年的匯總模式和長期趨勢。
在最廣義的定義中,時間序列是在不同時間點測量值的任何數(shù)據(jù)集。許多時間序列以特定的頻率均勻地間隔開,例如每小時的天氣預報,每天的網(wǎng)站訪問次數(shù)或每月的銷售總額。時間序列也可以是不規(guī)則的間隔和零星的,例如,計算機系統(tǒng)的事件日志中的時間戳數(shù)據(jù)或911緊急呼叫的歷史記錄。pandas時間序列工具同樣適用于兩種時間序列。
大數(shù)據(jù)分析如何使用pandas進行時間序列分析將主要關注時間序列分析的數(shù)據(jù)處理和可視化方面。使用能源數(shù)據(jù)的時間序列,我們將看到基于時間的索引編制,重采樣和滾動窗口之類的技術如何幫助我們探索電力需求和可再生能源供應隨時間的變化。我們將涵蓋以下主題:
1)數(shù)據(jù)集:開放式電源系統(tǒng)數(shù)據(jù)
2)時間序列數(shù)據(jù)結(jié)構
3)基于時間的索引
4)可視化時間序列數(shù)據(jù)
5)季節(jié)性
6)頻率
7)重采樣
8)卷簾窗
9)發(fā)展趨勢
我們將使用Python 3.6,pandas,matplotlib和seaborn。為了充分利用大數(shù)據(jù)分析如何使用pandas進行時間序列分析,您需要熟悉pandas和matplotlib的基礎知識。
還不在那里嗎?使用我們的Python數(shù)據(jù)科學基礎知識和中級課程來建立您的基礎Python技能。
數(shù)據(jù)集:開放式電源系統(tǒng)數(shù)據(jù)
在大數(shù)據(jù)分析如何使用pandas進行時間序列分析中,我們將使用德國的開放電源系統(tǒng)數(shù)據(jù)(OPSD)的每日時間序列,該數(shù)據(jù)近年來已在迅速擴展其可再生能源的生產(chǎn)。數(shù)據(jù)集包括2006-2017年全國范圍的用電量,風力發(fā)電和太陽能發(fā)電總量。您可以在此處下載數(shù)據(jù)。
電力生產(chǎn)和消耗報告為千兆瓦時(GWh)的每日總計。數(shù)據(jù)文件的列為:
1)Date—日期(yyyy-mm-dd格式)
2)Consumption —用電量(GWh)
3)Wind — GWh中的風力發(fā)電
4)Solar — GWh中的太陽能發(fā)電
5)Wind+Solar —風電和太陽能發(fā)電量的總和
我們將使用pandas時間序列工具來回答以下問題,以探索德國的電力消耗和生產(chǎn)隨時間的變化:
1)通常什么時候耗電量最高和最低?
2)風力和太陽能發(fā)電量會隨著季節(jié)的變化而變化嗎?
3)電力消耗,太陽能和風能的長期趨勢是什么?
4)風能和太陽能發(fā)電與電能消耗如何比較,該比率隨時間變化如何?
時間序列數(shù)據(jù)結(jié)構
在深入研究OPSD數(shù)據(jù)之前,讓我們簡要介紹一下用于處理日期和時間的主要pandas數(shù)據(jù)結(jié)構。在pandas中,單個時間點表示為Timestamp。我們可以使用該to_datetime()函數(shù)從各種日期/時間格式的字符串中創(chuàng)建時間戳。讓我們導入pandas并將一些日期和時間轉(zhuǎn)換為時間戳。
如我們所見,to_datetime()將根據(jù)輸入自動推斷日期/時間格式。在上面的示例中,不明確的日期'7/8/1952'假定為月/日/年,并解釋為1952年7月8日?;蛘?,我們可以使用dayfirst參數(shù)告訴pandas將日期解釋為1952年8月7日。
如果我們提供字符串列表或字符串數(shù)??組作為的輸入to_datetime(),則它將在DatetimeIndex對象中返回日期/時間值的序列,該對象是支持大部分pandas時間序列功能的核心數(shù)據(jù)結(jié)構。
在上面的DatetimeIndex中,數(shù)據(jù)類型datetime64[ns]指示基礎數(shù)據(jù)以64納比特(ns)為單位存儲為-bit整數(shù)。這種數(shù)據(jù)結(jié)構允許pandas緊湊地存儲大的日期/時間值序列,并使用NumPy datetime64數(shù)組有效地執(zhí)行矢量化操作。
如果我們要處理所有具有相同日期/時間格式的字符串序列,則可以使用format參數(shù)顯式指定它。對于非常大的數(shù)據(jù)集,to_datetime()與默認行為相比,默認行為是針對每個單獨的字符串分別推斷格式,因此可以大大提高性能。任何的格式代碼從strftime()和strptime()在Python的功能內(nèi)置日期時間模塊都可以使用。下面的示例使用格式代碼%m(數(shù)字月份),%d(月份的日期)和%y(兩位數(shù)字的年份)指定格式。
除了代表各個時間點的Timestamp和DatetimeIndex對象外,pandas還包括代表持續(xù)時間(例如125秒)和時間段(例如2018年11月)的數(shù)據(jù)結(jié)構。有關這些數(shù)據(jù)結(jié)構的更多信息,請點擊此處。在大數(shù)據(jù)分析如何使用pandas進行時間序列分析中,我們將使用DatetimeIndexes,這是pandas時間序列最常見的數(shù)據(jù)結(jié)構。
創(chuàng)建時間序列DataFrame
為了處理pandas中的時間序列數(shù)據(jù),我們使用DatetimeIndex作為DataFrame(或Series)的索引。讓我們看看如何使用我們的OPSD數(shù)據(jù)集執(zhí)行此操作。首先,我們使用該read_csv()函數(shù)將數(shù)據(jù)讀取到DataFrame中,然后顯示其形狀。
DataFrame有4383行,涵蓋從2006年1月1日到2017年12月31日的時間。要查看數(shù)據(jù)的樣子,我們使用head()和tail()方法顯示前三行和后三行。
接下來,讓我們檢查每一列的數(shù)據(jù)類型。
現(xiàn)在,該Date列是正確的數(shù)據(jù)類型,讓我們將其設置為DataFrame的索引。
另外,我們可以使用函數(shù)的index_col和parse_dates參數(shù)將以上步驟合并為一行read_csv()。這通常是一個有用的快捷方式。
現(xiàn)在,我們的DataFrame索引是DatetimeIndex,我們可以使用所有pandas基于時間的強大索引來處理和分析我們的數(shù)據(jù),這將在以下部分中看到。
所述DatetimeIndex的另一個有用的方面是,單獨的日期/時間的部件都可用作為屬性如year,month,day,等。讓我們在中添加更多列opsd_daily,其中包含年,月和周日的名稱。
基于時間的索引
大pandas時間序列的最強大和便捷的功能之一是基于時間的索引編制-使用日期和時間直觀地組織和訪問我們的數(shù)據(jù)。使用基于時間的索引,我們可以使用日期/時間格式的字符串來通過loc訪問器在DataFrame中選擇數(shù)據(jù)。索引的工作方式類似于使用的標準基于標簽的索引loc,但有一些附加功能。
例如,我們可以使用諸如的字符串選擇一天的數(shù)據(jù)'2017-08-10'。
我們還可以選擇一片天,例如'2014-01-20':'2014-01-22'。與使用進行基于標簽的常規(guī)索引一樣loc,切片包含兩個端點。
大pandas時間序列的另一個非常方便的功能是部分字符串索引,我們可以在其中選擇部分匹配給定字符串的所有日期/時間。例如,我們可以使用選擇2006年全年opsd_daily.loc['2006'],或2012年2月選擇整個月opsd_daily.loc['2012-02']。
可視化時間序列數(shù)據(jù)
使用pandas和matplotlib,我們可以輕松地可視化時間序列數(shù)據(jù)。在本節(jié)中,我們將介紹一些示例和一些有用的自定義時序圖。首先,讓我們導入matplotlib。
我們將對繪圖使用seaborn樣式,然后將默認圖形大小調(diào)整為適合時間序列繪圖的形狀。
讓我們使用DataFrame的plot()方法創(chuàng)建德國每日用電量的全時序列的線圖。
我們可以看到,該plot()方法為x軸選擇了很好的刻度位置(每兩年)和標簽(年份),這很有用。但是,由于數(shù)據(jù)點太多,因此線圖比較擁擠且難以讀取。讓我們將數(shù)據(jù)繪制為點,然后查看Solar和Wind時間序列。
我們已經(jīng)可以看到一些有趣的模式:
1)電力消耗在冬季最高,大概是由于電加熱和照明使用增加,在夏季最低。
2)電力消耗似乎分為兩類:一個簇的振蕩中心大約在1400 GWh左右,另一個簇的數(shù)據(jù)點越來越少,而散射點大約在1150 GWh左右。我們可能會猜測這些集群與工作日和周末相對應,我們將在短期內(nèi)對此進行進一步調(diào)查。
3)夏季的太陽能產(chǎn)量最高,而陽光最多,而冬季則最低。
4)風力發(fā)電在冬季最高,大概是由于強風和更頻繁的風暴,而在夏季最低。
5)多年來,風電生產(chǎn)似乎呈強勁增長趨勢。
這三個時間序列都清楚地顯示出周期性(在時間序列分析中通常稱為季節(jié)性),其中,模式會以規(guī)則的時間間隔一次又一次地重復。的Consumption,Solar和Wind高低值之間的時間序列上的振蕩,每年的時間尺度,在天氣在過去一年中季節(jié)的變化相對應的。但是,一般而言,季節(jié)性不必與氣象季節(jié)相對應。例如,零售銷售數(shù)據(jù)通常表現(xiàn)出每年的季節(jié)性,在11月和12月,直到假期之前,銷售都有所增加。
季節(jié)性也可能在其他時間范圍內(nèi)發(fā)生。上圖顯示德國的用電量每周可能有一些季節(jié)性,與工作日和周末相對應。讓我們繪制一年中的時間序列,以進行進一步調(diào)查。
現(xiàn)在我們可以清楚地看到每周的波動。在這種粒度級別上變得顯而易見的另一個有趣功能是1月初和12月下旬假期期間的用電量急劇下降。
讓我們進一步放大,看看一月和二月。
正如我們所懷疑的,平日的消費最高,而周末的最低。
自定義時間序列圖
為了更好地直觀顯示上圖中每周的每周用電量季節(jié)性變化,最好在每周的時間范圍內(nèi)(而不是在每個月的第一天)使用垂直網(wǎng)格線。我們可以使用matplotlib.dates自定義我們的情節(jié),因此讓我們導入該模塊。
由于日期/時間刻度在matplotlib.dates中的處理方式與DataFrame的plot()方法相比有所不同,因此讓我們直接在matplotlib中創(chuàng)建繪圖。然后,我們使用mdates.WeekdayLocator()和mdates.MONDAY將x軸刻度設置為每周的第一個星期一。我們還使用前面看到mdates.DateFormatter()的格式代碼來改進刻度標簽的格式。
現(xiàn)在,我們在每個星期一都有垂直網(wǎng)格線和格式良好的刻度標簽,因此我們可以輕松分辨出哪幾天是工作日和周末。
還有許多其他方式可以使時間序列可視化,具體取決于您嘗試探索的模式-散點圖,熱圖,直方圖等。在以下各節(jié)中,我們將看到其他可視化示例,包括以某種方式轉(zhuǎn)換的時間序列數(shù)據(jù)的可視化,例如聚合或平滑的數(shù)據(jù)。
季節(jié)性
接下來,讓我們用箱形圖進一步探索數(shù)據(jù)的季節(jié)性,使用seaborn boxplot()函數(shù)將數(shù)據(jù)按不同時間段分組并顯示每組的分布。我們將首先按月對數(shù)據(jù)進行分組,以可視化年度季節(jié)性。
這些箱形圖確認了我們在較早的圖中看到的年度季節(jié)性,并提供了其他一些見解:
1)盡管冬季的用電量通常較高,夏季較低,但是與11月和2月相比,12月和1月的四分位數(shù)中位數(shù)和下四分位數(shù)較低,這可能是由于商家在節(jié)假日關閉。我們在2017年的時間序列中看到了這一點,箱形圖證實了這是多年來一致的模式。
2)雖然太陽能和風能生產(chǎn)均顯示每年的季節(jié)性,但風能分布卻有更多異常值,反映了暴風雨和其他瞬態(tài)天氣條件下偶爾出現(xiàn)的極端風速的影響。
接下來,讓我們按星期幾分組用電時間序列,以探討每周的季節(jié)性。
不出所料,工作日的用電量明顯高于周末。工作日的異常值較低可能是在假日期間。
本節(jié)簡要介紹了時間序列的季節(jié)性。稍后我們將看到,對數(shù)據(jù)應用滾動窗口還可以幫助可視化不同時間范圍內(nèi)的季節(jié)性。其他用于分析季節(jié)性的技術包括自相關圖,該圖繪制了時間序列與自身在不同時間滯后的相關系數(shù)。
具有較強季節(jié)性的時間序列通??梢杂脤⑿盘柗纸鉃榧竟?jié)性和長期趨勢的模型很好地表示,并且這些模型可用于預測時間序列的未來值。如大數(shù)據(jù)分析如何使用pandas進行時間序列分析所示,經(jīng)典的季節(jié)性分解就是這種模型的一個簡單示例。一個更復雜的示例是Facebook的Prophet模型,該模型使用曲線擬合來分解時間序列,并考慮了多個時間尺度上的季節(jié)性,假日影響,突然的變化點和長期趨勢,如大數(shù)據(jù)分析如何使用pandas進行時間序列分析所示。
頻率
當時間序列的數(shù)據(jù)點在時間上均勻間隔(例如,每小時,每天,每月等)時,該時間序列可以與pandas的頻率相關聯(lián)。例如,讓我們使用date_range()函數(shù)來從創(chuàng)建均勻間隔的日期序列1998-03-10通過1998-03-15在每日頻率。
所得的DatetimeIndex具有freq值為的屬性'D',指示每日頻率。大pandas的可用頻率包括每小時('H'),每天('D'),每天('B'),每周('W'),每月('M'),每季度('Q'),每年('A')等。也可以將頻率指定為任何基本頻率的倍數(shù),例如'5D'每五天一次。
再舉一個例子,讓我們以每小時的頻率創(chuàng)建一個日期范圍,指定開始日期和期間數(shù),而不是開始日期和結(jié)束日期。
現(xiàn)在,讓我們再來看一下opsd_daily時間序列的DatetimeIndex 。
我們可以看到它沒有頻率(freq=None)。這是有道理的,因為該索引是從CSV文件中的日期序列創(chuàng)建的,而沒有為時間序列明確指定任何頻率。
如果我們知道我們的數(shù)據(jù)應處于特定頻率,則可以使用DataFrame的asfreq()方法來分配頻率。如果數(shù)據(jù)中缺少任何日期/時間,則將為這些日期/時間添加新行,這些行可以為空(NaN),也可以根據(jù)指定的數(shù)據(jù)填充方法(如正向填充或插值)進行填充。
為了了解其工作原理,讓我們創(chuàng)建一個新的DataFrame,其中僅包含Consumption2013年2月3日,6日和8日的數(shù)據(jù)。
現(xiàn)在,我們使用該asfreq()方法將DataFrame轉(zhuǎn)換為每日頻率,其中一列用于未填充的數(shù)據(jù),一列用于向前填充的數(shù)據(jù)。
在該Consumption列中,我們有原始數(shù)據(jù),NaN對于consum_sampleDataFrame 中缺少的任何日期,其值為。在該Consumption - Forward Fill列中,缺失項已向前填充,這意味著最后一個值將在缺失行中重復,直到出現(xiàn)下一個非缺失值。
如果您要進行任何需要均勻間隔的數(shù)據(jù)且沒有任何遺漏的時間序列分析,則需要使用asfreq()該方法將時間序列轉(zhuǎn)換為指定的頻率,并使用適當?shù)姆椒ㄌ畛渌羞z漏。
重采樣
將我們的時間序列數(shù)據(jù)重新采樣到較低或較高的頻率通常很有用。重采樣到較低的頻率(降采樣)通常涉及聚合操作-例如,根據(jù)每日數(shù)據(jù)計算每月的銷售總額。我們在大數(shù)據(jù)分析如何使用pandas進行時間序列分析中使用的每日OPSD數(shù)據(jù)是從原始的每小時時間序列中縮減采樣的。重采樣到較高頻率(上采樣)的情況比較少見,并且通常涉及插值或其他數(shù)據(jù)填充方法,例如,將每小時天氣數(shù)據(jù)插值到10分鐘間隔以輸入科學模型。
我們將在這里著重于下采樣,探索它如何幫助我們在各種時間尺度上分析我們的OPSD數(shù)據(jù)。我們使用DataFrame的resample()方法,該方法將DatetimeIndex拆分為多個時間段,并按時間段對數(shù)據(jù)進行分組。該resample()方法返回一個Resampler對象,類似于pandas GroupBy對象。然后,我們可以應用的聚合方法,例如mean(),median(),sum()等,以數(shù)據(jù)組為每個時間段。
例如,讓我們將數(shù)據(jù)重新采樣為每周平均時間序列。
第一行上面,標注2006-01-01,包含了平均中包含的所有的時間塊中的數(shù)據(jù)2006-01-01通過2006-01-07。第二行標記為2006-01-08,包含2006-01-08通過2006-01-14時間倉的平均數(shù)據(jù),依此類推。默認情況下,向下采樣的時間序列的每一行都標有時間倉的右邊緣。
根據(jù)構造,我們的每周時間序列的數(shù)據(jù)點是每日時間序列的1/7。我們可以通過比較兩個DataFrame的行數(shù)來確認這一點。
讓我們Solar一起繪制一個六個月內(nèi)的每日和每周時間序列,以進行比較。
我們可以看到,每周平均時間序列比每日時間序列平滑,這是因為在重采樣中平均了較高的頻率變異性。
現(xiàn)在,讓我們將數(shù)據(jù)重新采樣到每月一次,匯總總和而不是均值。與使用進行聚合mean()(將設置為將NaN所有丟失數(shù)據(jù)的任何時間段的輸出)不同,的默認行為是sum()將輸出輸出0作為丟失數(shù)據(jù)的總和。我們使用min_count參數(shù)來更改此行為。
您可能會注意到,每月重新采樣的數(shù)據(jù)標有每個月的月底(右邊的條邊),而每周重新采樣的數(shù)據(jù)標有左邊的條邊。默認情況下,對于每月,每季度和每年的頻率,重新采樣的數(shù)據(jù)都標記有右側(cè)bin邊緣,對于所有其他頻率,則標記有左側(cè)bin邊緣??梢允褂胷esample()文檔中列出的參數(shù)來調(diào)整此行為和其他各種選項。
現(xiàn)在,通過將用電量繪制為線圖,將風能和太陽能發(fā)電繪制為堆疊區(qū)域圖,來探索每月的時間序列。
在這個月度時間尺度上,我們可以清楚地看到每個時間序列中的年度季節(jié)性,并且很明顯,用電量隨著時間的推移一直相當穩(wěn)定,而風電產(chǎn)量一直在穩(wěn)定增長,其中風能+太陽能發(fā)電量不斷增加消耗的電力份額。
讓我們通過對年度頻率重新采樣并計算每年的比率Wind+Solar來進一步探索Consumption。
最后,讓我們用條形圖繪制風電與太陽能在年度用電量中所占的比例。
我們可以看到,風能+太陽能生產(chǎn)占年度用電量的比例已從2012年的約15%增長到2017年的約27%。
卷簾窗
滾動窗口操作是時間序列數(shù)據(jù)的另一個重要轉(zhuǎn)換。類似于下采樣,滾動窗口中的數(shù)據(jù)分成時間窗口和并且在每個窗口中的數(shù)據(jù)被聚集以如函數(shù)mean(),median(),sum()等。然而,不同于下采樣,其中,所述時間倉不重疊,并且所述輸出是在一個較低的頻率與輸入頻率相比,滾動窗口重疊,并且以與數(shù)據(jù)相同的頻率“滾動”,因此變換后的時間序列與原始時間序列的頻率相同。
默認情況下,窗口中的所有數(shù)據(jù)點在聚合中的權重均相等,但是可以通過指定窗口類型(例如高斯,三角形和其他)來更改此值。我們將在此處繼續(xù)使用標準的等權重窗口。
讓我們使用該rolling()方法來計算每日數(shù)據(jù)的7天滾動平均值。我們使用center=True參數(shù)在每個窗口的中點標記標簽,因此滾動窗口為:
1)2006-01-01至2006-01-07-標為2006-01-04
2)2006-01-02至2006-01-08-標為2006-01-05
3)2006-01-03至2006-01-09-標為2006-01-06
4)等等…
我們可以看到第一個非缺失滾動平均值為on 2006-01-04,因為這是第一個滾動窗口的中點。
為了可視化滾動平均值和重采樣之間的差異,讓我們更新我們較早的2017年1月至6月太陽能發(fā)電量圖,以包括7天滾動平均值以及每周平均重采樣時間序列和原始每日數(shù)據(jù)。
我們可以看到,滾動平均時間序列中的數(shù)據(jù)點與每日數(shù)據(jù)具有相同的間隔,但是由于平均了較高的頻率可變性,因此曲線更加平滑。在滾動平均時間序列中,高峰和低谷往往與每日時間序列的高峰和低谷緊密對齊。相反,由于重新采樣的時間序列具有較粗的粒度,因此每周重新采樣的時間序列中的高峰和低谷與每日時間序列的排列不太緊密。
發(fā)展趨勢
除了較高的頻率可變性(例如季節(jié)性和噪聲)以外,時間序列數(shù)據(jù)通常還表現(xiàn)出一些緩慢的漸進可變性??梢暬@些趨勢的一種簡單方法是在不同的時間范圍內(nèi)使用滾動方式。
滾動平均值趨向于通過平均遠高于窗口大小的頻率上的變化并在等于窗口大小的時間尺度上平均任何季節(jié)性來平滑時間序列。這允許探索數(shù)據(jù)中的低頻變化。由于我們的用電時間序列具有每周和每年的季節(jié)性,因此讓我們來看一下這兩個時間尺度上的滾動平均值。
我們已經(jīng)計算了7天的滾動平均值,所以現(xiàn)在讓我們計算OPSD數(shù)據(jù)的365天的滾動平均值。
讓我們繪制7天和365天的滾動平均用電量以及每日時間序列。
我們可以看到,為期7天的滾動平均值已使所有的每周季節(jié)性都變得平滑,同時保留了年度季節(jié)性。7天的滾動平均值顯示,雖然冬季的用電量通常較高,而夏季則較低,但是每個冬季在12月底和1月初的節(jié)假日期間,其用電量會急劇下降數(shù)周。
縱觀365天的滾動平均時間序列,我們可以看到電力消耗的長期趨勢相當平穩(wěn),在2009年和2012-2013年之間有幾個異常的低電量消耗時期。
現(xiàn)在讓我們看一下風能和太陽能生產(chǎn)的趨勢。
隨著德國繼續(xù)擴大在這些領域的能力,我們可以看到太陽能發(fā)電的增長趨勢很小,而風力發(fā)電的增長趨勢很大。
總結(jié)和進一步閱讀
我們已經(jīng)學習了如何使用諸如基于時間的索引,重采樣和滾動窗口之類的技術來處理,分析和可視化pandas中的時間序列數(shù)據(jù)。將這些技術應用于我們的OPSD數(shù)據(jù)集,我們獲得了有關德國電力消耗和生產(chǎn)的季節(jié)性,趨勢和其他有趣特征的見解。
我們尚未涉及的其他潛在有用主題包括時區(qū)處理和時移。如果您想了解更多有關在pandas中使用時間序列數(shù)據(jù)的信息。如果您對使用時間序列數(shù)據(jù)進行預測和機器學習感興趣,我們將在以后的文章中介紹這些主題,請繼續(xù)關注!
填寫下面表單即可預約申請免費試聽!怕錢不夠?可先就業(yè)掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業(yè)?一地學習,可推薦就業(yè)!
?2007-2022/ m.lb577.com 北京漫動者數(shù)字科技有限公司 備案號: 京ICP備12034770號 監(jiān)督電話:010-53672995 郵箱:bjaaa@aaaedu.cc