一招搞定時間序列數據,手把手教你繪製時間序列圖

點擊上方“ Python爬蟲與數據挖掘 ”,進行關注

回覆“書籍”即可獲贈Python從入門到進階共10本電子書

胡未滅,鬢先秋。淚空流。
「數倉寶貝庫」,帶你學數據!

導讀:分析時間序列數據的一種簡單而有效的方法就是將時間序列數據可視化在一個圖表上,這樣我們就可以從中推斷出某些假設。本文將以股價數據集爲例,指導你從Quandl下載股價數據集,並將這些數據繪製在價格和成交量圖表上。還將教大家繪製燭臺圖,比起直線圖表,這將給我們更多的信息。


0 1
從Quandl檢索數據集


Quandl簡介


Quandl是一個爲金融、經濟和另類數據服務的平臺,這些數據由各種數據發佈商提供,包括聯合國、世界銀行、中央銀行、貿易交易所和投資研究公司。


使用Python的Quandl模塊,你可以輕鬆地將金融數據導入Python中。Quandl提供免費的數據集,其中包括一些數據樣本,但如果你需要訪問一些優質的數據產品,就必須要先付費。


將數據從Quandl導入到Python中的過程非常簡單,假如我們對泛歐交易所的荷蘭銀行集團感興趣,只需要在Jupyter Notebook單元格中輸入以下代碼(這個數據集在Quandl上的代碼爲EURONEXT/ABN):


In[]:import quandl#Replace with your own Quandl API key QUANDL_API_KEY="BCzkk3NDWt7H9yjzx-DY'quandl.ApiConfig.api_key=QUANDL_API_KEYdf =quandl.get('EURONEXT/ABN')


將Quandl的API密鑰存儲在常量變量中是一個很好的習慣,如果API密鑰發生改變,只需要在這一個地方修改它!


導入quandl包後,我們將Quandl的 API密鑰存儲在常量變量QUANDL_API_KEY中。這個常量值用於設置Quandl模塊的API密鑰,並且只需要對quandl包的每個導入執行一次。最後一行調用quandl.get()指令,將ABN數據集從Quandl直接下載到df變量中。(注意:EURONEXT是數據提供者Euronext Stock Exchange的縮寫。)


默認情況下,Quandl會將數據集導入到pandas模塊的DataFrame中。我們可以用如下代碼來檢查DataFrame的頭和尾:


In[]:df:head()out[]:             OPen  High     Low      Last    Volume      TurnowerDate2015-11-20  18.18  18.43  18.000    18.35  38392898.0  7.003281e+082015-11-23  18.45  18.70  18.215    18.61   3352514.0  6.186446e+072015-11-24  18.70  18.80  18.370    18.80   4871901.0  8.994087e+072015-11-25  18.85  19.50  18.770    19.45   4802607.0  9.153862e+072015-11-26  19.48  19.67  19.410    19.43   1648481.0  3.220713e+07

In[]:df:tail()Out []:            OPen  High     Low  Last     Volume      TurnowerDate2018-08-06 23.50 23.53 23.23 23.34 1126371.0 2.634333e+072018-08-07 23.59 23.60 23.31 23.33 1785613.0 4.177652e+072018-08-08 24.00 24.39 23.83 24.14 4165320.0 1.007085e+082018-08-09 24.40 24.46 24.15 24.37 2422470.0 5.895752e1072018-08-10 23.70 23.94 23.28 23.51 3951850.0 9.336493e+07



默認情況下,head()tail()命令分別顯示的是DataFrame的前5行和最後5行,你可以把它傳遞的參數設置成一個具體的數字來定義要顯示的行數。例如,head(100)將顯示DataFrame中的前100行。


如果你沒有爲get()命令設置任何附加參數,那麼它將會檢索整個時間序列數據集,即從你進行操作時的前一個工作日一直到2015年11月。


要可視化這個DataFrame,我們可以通過plot()命令繪製一個圖


