天天看點

盤一盤 Python - PyEcharts (v1.0)

盤一盤 Python - PyEcharts (v1.0)

引言

有讀者說〖PyEcharts〗一貼裡的圖美如畫,但是版本是 pyecharts v0.5,用現在 v1.0 來運作會出錯,建議我再寫篇 pyecharts v1.0 的。我最不喜歡讓讀者失望,這不我就來了。

用 v1.0 來運作 v0.5 的代碼是肯定會報錯的,v0.5 和 v1 間不相容,v1 是一個全新的版本。首先來回顧 v0.5 的方法總結。

PyEcharts v0.5 方法總結

對 pyecharts 中的所有原件,都是先建立 (可以帶些必要屬性,比如标題和尺寸),再用 add 方法添加額外屬性。其通用化流程為

object = Object( 必要屬性 )

object.add( 額外屬性 )

在畫圖之前,你應該對那些原件可以幹嘛有個大概印象,比如 Kline 是畫 K 線圖,Heatmap 是畫熱力圖,WordCloud 是圖詞雲圖等等。對于那些裝飾原件所需的必要屬性和額外屬性,上官網一查便知,跟着例子看了解更快。

畫多個坐标系用 Grid 對象;疊加多個原件用 Overlap 對象;随着時間軸展示不同時點的資料關系用 Timeline 對象,等等。

首先用 pip 安裝 pyecharts

pip install pyecharts           

複制

引入 pyecharts 并列印出它的版本

import pyecharts as pye
print('pyecharts: %s' % pye.__version__)           

複制

pyecharts: 1.3.1           

複制

本文首先對比 pyecharts v0.5 和 v1.0 的差別,之後舉三個從簡單到複雜的例子來學習 v1.0 的用法。

1

v0.5 Vs v1.0

引入基本元件

在 v0.5 中,引入 Line (線)、Kline (K 線)、Bar (柱狀圖)、Pie (餅狀圖)、Grid (多坐标系)、Overlap(疊加對象)、Timeline (時間軸輪播圖)、TreeMap (樹狀圖) 和 WordCloud (詞雲圖) 的代碼如下:

from pyecharts
import Line, Kline, Pie, 
       Grid, Overlap, Timeline, 
       TreeMap, WordCloud           

複制

在 v1.0 中,引入它們(除了 Overlap)的代碼如下:

from pyecharts.charts 
import Line, Kline, Pie, 
       Grid, Timeline, 
       TreeMap, WordCloud           

複制

在 v1.0 中,我們從 pyecharts.charts 中引入元件,而不是從 pyecharts 引入。此外,v1.0 已經沒有用于組合元件的 Overlap 了,它有一種更簡單的組合方法。對于兩個元件,K 線 kline 和線 line,v0.5 和 v1.0 的代碼如下:

v0.5:需要先建立一個 Overlap 對象,再把 kline 和 line 一個個添加進去。

overlap = Overlap()

overlap.add(kline)

overlap.add(line)

v1.0:每個元件都有 overlap() 函數,可以另外元件,比如先建立 kline 再添加 line.

kline.overlap(line)

一切皆配置

在 pyecharts v1.0 中,一切皆配置(options)。配置項有兩種:全局配置項和系列配置項。

全局配置項有以下 16 小項:

盤一盤 Python - PyEcharts (v1.0)

系列配置項有以下 14 小項:

盤一盤 Python - PyEcharts (v1.0)

配置項越細就能畫出更多細節。在後面幾節我們會重點說明,尤其是全局配置項,它可通過 set_global_options 方法來設定。

引入 pyecharts 裡的 options 代碼如下:

from pyecharts import options as opts           

複制

1

K 線圖

資料

首先用 YahooFinancials API 來下載下傳外彙的三年半曆史資料,安裝該 API 用一行代碼:

pip install yahoofinancials           

複制

資料的描述如下

  • 起始日:2016-01-01
  • 終止日:2019-05-13
  • 四個外彙:歐元美元、美元日元、美元人民币,英鎊美元

其中貨币用的不是市場常見格式,比如「歐元美元」用 EURUSD=X,而不是 EURUSD,而「美元日元」用 JPY=X 而不是 USDJPY

下面代碼就是從 API 擷取資料:

