1. Homepage
  2. Programming
  3. BIT001計算機程式設計語言 - Projects: 股價下載器, 基礎數值分析與可視化

BIT001計算機程式設計語言 - Projects: 股價下載器, 基礎數值分析與可視化

Engage in a Conversation
CityU MacauBIT001計算機程式設計語言Python股價下載器基礎數值分析與可視化

期末考 Projects 說明 CourseNana.COM

  CourseNana.COM

  CourseNana.COM

整個期末考分數(佔學期總分50%)由兩個 project 組成 CourseNana.COM

  CourseNana.COM

1. Project 1 - 股價下載器:佔期末考分數80% CourseNana.COM

2. Project 2 - 基礎數值分析與可視化:佔期末考分數20% CourseNana.COM

  CourseNana.COM

  CourseNana.COM

Project 1 - 股價下載器 CourseNana.COM

  CourseNana.COM

目標 CourseNana.COM

  CourseNana.COM

建立一個圖形介面應用。運行後,在輸入某港股編號後,點擊下載按鈕可以從 YahooFinance 網站下載該港股最近60個交易日的股價。 CourseNana.COM

  CourseNana.COM

該程序由以下兩個檔案構成: CourseNana.COM

  CourseNana.COM

1. 模組檔案 yf.py:負責定義一個叫 YahooFinanceHistory python 類,專門用 CourseNana.COM

於處理爬蟲工作。 CourseNana.COM

2. 主程序 app.py:負責使用 tkinter 建立圖形介面。 CourseNana.COM

  CourseNana.COM

一點提示 CourseNana.COM

  CourseNana.COM

  CourseNana.COM

模組 yf.py CourseNana.COM

  CourseNana.COM

在該文件中定義的 YahooFinanceHistory 類要具有以下屬性(attribute)和方法 CourseNana.COM

method): CourseNana.COM

  CourseNana.COM

1. _url 屬性:為目標網頁之URL之字符串模板: CourseNana.COM

https://finance.yahoo.com/quote/{code}.HK/history?p={code}.HK CourseNana.COM

其中 {code} 預定填入股票編號的地方。 CourseNana.COM

2. get_data 方法:接受參數 code(為目標股票編號的字符串)。執行該方法後會 CourseNana.COM

Yahoo Finance 下載最近60個交易日的股價。該方法函數應該包含以下四個步 CourseNana.COM

驟: CourseNana.COM

i. _url 建構完整 URL CourseNana.COM

ii. requests.get 函數訪問 Yahoo Finance 網站並取得 HTML 碼。 CourseNana.COM

iii. BeautifulSoup 類分析HTML的結構,並定位所需內容。 CourseNana.COM

iv. 提取數據,建立 DataFrame,並將其返回(return)。 CourseNana.COM

  CourseNana.COM

  CourseNana.COM

# File: yf.py CourseNana.COM

class YahooFinanceHistory: CourseNana.COM

_url = 'https://finance.yahoo.com/quote/{code}.HK/history?p={code}.HK' CourseNana.COM

def get_data(self, code): CourseNana.COM

# 以下請應用課堂上教的爬蟲知識: CourseNana.COM

# 1. `_url` 建構完整 URL CourseNana.COM

# 2. `requests.get` 函數訪問 Yahoo Finance 網站並取得其中 HTML 碼。 CourseNana.COM

# 3. `BeautifulSoup` 物件分析HTML的結構,並定位所需內容。 CourseNana.COM

# 4. 提取數據,建立 `DataFrame`,並將其返回(return)。 CourseNana.COM

return df CourseNana.COM

  CourseNana.COM

第一步:由 _url 建構完整 URL 字符串 url CourseNana.COM

  CourseNana.COM

這一步要用到字符串格式化(string formatting)的知識。 CourseNana.COM

  CourseNana.COM

def get_data(self, code): CourseNana.COM

... CourseNana.COM

url = self._url.format(...) # 請自行完成 CourseNana.COM

... CourseNana.COM

  CourseNana.COM

第二步:用 requests.get 函數訪問 Yahoo Finance 網站並取得 HTML 碼。 CourseNana.COM

  CourseNana.COM