In[]:  %matplotlib inline  import matplotlib.pyplot as plt
df.plot();


運行結果如下圖所示。



pandasplot()命令將返回一個Axis對象,此對象的字符串表示將與plot()命令一起顯示在界面上。爲了消除這個信息,我們在最後一條語句的末尾添加一個分號“;”。或者,我們也可以在單元格底部添加一條pass語句。除此之外,我們還可以將繪圖函數分配給一個變量,這樣也能消除這個輸出。


默認情況下,pandasplot()命令用matplotlib庫來顯示圖像,如果系統報錯的話,請檢查你是否安裝了這個庫,並且%matplotlib inline命令至少被調用過一次。你可以自定義圖表的外觀,有關DataFrame中plot命令的更多信息,可在以下網頁上找到:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.plot.html



0 2
繪製收盤價與成交量的關係圖


當沒有參數提供給plot()命令時,它會用DataFrame的所有列在同一圖表上繪製折線圖,我們無法從這個雜亂無章的圖像中得到什麼有用的信息。爲了有效地從這些數據中提取信息,我們可以繪製一隻股票的收盤價與成交量的關係圖。


在單元格中輸入以下命令:

In[]:  princes=df[‘Last’]  volumes=df[‘Volume’]


上述命令會將我們感興趣的數據分別存儲到closing_pricesvolumes這兩個變量中,我們可以繼續使用head()tail()命令查看由此產生的pandas數據類型的頭部和底部:


In[]:   Prices .head()out[]:   Date   ...   2015-11-20   18.35   2015-11-23   18.61   2015-11-24   18.80   2015-11-25   19.45   2015-11-26   19.43   Name:  Last,dtype:float64
In[]: volumes.tail()out[]: Date 2018-08-031252024.0 2018-08-061126371.0 2018-08-071785613.0 2018-08-084165320.0 2018-08-09。2422470.0 Name:Volume,dtype:float64


如果你想知道某個特定變量的類型,可以使用type()命令。比如,type(volumes)命令的運行結果是 pandas.core.series.Series,這樣我們就知道volumes是屬於pandas序列數據類型的。


從2018年一直追溯到2015年都有數據可查,這樣就可以繪製收盤價與成交量的關係圖:

In[]:#The top Plot consisting of daily closing  Prices
top=plt.subplot2grid((4,4),(0,0),rowspan=3,colspan=4)top .plot(Prices.index,Prices,1abel='Last')Plt.title('ABN Last Price from 2015 - 2018')plt.legend(loc=2)
#The bottom Plot consisting of daily trading volumebottom=plt.subplot2grid((4,4),(3,0),rowspan=1,colspan=4)bottom.bar(volumes.index,volumes)plt.title('ABN Daily Trading Volume')
Plt.gcf () .set_size_inches(12,8)plt.subplots_adjust(hspace=0.75)

運行結果如下圖所示。



在第一行中,subplot2grid命令的第一個參數(4,4)將整個圖劃分爲一個4x4的網格,第二個參數(0,0)表明繪圖將錨定在圖形的左上角。rowspan=3指示繪圖將佔據網格上4個可用行中的3行,即實際高度爲圖形的75%;colspan=4指示繪圖將佔用網格的所有4列,即使用其所有可用寬度。這個命令會返回一個matplotlib axis對象,我們將使用該對象繪製圖形的上部。


在第二行中,使用plot()命令繪製上圖表,x軸爲日期值,y軸上的數值爲收盤價格。在接下來的兩行中,我們指定了當前圖像的標題以及放置在左上角的時間序列數據的圖例。 


接下來,我們重複上述操作,在下部呈現每日交易量,這個圖表錨定在下方1行4列的網格空間中。