盤一盤 Python - PyEcharts (v1.0)

該 API 傳回結果 FX_daily 是「字典」格式,樣子非常醜陋,感受一下。

盤一盤 Python - PyEcharts (v1.0)

資料樣子雖醜,但還滿齊全,畫 K 線需要的開盤價 (open)、最高價 (high)、最低價 (low)、收盤價 (close) 都有。将上面的「原始資料」轉換成 DataFrame,代碼如下:

盤一盤 Python - PyEcharts (v1.0)

第 3 行完全是為了 YahooFinancial 裡面的輸入格式準備的。如果 Asset 是加密貨币,直接用其股票代碼;如果 Asset 是匯率,一般參數寫成 EURUSD 或 USDJPY

  • 如果是 EURUSD,轉換成 EURUSD=X
  • 如果是 USDJPY,轉換成 JPY=X

第 6 行定義好開盤價、收盤價、最低價和最高價的标簽。

第 7 行擷取出一個「字典」格式的資料。

第 8, 9 行用清單解析式 (list comprehension) 将日期和價格擷取出來。

第 11 到 13 行定義一個 DataFrame

  • 值為第 9 行得到的 price 清單
  • 行标簽為第 8 行得到的 index 清單
  • 列标簽為第 6 行定義好的 columns 清單

處理過後的資料格式美如畫,看看 USDCNY。

curr = 'USDCNY'
data = data_converter( FX_daily, curr, 'FX' )
data.head(3).append(data.tail(3))           

複制

盤一盤 Python - PyEcharts (v1.0)

PyEcharts v0.5

PyEcharts 0.5 裡畫 K 線用到 Kline對象,除此之外我們添加最高價和最低價兩條線 Line 對象,再用 Overlap 對象來「疊加」它們。

盤一盤 Python - PyEcharts (v1.0)

第 1-2 行擷取日期和匯率。

第 4 行建立 K 線對象 Kline,設定好标題 "xxx Chart" 和位置 center。第 5-6 行在 Kline 上添加屬性

  • 圖例:'K-Line',
  • x 坐标軸資料:日期
  • y 坐标軸資料:一定要按 [開盤值, 收盤值, 最低值, 最高值] 的順序,之前處理資料特意按這個順序設定 DataFrame 的列标簽的
  • x 坐标軸可拉伸:True
  • 圖例位置:右邊
  • 圖例排序:豎直
  • 圖例文字大小:10

第 8 行建立折線對象 Line。第 9-13 行在 Line 上添加兩條折線,一條是最高價,一條是最低價。

第 14 行建立疊加對象 Overlap。第 15-16 行在 Overlap 上分别添加之前的 Kline 和 Line,這樣就把所有對象整合在一起了。

第 17 行如果被運作,該動态圖被生成到 USDCNY Chart.html 網頁檔案裡;如果沒被運作,該動态圖将顯示在 Jupyter Notebook 中。

盤一盤 Python - PyEcharts (v1.0)

PyEcharts 1.0

PyEcharts 1.0 裡畫 K 線用到 Kline 對象,除此之外我們添加最高價和最低價兩條線 Line 對象,然後直接把兩條線添加到 K 線上去。

盤一盤 Python - PyEcharts (v1.0)

需要把日期轉成 'Y/m/d' 格式,在轉成清單形式。在 v1.0 中,所有資料都需要轉成清單形式。

盤一盤 Python - PyEcharts (v1.0)

第 2 行用 Kline() 構造函數生成 K 線對象,然後

  • 用 add_xaxis() 來修飾 x 軸(第 3 行)傳入日期清單
  • 用 add_yaxis() 來修飾 y 軸(第 4 行)傳入價格清單
  • 用 set_global_opts() 來設定全局配置(第 5-16 行),主要配置包括:
    • y 軸可縮放,且顔色交錯(第 6-12 行)
    • x 軸可縮放(第 13 行)
    • 設定标題(第 14 行)
    • 資料局域縮放(第 15 行)
盤一盤 Python - PyEcharts (v1.0)