這一步用到網絡爬蟲的內容。 CourseNana.COM

requests.get(url) python 訪問 url 指向的網站,獲取 HTML 內容。可是,YahooFinance 設置了反爬蟲,自動拒絕來自 python 的請求。因此,我們使用一個簡單的方法來反反爬蟲,就是通過設置參數 User-Agent 來假裝自己是普通瀏覽器: CourseNana.COM

  CourseNana.COM

r = requests.get(url, headers={'User-Agent': ua}) CourseNana.COM

其中 ua 為變數名,其值等於以下字符串(也可以從這裏選擇一個): CourseNana.COM

'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15(KHTML, like Gecko) Version/14.1.2 Safari/605.1.15' CourseNana.COM

  CourseNana.COM

成功後 r.text 即為網頁的HTML CourseNana.COM

另,建議在 get_data 中增加一行 r.raise_for_status() 來觸發請求失敗後的報錯。 CourseNana.COM

  CourseNana.COM

第三步:用 BeautifulSoup 物件分析HTML的結構,並定位所需內容。 CourseNana.COM

  CourseNana.COM

同樣是用到網絡爬蟲的內容。 CourseNana.COM

BeautifulSoup bs4 庫的一個類,可以解析HTML內的標簽元素(tag element)的結 CourseNana.COM

構和關係。 CourseNana.COM

  CourseNana.COM

soup = BeautifulSoup(r.text, 'lxml') CourseNana.COM

提示:股價數據所在標簽為一 table 標簽。該標簽具有屬性 data-test,屬性的值為 CourseNana.COM

historical-prices。請利用這一點。 CourseNana.COM

  CourseNana.COM

