手把手教你使用Python繪制時(shí)間序列圖
導(dǎo)讀:分析時(shí)間序列數(shù)據(jù)的一種簡(jiǎn)單而有效的方法就是將時(shí)間序列數(shù)據(jù)可視化在一個(gè)圖表上,這樣我們就可以從中推斷出某些假設(shè)。本文將以股價(jià)數(shù)據(jù)集為例,指導(dǎo)你從Quandl下載股價(jià)數(shù)據(jù)集,并將這些數(shù)據(jù)繪制在價(jià)格和成交量圖表上。還將教大家繪制燭臺(tái)圖,比起直線圖表,這將給我們更多的信息。
01從Quandl檢索數(shù)據(jù)集
Quandl簡(jiǎn)介
Quandl是一個(gè)為金融、經(jīng)濟(jì)和另類數(shù)據(jù)服務(wù)的平臺(tái),這些數(shù)據(jù)由各種數(shù)據(jù)發(fā)布商提供,包括聯(lián)合國(guó)、世界銀行、中央銀行、貿(mào)易交易所和投資研究公司。
使用Python的Quandl模塊,你可以輕松地將金融數(shù)據(jù)導(dǎo)入Python中。Quandl提供免費(fèi)的數(shù)據(jù)集,其中包括一些數(shù)據(jù)樣本,但如果你需要訪問(wèn)一些優(yōu)質(zhì)的數(shù)據(jù)產(chǎn)品,就必須要先付費(fèi)。
將數(shù)據(jù)從Quandl導(dǎo)入到Python中的過(guò)程非常簡(jiǎn)單,假如我們對(duì)泛歐交易所的荷蘭銀行集團(tuán)感興趣,只需要在Jupyter Notebook單元格中輸入以下代碼(這個(gè)數(shù)據(jù)集在Quandl上的代碼為EURONEXT/ABN):
In[]:
import quandl
#Replace with your own Quandl API key QUANDL_API_KEY="BCzkk3NDWt7H9yjzx-DY'
quandl.ApiConfig.api_key=QUANDL_API_KEY
df =quandl.get('EURONEXT/ABN')將Quandl的API密鑰存儲(chǔ)在常量變量中是一個(gè)很好的習(xí)慣,如果API密鑰發(fā)生改變,只需要在這一個(gè)地方修改它!
導(dǎo)入quandl包后,我們將Quandl的 API密鑰存儲(chǔ)在常量變量QUANDL_API_KEY中。這個(gè)常量值用于設(shè)置Quandl模塊的API密鑰,并且只需要對(duì)quandl包的每個(gè)導(dǎo)入執(zhí)行一次。最后一行調(diào)用quandl.get()指令,將ABN數(shù)據(jù)集從Quandl直接下載到df變量中。(注意:EURONEXT是數(shù)據(jù)提供者Euronext Stock Exchange的縮寫(xiě)。)
默認(rèn)情況下,Quandl會(huì)將數(shù)據(jù)集導(dǎo)入到pandas模塊的DataFrame中。我們可以用如下代碼來(lái)檢查DataFrame的頭和尾:
In[]:
df:head()
out[]:
OPen High Low Last Volume Turnower
Date
2015-11-20 18.18 18.43 18.000 18.35 38392898.0 7.003281e+08
2015-11-23 18.45 18.70 18.215 18.61 3352514.0 6.186446e+07
2015-11-24 18.70 18.80 18.370 18.80 4871901.0 8.994087e+07
2015-11-25 18.85 19.50 18.770 19.45 4802607.0 9.153862e+07
2015-11-26 19.48 19.67 19.410 19.43 1648481.0 3.220713e+07
In[]:
df:tail()
Out []:
OPen High Low Last Volume Turnower
Date
2018-08-06 23.50 23.53 23.23 23.34 1126371.0 2.634333e+07
2018-08-07 23.59 23.60 23.31 23.33 1785613.0 4.177652e+07
2018-08-08 24.00 24.39 23.83 24.14 4165320.0 1.007085e+08
2018-08-09 24.40 24.46 24.15 24.37 2422470.0 5.895752e107
2018-08-10 23.70 23.94 23.28 23.51 3951850.0 9.336493e+07
默認(rèn)情況下,head()和tail()命令分別顯示的是DataFrame的前5行和最后5行,你可以把它傳遞的參數(shù)設(shè)置成一個(gè)具體的數(shù)字來(lái)定義要顯示的行數(shù)。例如,head(100)將顯示DataFrame中的前100行。
如果你沒(méi)有為get()命令設(shè)置任何附加參數(shù),那么它將會(huì)檢索整個(gè)時(shí)間序列數(shù)據(jù)集,即從你進(jìn)行操作時(shí)的前一個(gè)工作日一直到2015年11月。
要可視化這個(gè)DataFrame,我們可以通過(guò)plot()命令繪制一個(gè)圖
In[]: %matplotlib inline import matplotlib.pyplot as plt df.plot();
運(yùn)行結(jié)果如下圖所示。