第 20 行用 Line() 構造函數生成線對象,然後

  • 用 add_xaxis() 來修飾 x 軸(第 21 行)傳入日期清單
  • 用 add_yaxis() 來修飾 y 軸(第 22-29 行)傳入最高價清單
  • 用 add_yaxis() 來修飾 y 軸(第 30-37 行)傳入最低價清單
  • 用 set_global_opts() 來設定全局配置,主要設定資料局域縮放(第 38 行)

在修飾 y 軸時,我們還設定了線的寬度和透明度、已經不列印出 y 軸對應的圖示。

盤一盤 Python - PyEcharts (v1.0)

最後将 K 線和兩條線組合在一起,在 notebook 裡展現 (render_notebook)。

盤一盤 Python - PyEcharts (v1.0)

在 v1.0 中,通用代碼長得以下這個樣子

obj = (

Object(...)

.add_xaxis(...)

.add_yaxis(...)

.set_global_options(...)

)

其中 Object 可以是任何常見元件,比如 Kline,Line 和 Bar 等等。三點省略号 ... 就代表各種配置了,具體是什麼那就要讀文檔了。

2

股價 K 線圖 + 折線圖

資料

本小節使用 5 個股票資料,描述如下:

  • 5 隻股票:AAPL, JD, BABA, FB, GS
  • 1 年時期:從 2018-02-26 到 2019-02-26

再加上同時期的标準普爾 500 指數 (SPX),和恐慌指數 (VIX)。資料如下:

stock_data = pd.read_csv( '1Y Stock Data.csv', 
                           parse_dates=[0],
                           dayfirst=True )
stock_data.head().append(stock_data.tail())           

複制

盤一盤 Python - PyEcharts (v1.0)
data = pd.read_csv( 'S&P500.csv', 
                     index_col=0,
                     parse_dates=True,
                     dayfirst=True )
spx = data[['Adj Close']].loc['2018-02-26':'2019-02-26']
spx.head(3).append(spx.tail(3))           

複制

盤一盤 Python - PyEcharts (v1.0)
data = pd.read_csv( 'VIX.csv', 
                     index_col=0,
                     parse_dates=True,
                     dayfirst=True )
vix = data[['Adj Close']].loc['2018-02-26':'2019-02-26']
vix.head(3).append(vix.tail(3))           

複制

盤一盤 Python - PyEcharts (v1.0)

PyEcharts v0.5

我們想把蘋果股票的 K 線圖,和 SPX 和 VIX 折線圖放在一起看。如果再用 Overlap 來疊加它們會顯得圖很亂,這時可以借用 pyecharts 裡的 Grid 對象,它是将上面三個圖放在三個坐标系中。

代碼如下:

盤一盤 Python - PyEcharts (v1.0)

第 1-5 行用 code 擷取股票資料,并擷取日期和價格。為了畫 K 線,價格數組的列必須按 pyecharts 裡 API 要求的順序 - [開盤價, 收盤價, 最低價, 最高價]。

第 6 -7 行建立 Kline 對象 (标題放左邊),并添加 x 軸資料、y 軸資料和“允許橫軸拉伸”。

第 10 -12 行建立 Line 對象 (标題為 SPX,位置離頂 55%) 并起名為 line1,再添加若幹屬性,比如 y 軸範圍、辨別最小值、允許橫軸拉伸。最關鍵的是 datazoom_xaxis_index=[2,1,0],就說伸縮功能控制三個軸,AAPL 一個,SPX 一個,VIX 一個。這樣拉伸 x 軸三幅子圖可以同時動,非常酷!

第 15 -18 行建立 Line 對象 (标題為 VIX,位置離頂 75%) 并起名為 line2,再添加若幹屬性。

第 20 行建立 Grid 對象,寬 1000,高 600 (這些數值是不斷嘗試看效果設定的)。

第 20-23 行将三幅圖加在 Grid 中,關鍵點是如何設定裡面的 grid_top 和 grid_bottom 裡的百分數而使得圖看起來好看,這個沒有标準的,不停地嘗試到你最終滿意為止。本例中 AAPL 占了 5% 到 50% 的位置,SPX 占了 55% 到 70% 的位置,VIX 占了 75% 到 90% 的位置 (還有 10% 位置留給了拉縮軸)。

第 24 行如果被運作,該動态圖被生成到 APPL&VIX.html 網頁檔案裡;如果沒被運作,該動态圖将顯示在 Jupyter Notebook 中。