第四步:提取數據,建立 DataFrame,並將其返回(return CourseNana.COM

  CourseNana.COM

在目標 table 標簽中,可以發現股價數據表每行 row 都處於一個 tr 標簽中。而每行 row CourseNana.COM

當中每個格(cell)上的數據又位於稱為 th td 的標簽中。 CourseNana.COM

  CourseNana.COM

因此,我們可以 CourseNana.COM

  CourseNana.COM

table = soup.find?????? # 請自行完成 CourseNana.COM

trs = table.find_all('tr') CourseNana.COM

data = list() CourseNana.COM

for tr in trs: CourseNana.COM

cells = tr.find_all(['th', 'td']) CourseNana.COM

row = list() CourseNana.COM

for cell in cells: CourseNana.COM

row.append(cell.text.strip()) CourseNana.COM

data.append(row) CourseNana.COM

df = pandas.DataFrame(data[1:61], columns=data[0]) # 只要60個交易日數據 CourseNana.COM

至此 get_data 這個方法函數應該大致上完成。請自行調試。 CourseNana.COM

  CourseNana.COM

主程序 app.py CourseNana.COM

  CourseNana.COM

題目要求的圖形介面視窗應該包含四個控件(widget): CourseNana.COM

  CourseNana.COM

1. 標語文字(使用控件類 Label):用於顯示輸入股價的提示標語 CourseNana.COM

2. 輸入欄位(使用控件類 Entry):用於輸入港股編號 CourseNana.COM

3. 按鈕(使用控件類 Button):用於觸發爬蟲的行為 CourseNana.COM

4. 結果狀態提示(使用控件類 Label):用於顯示爬蟲是否成功: CourseNana.COM

成功則顯示成功! CourseNana.COM

失敗則顯示失敗! CourseNana.COM

  CourseNana.COM

# File: app.py CourseNana.COM

import tkinter as tk CourseNana.COM

import yf # 請把 yf.py 放在同一目錄下 CourseNana.COM

# 按鈕控件觸發以下函數: CourseNana.COM

def download(): CourseNana.COM

# 1. 讀取 Entry 控件的內容 CourseNana.COM

# 1. 調用 YahooFinanceHistory 類。使用其 get_data 下載股價 CourseNana.COM

# 2. 把返回的數據(DataFrame物件)儲存成 csv 檔案 CourseNana.COM

# 4. 利用 try-except 語法捕捉錯誤 CourseNana.COM

# 建立介面視窗 CourseNana.COM

window = tk.Tk() CourseNana.COM

window.geometry('200x200') CourseNana.COM

window.title('股價下載器') CourseNana.COM

# 下方寫入各控件。所有按件用 pack 進行放置 CourseNana.COM

  CourseNana.COM

第一步:建立控件 CourseNana.COM

  CourseNana.COM

這一步用到 section9 的內容。 CourseNana.COM

  CourseNana.COM

# 用於顯示標語 CourseNana.COM

tk.Label(window, text='請輸入股票編號').pack() CourseNana.COM

ent = tk.Entry(window) CourseNana.COM

ent.pack() CourseNana.COM

tk.Button(..., text='下載', ...).pack() # 請自行完成 CourseNana.COM

lbl = tk.Label(...) CourseNana.COM

lbl.pack() CourseNana.COM

要記住每個控件都需要 master 這個參數來說明該控件是建立在什麼結構之上。 CourseNana.COM

Label Button 兩類控件都需要 text 參數來顯示一些文字。 CourseNana.COM

Button 這類控件還需要 command 參數來說明點擊後觸發的動作。 CourseNana.COM

  CourseNana.COM

  CourseNana.COM

第二步: download 函數 CourseNana.COM

  CourseNana.COM

這是點擊按鈕後要觸發的函數。 CourseNana.COM

它主要做四件事: CourseNana.COM

  CourseNana.COM

1. 讀取 ent 中的內容 CourseNana.COM

2. 調用 yf.py 中的 YahooFinanceHistory 類的 get_data 方法來獲得數據 CourseNana.COM

3. 把數據儲存為 csv CourseNana.COM

4. lbl 中顯示成功或失敗(通過修改 lbl 的屬性 text CourseNana.COM

  CourseNana.COM

  CourseNana.COM

def download(): CourseNana.COM

try: CourseNana.COM

code = ent.get() CourseNana.COM

df = yf.YahooFinanceHistory().get_data(code) CourseNana.COM

except: CourseNana.COM

lbl['text'] = ??? # 請自行完成 CourseNana.COM

else: CourseNana.COM

df.to_csv(...) # 請自行完成 CourseNana.COM

lbl['text'] = ??? # 請自行完成 CourseNana.COM

  CourseNana.COM

繳交詳情和配分 CourseNana.COM

  CourseNana.COM

Project 1 完成後請繳交以下檔案: CourseNana.COM

  CourseNana.COM

1. 40%)代碼檔案(yf.py app.py CourseNana.COM

2. 30%)說明文件(PDF格式): CourseNana.COM

i. 精簡,清晰,完整 CourseNana.COM

ii. 介紹你撰寫的程序的目的和功能,使用方式,設計原理(python 模組、類,和 CourseNana.COM

函數等)。 CourseNana.COM

iii. 可用 markdownWord,或 PowerPoint 等軟件但最後要轉換成 PDF CourseNana.COM

  CourseNana.COM

  CourseNana.COM

3. 30%且必須)程序運行情況的螢幕錄影(.mp4)一個: CourseNana.COM

i. 長度不多於1分鐘 CourseNana.COM

ii. 影片應包含以下過程:啟動程序;輸入股票編號;點擊按鈕爬蟲;顯示成功; CourseNana.COM

同框目睹數據檔案的產生,並將之打開。 CourseNana.COM

  CourseNana.COM

  CourseNana.COM

上傳時,不用把以上檔案打包成zip CourseNana.COM

  CourseNana.COM

Project 2 - 數據分析與可視化 CourseNana.COM

  CourseNana.COM

目標 CourseNana.COM

  CourseNana.COM

Project 1 所下載下來的60個交易日之數據,用 pandas 作簡單加工,再畫圖顯示。 CourseNana.COM

  CourseNana.COM

步驟 CourseNana.COM

  CourseNana.COM

1. pandas 讀取 project 1 中下載得來的股價數據 csv,得到一 DataFrame CourseNana.COM