爲了讓圖像更清楚,我們調用set_size_inches()命令將圖形設置爲9英寸寬6英寸高,從而形成了一個矩形圖形(前面的gcf()命令表示獲取當前的尺寸)。最後,我們調用帶有hspace參數的subplots_adjust()命令,在上部和下部的兩個子圖之間添加少量的空缺。


subplots_adjust()命令用來對各個子圖的佈局進行優化,它可以接受的參數有:left、right、bottom、top、wspace、hspace。



0 3
繪製燭臺圖


燭臺圖是另一種流行的財務圖表,它顯示的信息比單一的價格圖更多。燭臺是每一個特定時間點的波動,其中包含四種重要的信息:開盤價、最高價、最低價和收盤價。


我們現在不再推薦使用以前的matplotlib.finance模塊,用另一個由提取的代碼組成的mpl_finance包來取代它,你可以在命令行窗口輸入以下代碼來獲取這個包:

$pip install mpl-finance


爲了更加方便地可視化燭臺圖,我們將使用ABN數據集的一個子集。在下面的例子中,我們在Quandl上檢索2018年7月份的每日價格作爲數據集,並繪製如下的燭臺圖:


In[]:%matplotlib inline import  quandlfrom mpl_finance import candlestick_ohlcimport matplotlib.dates as mdatesimport matplotlib.pyplot as plt quandl.ApiConfig.api kcy-QUANDL API KEYdf_subset-quandl.get('EURONEXT/ABN',       start_date='2018-07-01",       ena_date='2018-07-31') df_subset['Date'"]=df_subset.indqex.map(mdates.dqate2num)df_ohlc=df_subset[['Date','Open','High','Low','Last']] figure,ax=plt.sSubPlots(figsize= =(8,4))formatter=mdates.DateFormatter('%Y-%m-%d')ax.xaxis.set_major_formatter(formatter)candlestick_ohlc(ax                 df_ohlc.values,                 width=0.8,                 colorup='green',                 colordown='red')plt.show()


燭臺圖如下圖所示。



你可以在quandl.get()命令中定義start_date和end_date的值,從而指定數據集的時間範圍。


從Quandl檢索的價格會放在一個名爲df_dataset的變量中,由於matplotlib的繪圖函數需要自己的格式,我們用mdates.date2num命令轉換包含日期和時間在內的索引值,並將它們放在名爲Date的新列中。


燭臺的日期、開盤價、最高價、最低價和收盤價等數據將被提取爲一個DataFrame列存儲在df_ohlc變量中。plt.subplots()函數會創建一個8英寸寬和4英寸高的圖形,其中沿着x軸的標籤將被轉換爲我們可讀的格式。


調用candlestick_ohlc()命令來進行燭臺圖的繪製(燭臺寬度爲0.8或全天寬度的80%),收盤價高於開盤價的上漲用淺灰色表示,而收盤價低於開盤價的下跌則用深灰色表示。最後,用plt.show()命令來顯示燭臺圖。


本文摘編於《Python金融數據分析(原書第2版)》,經出版方授權發佈。


活動規則


參與方式:在下方公衆號後臺回覆 “送書”關鍵字,記得是送書二字哈,即可參與本次的送書活動。

公佈時間2021年9月8號(週三)晚上20點

領取事宜:請小夥伴添加小助手微信: WebFighting,或者掃碼添加好友。添加小助手的每一個人都可以領取一份Python學習資料,更重要的是方便聯繫。

注意事項一定要留意微信消息,如果你是幸運兒就儘快在小程序中填寫收貨地址、書籍信息。一天之內沒有填寫收貨信息,送書名額就轉給其他人了噢,歡迎參加!

------------------- End -------------------

往期精彩文章推薦:

歡迎大家點贊,留言,轉發,轉載,感謝大家的相伴與支持

想加入Python學習羣請在後臺回覆【入羣

萬水千山總是情,點個【在看】行不行

/今日留言主題/

隨便說一兩句吧~~

本文分享自微信公衆號 - Python爬蟲與數據挖掘(crawler_python)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章