盤一盤 Python - PyEcharts (v1.0)

從圖上可以看到在 2018 年底 SPX 和 VIX 同時到達最低點和最高點,對應的蘋果 K 線看,在那一點前後蘋果股價有一個大跌和大漲。

PyEcharts v1.0

直接上代碼。

盤一盤 Python - PyEcharts (v1.0)

日期和 OLHC 價格所有資料都需要轉成清單形式。

盤一盤 Python - PyEcharts (v1.0)

用 Kline() 構造函數生成 K 線對象上節已經講過,需要注意的是第 21 行中的 xaxis_index=[0,1,2],這個設定太關鍵了。本圖含三個子圖

  1. 蘋果股票的 K 線圖(index 0)
  2. 标普 500 的折線圖 (index 1)
  3. 恐慌指數的折線圖 (index 2)

上面設定是 index為 1 和 2 的兩幅圖的資料局部伸縮跟着 index 0 那幅圖,這樣就實作了用一根 x 軸的 slider 可以任意縮放三幅圖的資料。

盤一盤 Python - PyEcharts (v1.0)
盤一盤 Python - PyEcharts (v1.0)

用 Line() 構造函數生成線對象上節已經講過,需要注意的是第 34 和 54 行,用 MarkPointOpts 選項辨別出 SPX 的最小值和 VIX 的最大值。

盤一盤 Python - PyEcharts (v1.0)

第 57 行用 Grid() 構造函數來生成網格對象 grid_chart,用來組合上面的三幅圖。

接下來一個個加上 AAPL K 線(第 69-72 行)、 SPX 折線(第 73-76 行)和 VIX 折線(第 77-80 行),注意裡面 GridOpts 選項裡的位置參數。

最後(第 82 行)在 notebook 裡展現 grid_chart。

盤一盤 Python - PyEcharts (v1.0)

3

股價 K 線圖 + 交易量柱狀圖

資料

本小節使用标準普爾 500 指數 (SPX) 在 2018-02-26 到 2019-02-26 的資料。

盤一盤 Python - PyEcharts (v1.0)
盤一盤 Python - PyEcharts (v1.0)

PyEcharts v1.0

首先整理一下資料,比如将它們轉換成清單形式,等等。

date = pd.to_datetime(data.index).strftime('%Y/%m/%d').tolist()
price = data[['Open','Close','Low','High']].values.tolist()
close = data['Close']
volume = data['Volume'].values.tolist()           

複制

先用 Kline() 建構 K 線,這裡面的内容最豐富。

盤一盤 Python - PyEcharts (v1.0)
盤一盤 Python - PyEcharts (v1.0)

重點:

第 7 行 - 添加用 Hex 字元串表示的紅和綠兩種顔色,對應着 K線漲和跌的顔色。

第 22-37 行 - 添加兩個「資料區域縮放」功能,一個看的到(用滑鼠拉縮圖最下面的 slider),一個看不到(用滑鼠直接在圖中拉縮),并且設定 xaxis_index =[0,1],表示用 K 線圖(index 0)來控制柱狀圖(index 1)。

第 39-46 行 - 将兩幅圖的提示框合并在一起(第 41 行這個設定太牛逼)。

第 57-67 行 - 坐标軸訓示器配置和區域選擇元件配置使得資料和軸可以一起關聯。

再用 Line() 建構兩條移動平均線,沒什麼可說的,用 pandas 裡面的 rolling() 函數計算了 MA5 和 MA20。

盤一盤 Python - PyEcharts (v1.0)

再用 Bar() 建構交易量柱狀圖,注意第 112-115 行代碼,這些設定為了不顯示柱狀圖的 x 軸上的資訊。

盤一盤 Python - PyEcharts (v1.0)

最後将 K 線圖、兩條移動均線圖和交易量柱狀圖組合。

盤一盤 Python - PyEcharts (v1.0)

看效果吧。

盤一盤 Python - PyEcharts (v1.0)

4

總結

太累了不想總結了,對 pyecharts v1.0 記着一點就行了:

一切皆配置(options),細節都在裡面。

其他的都可以查文檔,或者在函數中按“shift + tab”來檢視有那些參數。