pandas的plot()命令將返回一個(gè)Axis對(duì)象,此對(duì)象的字符串表示將與plot()命令一起顯示在界面上。為了消除這個(gè)信息,我們?cè)谧詈笠粭l語(yǔ)句的末尾添加一個(gè)分號(hào)“;”?;蛘撸覀円部梢栽趩卧竦撞刻砑右粭lpass語(yǔ)句。除此之外,我們還可以將繪圖函數(shù)分配給一個(gè)變量,這樣也能消除這個(gè)輸出。
默認(rèn)情況下,pandas的plot()命令用matplotlib庫(kù)來(lái)顯示圖像,如果系統(tǒng)報(bào)錯(cuò)的話,請(qǐng)檢查你是否安裝了這個(gè)庫(kù),并且%matplotlib inline命令至少被調(diào)用過(guò)一次。你可以自定義圖表的外觀,有關(guān)DataFrame中plot命令的更多信息,可在以下網(wǎng)頁(yè)上找到:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.plot.html
02繪制收盤(pán)價(jià)與成交量的關(guān)系圖
當(dāng)沒(méi)有參數(shù)提供給plot()命令時(shí),它會(huì)用DataFrame的所有列在同一圖表上繪制折線圖,我們無(wú)法從這個(gè)雜亂無(wú)章的圖像中得到什么有用的信息。為了有效地從這些數(shù)據(jù)中提取信息,我們可以繪制一只股票的收盤(pán)價(jià)與成交量的關(guān)系圖。
在單元格中輸入以下命令:
In[]: princes=df[‘Last'] volumes=df[‘Volume']
上述命令會(huì)將我們感興趣的數(shù)據(jù)分別存儲(chǔ)到closing_prices和volumes這兩個(gè)變量中,我們可以繼續(xù)使用head()和tail()命令查看由此產(chǎn)生的pandas數(shù)據(jù)類型的頭部和底部:
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如果你想知道某個(gè)特定變量的類型,可以使用type()命令。比如,type(volumes)命令的運(yùn)行結(jié)果是 pandas.core.series.Series,這樣我們就知道volumes是屬于pandas序列數(shù)據(jù)類型的。
從2018年一直追溯到2015年都有數(shù)據(jù)可查,這樣就可以繪制收盤(pán)價(jià)與成交量的關(guān)系圖:
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 volume
bottom=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)運(yùn)行結(jié)果如下圖所示。

在第一行中,subplot2grid命令的第一個(gè)參數(shù)(4,4)將整個(gè)圖劃分為一個(gè)4x4的網(wǎng)格,第二個(gè)參數(shù)(0,0)表明繪圖將錨定在圖形的左上角。rowspan=3指示繪圖將占據(jù)網(wǎng)格上4個(gè)可用行中的3行,即實(shí)際高度為圖形的75%;colspan=4指示繪圖將占用網(wǎng)格的所有4列,即使用其所有可用寬度。這個(gè)命令會(huì)返回一個(gè)matplotlib axis對(duì)象,我們將使用該對(duì)象繪制圖形的上部。
在第二行中,使用plot()命令繪制上圖表,x軸為日期值,y軸上的數(shù)值為收盤(pán)價(jià)格。在接下來(lái)的兩行中,我們指定了當(dāng)前圖像的標(biāo)題以及放置在左上角的時(shí)間序列數(shù)據(jù)的圖例。
接下來(lái),我們重復(fù)上述操作,在下部呈現(xiàn)每日交易量,這個(gè)圖表錨定在下方1行4列的網(wǎng)格空間中。
為了讓圖像更清楚,我們調(diào)用set_size_inches()命令將圖形設(shè)置為9英寸寬6英寸高,從而形成了一個(gè)矩形圖形(前面的gcf()命令表示獲取當(dāng)前的尺寸)。最后,我們調(diào)用帶有hspace參數(shù)的subplots_adjust()命令,在上部和下部的兩個(gè)子圖之間添加少量的空缺。
subplots_adjust()命令用來(lái)對(duì)各個(gè)子圖的布局進(jìn)行優(yōu)化,它可以接受的參數(shù)有:left、right、bottom、top、wspace、hspace。
03繪制燭臺(tái)圖
燭臺(tái)圖是另一種流行的財(cái)務(wù)圖表,它顯示的信息比單一的價(jià)格圖更多。燭臺(tái)是每一個(gè)特定時(shí)間點(diǎn)的波動(dòng),其中包含四種重要的信息:開(kāi)盤(pán)價(jià)、最高價(jià)、最低價(jià)和收盤(pán)價(jià)。
我們現(xiàn)在不再推薦使用以前的matplotlib.finance模塊,用另一個(gè)由提取的代碼組成的mpl_finance包來(lái)取代它,你可以在命令行窗口輸入以下代碼來(lái)獲取這個(gè)包:
$pip install mpl-finance
為了更加方便地可視化燭臺(tái)圖,我們將使用ABN數(shù)據(jù)集的一個(gè)子集。在下面的例子中,我們?cè)赒uandl上檢索2018年7月份的每日價(jià)格作為數(shù)據(jù)集,并繪制如下的燭臺(tái)圖:
In[]:
%matplotlib inline
import quandl
from mpl_finance import candlestick_ohlc
import matplotlib.dates as mdates
import matplotlib.pyplot as plt
quandl.ApiConfig.api kcy-QUANDL API KEY
df_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()燭臺(tái)圖如下圖所示。

