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