2. 檢查有否數據異常,把各 column 轉為相應類型(datatime, float, integer, object, ... CourseNana.COM

3. DataFrame index 轉為 Date CourseNana.COM

4. DataFrame rolling 方法計算 Adj Close 5, 10, 15 天移動平均值,分別建立 CourseNana.COM

column ma5, ma10, ma15 紀錄 CourseNana.COM

5. 建立 column pos,使當 ma5 數值大於ma10 數值的日子中,pos的數值取 1 CourseNana.COM

其餘日子中 pos 的數值取 0. CourseNana.COM

6. Adj Close, ma5, ma10, ma15 全部畫在同一個圖中,並加上 title 說明股票編 CourseNana.COM

號,然後把圖片儲存為 png。如下頁所示: CourseNana.COM

  CourseNana.COM

  CourseNana.COM

沒有提示 CourseNana.COM

  CourseNana.COM

project 1 不同,project 2 為全自學模式。請同學自行找尋資料依上頁步驟完成題目。 CourseNana.COM

  CourseNana.COM

閱讀材料可以找: CourseNana.COM

  CourseNana.COM

pandas 等相關的工具庫(還有其他工具庫需要用到嗎?請自行研究)的官方網頁和 CourseNana.COM

說明文件。 CourseNana.COM

各式搜尋引擎尋找網上的文章 CourseNana.COM

Youtube 等視頻網站 CourseNana.COM

本課程講義。 CourseNana.COM

  CourseNana.COM

  CourseNana.COM

繳交詳情和配分 CourseNana.COM

  CourseNana.COM

Project 2 完成後請繳交以下檔案: CourseNana.COM

  CourseNana.COM

1. 70%)代碼檔案一個:可以寫在 .py .ipynb CourseNana.COM

2. 10%)數據檔案(.csv)一個 CourseNana.COM

3. 10%)圖片檔案(.png)一個 CourseNana.COM

4. 10%且必須)程序運行情況的螢幕錄影(.mp4)一個(不多於1分鐘長度):影片 CourseNana.COM

應包含以下過程: CourseNana.COM

i. 在你的電腦上啟動程序 CourseNana.COM

ii. 運行結束後,目睹png檔的產生,並將之打開。 CourseNana.COM

  CourseNana.COM

  CourseNana.COM

上傳時,不用把以上檔案打包成zip CourseNana.COM

  CourseNana.COM

繳交方式 CourseNana.COM

  CourseNana.COM

1. 兩個 project 各自經 tronclass 繳交所有要求的檔案 CourseNana.COM

2. 現場 USB 繳交。 CourseNana.COM

  CourseNana.COM

  CourseNana.COM

注意:需分別交給本課程(BIT001計算機程式設計語言)以及BIT002設計計算工作室1的老師。詳情請向相關老師查詢 CourseNana.COM

Get in Touch with Our Experts

WeChat (微信) WeChat (微信)
Whatsapp WhatsApp
CityU Macau代写,BIT001代写,計算機程式設計語言代写,Python代写,股價下載器代写,基礎數值分析與可視化代写,CityU Macau代编,BIT001代编,計算機程式設計語言代编,Python代编,股價下載器代编,基礎數值分析與可視化代编,CityU Macau代考,BIT001代考,計算機程式設計語言代考,Python代考,股價下載器代考,基礎數值分析與可視化代考,CityU Macauhelp,BIT001help,計算機程式設計語言help,Pythonhelp,股價下載器help,基礎數值分析與可視化help,CityU Macau作业代写,BIT001作业代写,計算機程式設計語言作业代写,Python作业代写,股價下載器作业代写,基礎數值分析與可視化作业代写,CityU Macau编程代写,BIT001编程代写,計算機程式設計語言编程代写,Python编程代写,股價下載器编程代写,基礎數值分析與可視化编程代写,CityU Macauprogramming help,BIT001programming help,計算機程式設計語言programming help,Pythonprogramming help,股價下載器programming help,基礎數值分析與可視化programming help,CityU Macauassignment help,BIT001assignment help,計算機程式設計語言assignment help,Pythonassignment help,股價下載器assignment help,基礎數值分析與可視化assignment help,CityU Macausolution,BIT001solution,計算機程式設計語言solution,Pythonsolution,股價下載器solution,基礎數值分析與可視化solution,