iT邦幫忙

2021 iThome 鐵人賽

DAY 26
0
自我挑戰組

從HTML到Python爬蟲的30天之旅系列 第 26

Day 26:專案06 - 股市趨勢圖03 | Matplotlib、Pandas繪圖

圖片來源:https://unsplash.com/photos/mcAUHlGirVs

前兩天已經將各股日成交資料存成.csv檔了,接著就來利用這些資料繪製出趨勢圖吧~

匯入Pandas

還記得前天我們將Pandas的DataFrame匯出成csv只靠一個函數嗎? 現在反過來將csv匯入成DataFrame一樣也只需要一個函數哦! 是不是超好用呢?

試著將前天匯出的三種檔案.csv.xlsx.html都匯入成DataFrame看看。匯入的參數大致上和匯出一樣,頂多就編碼要注意一下。

import pandas as pd

# 讀取csv
df1 = pd.read_csv("./month_stock.csv", encoding="big5")
print(df1)

# 讀取excel
df2 = pd.read_excel("./month_stock.xlsx")
print(df2)

# 讀取html
df3 = pd.read_html("./month_stock.html", encoding="utf8")
print(df3)

既然可以匯入csv了,就可以用前天儲存的csv檔繪製趨勢圖了! 繪製趨勢圖我會介紹兩種方法:MatplotlibPandas

Matplotlib繪圖

Matplotlib是Python繪製數據圖的套件,待會就要用這個套件將股價繪製成趨勢圖。

Anaconda已經有matplotlib套件了,沒有的話一樣用pip下載。

pip install matplotlib

載完後就引進你的專案中,但因為matplotlib太長了,通常會減寫成plt

import matplotlib.pyplot as plt

再來,篩選出畫趨勢圖需要的資料,要日期最高價最低價收盤價這幾個欄位。

# 篩選我們要的資料
date = df["日期"]
high_price = df["最高價"]
low_price = df["最低價"]
end_price = df["收盤價"]

plt.plot()這個函數就是在圖上繪製一條折線,第一個參數當作x軸,第二個參數當作y軸。因此我們以時間作為x軸,分別畫出以最高價最低價收盤價為y軸的折線。

# 繪圖
plt.plot(date, high_price)
plt.plot(date, low_price)
plt.plot(date, end_price)

接著加上圖片的一些屬性,待會再用圖說明每個屬性的作用。

plt.xlabel("日期")    # x軸標籤
plt.ylabel("價格")    # y軸標籤
plt.legend(["最高價", "最低價", "收盤價"], loc="lower right")    # 圖示,共有左下、左上、右下、右上四個方位
plt.title("110年8月股市趨勢圖")    # 主標題
plt.grid(True)    # 是否有網格?

最後,用plt.show()顯示圖片!

# 顯示圖片
plt.show()

上方功能列可以執行縮放、拖曳、儲存等動作。

Matplotlib預設並沒有支援中文字體,因此中文字會變成像下圖這樣的亂碼。

解決方法可以參考這篇教學

如果是希望自動存成圖片,請使用plt.savefig()這個函數,記得一定要放在plt.show()之前,不然會存空白的圖!

# 存成圖片(一定要放前面!)
plt.savefig("matplotlib_chart.png")

雖然說matplotlib預設會給每條線不同顏色,但如果不滿意預設的顏色,還是能夠客製化的。

color參數表示線條顏色,用hex色碼表示,可以到這裡挑顏色。
linewidth參數表示線條寬度,數字越大越粗。
linestyle參數則表示線條樣式,參數值可以參考官方文件

plt.plot(date, high_price, color="#ff2121")
plt.plot(date, low_price, color="#00bd42", linewidth=5)
plt.plot(date, end_price, color="#005de0", linestyle="dashed")

Pandas繪圖

嘿嘿~其實Pandas本身就有繪圖功能囉,那你可能會想,那我還學Matplotlib幹嘛?? 事實上,Pandas的繪圖功能有一部份也是依靠Matplotlib的,所以還是要學啦~

Pandas在繪圖前要先把資料整理成DataFrame的型態,雖然匯入的資料本身就是DataFrame了,但是我們只需要其中一部分的資料而已,因此我們要先將我們要的欄位篩選出來,跟上面一樣,要日期最高價最低價收盤價這四個欄位。

接著,要定義一個欄位當作x軸,這邊當然就是用日期欄位。

# 篩選我們要的資料
chart_df = df[["日期", "最高價", "最低價", "收盤價"]]
# 將日期設為x軸
chart_df.set_index("日期", inplace=True)
print(chart_df)

資料整理完後,繪圖就變得很簡單,只需要用plot()這個函數,屬性設定一下就可以了!

# 繪圖
chart = chart_df.plot(xlabel="日期", ylabel="價格", title="110年8月股市趨勢圖", legend=True)
plt.grid()

中文字體問題的解決方法和Matplotlib一樣,請參考上方說明。

最後存檔和顯示圖片的方法與Matplotlib一致。

# 存成圖片(一定要放前面!)
plt.savefig("pandas_chart.png")
# 顯示圖片
plt.show()

結果如下:

趨勢圖就完成了! 至於後續要怎麼應用就看各位的想像力啦!

專案完整程式碼

小結

今天一開始先教大家怎麼從匯入csv檔,然後使用Matplotlib和Pandas這兩種不同方法將股市資料繪製成趨勢圖。

股市趨勢圖的專案就到這邊! 明天開始會教你如何做出天氣小助手,每天早上通知你今天的天氣情形,大家敬請期待~


如果喜歡這系列文章麻煩幫我按Like加訂閱,你的支持是我創作最大的動力~

本系列文章以及範例程式碼都同步更新在GitHub上,後續會持續的更新,如果喜歡也麻煩幫我按個星星吧~

有任何問題或建議,都歡迎在底下留言區提出,還請大家多多指教。


上一篇
Day 25:專案06 - 股市趨勢圖02 | 整年股市資料、Postman
下一篇
Day 27:專案07 - 天氣小助理01 | 氣象資料API
系列文
從HTML到Python爬蟲的30天之旅30

尚未有邦友留言

立即登入留言