目錄
    Add a header to begin generating the table of contents

    新手 2/3:如何用 Google Colab 製做互動表格和圖表?快來學 Import library/Jupyter

    新手-23:Google-Colab-如何製做互動表格和圖表?快來學-Import-libraryJupyter
    Share on facebook
    Share on twitter
    Share on linkedin
    Share on whatsapp
    目錄
      Add a header to begin generating the table of contents

      還未知道什麼是 Google Colab Notebook?記得閱讀:新手 1/3:5 分鐘免安裝學習 Python?Google Colab Notebook 幫緊您!

      上回我們提及 Google Colab Notebook 的好處是免安裝,十分適合零經驗、想直接學習 Python 編程的小夥伴。現在,我們來一些複雜一點的編程,希望從中學習:

      • 什麼是 Library/如何 Import Library
      • 製作一張簡單、易明的 Google Colab Notebook 表格
      • 製作精美的互動式(Interactive)圖表
      • 多一些 Python 編程的技巧

      左思右想,還是覺得一個股票類的例子比較容易明白。我們今天的目標是在 Google Colab Notebook 設計一張可以匯入股價的表格,並以圖表形式顯示股票最近 5 年的走勢。

      我們的數據來源是 Yahoo! Finance,有興趣了解更多有關 Yahoo! Finance 的資訊可以按這裡。

      事不宜遲,我們開始咯!

      我是廣告 ^o^

      第一步:設計表格

      首先我們加入 2 個 Markdown block (如何加入 Markdown Block?),並且分別填上「# Google Colab Notebook 範例 1」及「## 表格」。留意 “#” 是代表 Markdown block 的大小,越多 “#”,字體越小。

      完成後,我們在 Code block 的位置填上以下代碼:

      #@title 設定股票
      symbol = '0005.HK' #@param {type:"string"}
      print('系統已經紀錄: '+ symbol)

      留意畫面的右方會出現一個「symbol: “0005.HK”」的框。這個就是 Google Colab/Jupyter 的互動式(Interactive)表格,可以方便我們隨時隨地更改變數的值。

      點擊一下 Play 按鈕,下方將會顯示成功的信息。由於我們的 Notebook 已經紀錄了 symbol 是 “0005.HK”,所以待會可以直接使用 symbol 變數。

      第二步:匯入 Pandas 等的 Library

      什麼是 Library

      其中一個 Python 編程普及的原因,在於 Python 語言擁有十分豐富的編程 Library。Library 是指一些已經完成的 Python 編碼,可以延伸 Python 編程的功能。

      我是廣告 ^o^

      比方說,如果 Python 編程是健身,那麼 Python 內置的功能(例如加減乘除)就是健身室,而 Python 的 Library 就是健身設備。如果只有健身室,那麼您能夠做到的運動動作很有限/十分艱辛;但如果您有許多不同的健身設備,例如跑步機、背肌重訓托架,那麼您能完成的動作將會大幅增加。

      Pandas、Pandas Datareader、Plotly、Flask、Tensorflow、NLTK 等等的 Library 就是您的健身設備。因為這些豐富的免費/公開 Library,我們可以省卻許多艱鉅(Technical)的編程,而主要專注在應用(Implementation)方面。

      我們需要什麼 Library

      第二個問題就是我們需要什麼 Library。這是開始每個 Python 編程的項目前,我們必須考慮和探索的問題。以下分享一個我覺得好用的思考方法,讓大家參考如何決定自己需要什麼 Library:

      先問自己:用途再去發掘:Library
      從 Yahoo! Finance下載股票價格資料pandas_datareader
      yfinance
      把數據匯出成圖表plotly
      matplotlib
      計算今天與 1 年前的日期datetime

      隨著您對 Python 的認識加深,您會發現許多時候,滿足同一個用途的 Library 不只 1 個。如果我們有多於一個選擇時,該如何處理?

      如何決定用那個 Library

      這是,我們便需要以一些準則作出判斷,包括但不限於:

      我是廣告 ^o^
      • 最符合自己用途的 Library (未必是最流行的 Library!!)
      • 有良好用戶群體的 Library,方便自己解決編程問題
      • 原作者十分活躍的 Library,這樣的 Library 長遠來說較穩定

      對於新手/選擇困難症來說,這步或會頗有挑戰,但只要多做研究(例如 Google 一下其他用家的評價)、不怕試錯,這也是 Python 編程重要和好玩的一環。

      匯入 Library

      感謝網友 K. K. 提點 pandas_datareader 的問題,現已更新以下教學內容。

      說了那麼多,我們來學習如何在 Google Colab Notebook 匯入 Library 吧!

      import datetime
      
      !pip install pandas_datareader --upgrade
      from pandas_datareader import get_data_yahoo
      
      import plotly.express as px
      import plotly.graph_objects as go

      匯入 Library 有 3 種語法:

      語法用途
      import library把這個 Library 的所有功能匯入。適用於重要的 Library,例如 pandas.
      from library import object從 Library 抽取其中一個組件匯入。適用於在非常大的 Library (例如 plotly)但只需要一個組件的時候
      import library as abbr
      import library.object as abbr
      將 Library 或其中一個組件匯入,並簡寫為 abbr。適用於名字很長的 Library 或約定俗成的用法(例如 pdpandas 慣用的簡寫)

      留意我們在 import pandas_datareader 前加入了 !pip install pandas_datareader --upgrade 的字句。這是因為 Colab 的 pandas_datareader 版本比較舊,沒有兼容最新的數據。所以,我們先將 pandas_datareader 更新,再匯入這個 Library。

      有興趣詳情可以參考這篇:VSCode 4/5: 讓 pip 安裝和管理 Python Libraries,結合虛擬環境!

      我是廣告 ^o^

      第三步:提取股價

      noOfYears = 5
      endDate = datetime.datetime.now()
      startDate = endDate - datetime.timedelta(days=365 * noOfYears)
      print('現在我們提取從 ', startDate, ' 到 ', endDate, ' 的股價\n')
      
      data = get_data_yahoo(symbol, startDate, endDate)
      print('提取成功!數據是:\n', data)

      計算日期

      我們需要先找出今天與5年前的日期,以告訴 Python 去提取什麼日子的數據。datetime library 的 datetime.datetime.now() 將會是您的好朋友,而 datetime.timedelta() 則可以為我們進行日期的運算。透過上面第 1 至 4 行的編程,我們成功計算出今天與5年前的日期。

      接著,我們把股票代號(symbol),起始日(startDate)和完結日(endDate)作為函數(Inputs)輸入 Pandas Datareaderget_data_yahoo() 功能。

      從 Pandas Datareader 提取數據

      留意由於我們前面 import library 時使用了 from pandas_datareader import get_data_yahoo 而非 import pandas_datareader as pdr,所以可以直接使用 data = get_data_yahoo() 而不需要 data = pdr.get_data_yahoo()

      當我們把 data 變數 print 出來看時,可以見到一個類似 Excel 試算表的輸出。這個變數其實就是鼎鼎大名的 Pandas Dataframe!(這也很合理,因為我們使用了 Pandas Datareader)

      從這個輸出,我們亦能看到有關這個 Pandas Dataframe 的基礎資料。例如這裡顯示有 1,236 列(Row)和 6 行(Column),代表我們有這個股票代號 1,236 個交易日(約 5 年)的 6 項資料。這 6 項資料就是 High, Low, Open, Close, Volume, Adj Close。

      我是廣告 ^o^

      有了 Pandas Dataframe 就好辦事了!

      第四步:製作圖表

      還記得我們有 import Plotly 這個 library 嗎?沒錯,這個就是我們製作圖表的好朋友(Graphing engine)。

      簡單:折線圖

      data = data.reset_index()
      fig = px.line(data, x="Date", y="Adj Close", title= symbol + ' 的走勢圖')
      fig.show()

      首先我們來一個比較容易的圖表。Yahoo! Finance 的 Adj Close (調整後收市價)是一個包含股息(Dividend)、企業行動(Corporate Action)影響的股價,比較適合量化持股總收益(Total Return)。

      我們在上述 3 行編碼,把先前從 Pandas Datareader 獲得的 Pandas Dataframe(即是 data 變數)數據製成圖表。x="Date" 即是把數據的日期設為 X 軸,而 y="Adj Close" 就是把數據的調整後收市價設為 Y 軸。

      留意我們加入了 data = data.reset_index(),因為原先數據的 Date 是一個索引(Index)而非一個行(Column),所以我們透過重設索引,使 Date 變成可以用以製作圖表的行(Column)。

      我是廣告 ^o^

      按下 Play 按鈕後,在 Code Block 的下方出現了一張互動式(Interactive)折線圖。把鼠標在圖表上移動的話,可以徘徊(Hover)時看到不同日子的數值。有興趣了解更多有關 Plotly 互動式圖表可以按此。

      進階:OHLC (陰陽燭)圖表

      data = data.tail(255)
      fig = go.Figure(
              data=go.Ohlc(
                      x=data['Date'],
                      open=data['Open'],
                      high=data['High'],
                      low=data['Low'],
                      close=data['Close']
                  ),
                layout=dict(title= symbol + ' 的 OHLC 圖')
            )
      fig.show()

      除了剛才提及的折線圖外,我們亦可以製做俗稱陰陽燭的 OHLC 圖表。這種圖表用於股票走勢的技術分析(Technical Analysis),亦是 Plotly 這個 Library 的內置圖表之一。

      與剛才略有不同,我們使用 plotly.graph_objects,是比較進階的 Plotly 圖表,但基本使用跟 plotly.express 差不多,也就不在這裡重複。

      留意我們在編程的第一句使用了 data.tail(255)tail(n) 這個功能讓我們可以直接提取 Pandas Dataframe 的最後 n 個列(Row),所以我們使用這個功能,把數據限制於最後 255 列,大概就是一年的交易日數目。

      製成品/完整代碼

      恭喜您已經建立了第一個 Google Colab Notebook 表格,並以 Google Colab Notebook 為基礎,透過股票價格數據製成精美圖表!

      我是廣告 ^o^

      除了 0005.HK 以外,您也可以在表格嘗試其他股票代號以獲取其他股票的價格。小貼士:您可以按 Runtime -> Run all 一次執行所有 Code block,就不用逐個逐個按 Play 按鈕。

      在這裏亦分享這個教程的完整代碼,如果您想直接使用我的 Python 代碼拷貝,可以在下方按 “Open in Colab” 直接執行這個 Google Colab Notebook 喔。

      下一步

      下一篇我們來學習一下 Google Colab Notebook 的 I/O,讓我們可以直接在 Google Colab Notebook 使用我們自訂的文件/數據!

      下一篇:新手 3/3:Google Colab 如何讀取/輸出檔案?從 Google Drive 存取 CSV

      我是廣告 ^o^

      人氣文章

      快讓我學更多

      small_c_popup.png
      想學習 Python 嗎?
      快來訂閱我們的電子報!