你可以在quandl.get()命令中定義start_date和end_date的值,從而指定數(shù)據(jù)集的時(shí)間范圍。
從Quandl檢索的價(jià)格會(huì)放在一個(gè)名為df_dataset的變量中,由于matplotlib的繪圖函數(shù)需要自己的格式,我們用mdates.date2num命令轉(zhuǎn)換包含日期和時(shí)間在內(nèi)的索引值,并將它們放在名為Date的新列中。
燭臺(tái)的日期、開(kāi)盤(pán)價(jià)、最高價(jià)、最低價(jià)和收盤(pán)價(jià)等數(shù)據(jù)將被提取為一個(gè)DataFrame列存儲(chǔ)在df_ohlc變量中。plt.subplots()函數(shù)會(huì)創(chuàng)建一個(gè)8英寸寬和4英寸高的圖形,其中沿著x軸的標(biāo)簽將被轉(zhuǎn)換為我們可讀的格式。
調(diào)用candlestick_ohlc()命令來(lái)進(jìn)行燭臺(tái)圖的繪制(燭臺(tái)寬度為0.8或全天寬度的80%),收盤(pán)價(jià)高于開(kāi)盤(pán)價(jià)的上漲用淺灰色表示,而收盤(pán)價(jià)低于開(kāi)盤(pán)價(jià)的下跌則用深灰色表示。最后,用plt.show()命令來(lái)顯示燭臺(tái)圖。
到此這篇關(guān)于手把手教你使用Python繪制時(shí)間序列圖的文章就介紹到這了,更多相關(guān)Python時(shí)間序列圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 教你利用python的matplotlib(pyplot)繪制折線圖和柱狀圖
- Python數(shù)據(jù)分析之使用matplotlib繪制折線圖、柱狀圖和柱線混合圖
- Python數(shù)據(jù)分析Matplotlib?柱狀圖繪制
- python?OpenCV圖像金字塔
- Python圖像處理之圖像金字塔詳解
- python計(jì)算機(jī)視覺(jué)opencv圖像金字塔輪廓及模板匹配
- python實(shí)現(xiàn)圖像高斯金字塔的示例代碼
- python 用opencv實(shí)現(xiàn)圖像修復(fù)和圖像金字塔
- python繪制發(fā)散型柱狀圖+誤差陰影時(shí)間序列圖+雙坐標(biāo)系時(shí)間序列圖+繪制金字塔圖
相關(guān)文章
Python 安裝和配置flask, flask_cors的圖文教程
這篇文章主要介紹了Python 安裝和配置flask, flask_cors的圖文教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-04-04
使用pytorch完成kaggle貓狗圖像識(shí)別方式
今天小編就為大家分享一篇使用pytorch完成kaggle貓狗圖像識(shí)別方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
python翻譯軟件實(shí)現(xiàn)代碼(使用google api完成)
這篇文章主要介紹了python結(jié)合google api完成的翻譯軟件實(shí)現(xiàn)代碼,大家參考使用2013-11-11
Python 實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)-堆棧和隊(duì)列的操作方法
隊(duì)、棧和鏈表一樣,在數(shù)據(jù)結(jié)構(gòu)中非?;A(chǔ)一種數(shù)據(jù)結(jié)構(gòu),同樣他們也有各種各樣、五花八門的變形和實(shí)現(xiàn)方式。這篇文章主要介紹了Python 實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)-堆棧和隊(duì)列的操作方法,需要的朋友可以參考下2019-07-07
python安裝PIL模塊時(shí)Unable to find vcvarsall.bat錯(cuò)誤的解決方法
這篇文章給大家分享了關(guān)于python安裝PIL模塊時(shí)遇到Unable to find vcvarsall.bat錯(cuò)誤的解決方法,相信會(huì)對(duì)不少人有一定的參考借鑒價(jià)值。有需要的朋友們下面來(lái)一起看看吧。2016-09-09
使用Python實(shí)現(xiàn)監(jiān)聽(tīng)html點(diǎn)擊事件教程
在Web開(kāi)發(fā)中,經(jīng)常需要在用戶與頁(yè)面交互時(shí)執(zhí)行一些操作,本文將介紹如何使用Python來(lái)監(jiān)聽(tīng)HTML點(diǎn)擊事件,有需要的小伙伴可以跟隨小編一起了解下2024-04-04

