還記得幾天前,我用心良苦,緩下腳步讓各位花點時間練一下基本功,
相關項目如下:
(1).【Day17】認識matplotlib套件可以產生的各種統計圖表
(2).【Day18】了解程式碼流程與互動
(3).【Day19】遇到程式結果不如預期如何debug的一些小技巧以及Python撰寫時與其他程式碼特別差異的縮排呈現方式。
其實過程中也讓各位咀嚼消化,
畢竟學習新的東西直接看結果雖然很過癮,
但遇到變化題很容易就掛了。
今天終於要讓大家看到辛苦幾天後的成果,
傳說中的股價數據視覺化的結果呈現如下:
從上面可以看出橫軸(X軸)是股價日期,縱軸(Y軸)是股價,
而圖形我們選擇折線圖來呈現。
其實撰寫程式的過程中難免會遇到一些狀況,
因此我自己將相關資訊print出來以利debug,
這樣就可以見樹又見林,全面的看待整個設計規劃,
相關的資訊如下:
讀取: ['9914,20220926,20221001']
start = 2022-09-26 00:00:00
end = 2022-10-01 00:00:00
['20220926', '20220927', '20220928', '20220929', '20220930']
日期 證券代號 證券名稱 成交股數 成交筆數 ... 最後揭示買價 最後揭示買量 最後揭示賣價 最後揭示賣量 本益比
0 20220926 9914 美利達 1,627,208 1,432 ... 179.50 17 180.00 3 11.25
1 20220927 9914 美利達 646,254 600 ... 184.00 5 184.50 1 11.57
2 20220928 9914 美利達 666,197 756 ... 180.50 1 181.50 4 11.38
3 20220929 9914 美利達 770,727 652 ... 183.50 9 184.00 4 11.50
4 20220930 9914 美利達 957,208 969 ... 179.50 1 180.50 16 11.32
緊接著要送給大家的就是相關的參數檔與程式碼,
不過,還是建議大家親自打過程式會對問題比較有印象,
否則只是淪於複製貼上的手工藝。
(一) 參數檔設定檔: stockInfo.txt9914,20220926,20221001
(二) 股價爬蟲主程式檔: stock_main.py
import matplotlib.pyplot as plt
import data_m as m
from time import sleep
import pandas as pd
all = []
# 先取得條件參數(爬取的日期起迄)
stock_symbol, dates = m.getConfig()
print(dates)
for date in dates:
# 預防遠端主機誤認為攻擊連線
sleep(15)
spyderData = m.spyderData(date, stock_symbol)
all.append(spyderData[0])
df_columns = spyderData[1]
all_df = pd.DataFrame(all, columns = df_columns)
print(all_df)
#第一步,準備資料
day = all_df["日期"].astype(str)
price = all_df["收盤價"].astype(float)
#第二步,新建plot物件
plt.figure(figsize=(20, 10), dpi=100)
#第三步,進行繪圖
plt.plot(day, price, 's-', color= 'r', label=" 收盤價")
plt.title("Chart")
# 第四步,顯示圖形
plt.show()
import requests
from io import StringIO
import pandas as pd
import datetime
def getData():
res = []
f = open('stockInfo.txt')
alist = f.readlines()
print('讀取:',alist)
a, b, c = alist[0].split(',')
res = [a, b, c]
return res
(三) 爬取股價資料的檔案: data_m.py
def getConfig():
data = getData()
dates = []
startDate = datetime.datetime.strptime(data[1], '%Y%m%d')
endDate = datetime.datetime.strptime(data[2], '%Y%m%d')
print('start = ', startDate)
print('end = ', endDate)
# 算出起始到結束共幾天
days = (endDate - startDate).days + 1
# 建立一個list承接工作日的日期
dates = []
for dayNum in range(days):
# 從起始日開始依次
date = (startDate + datetime.timedelta(days=dayNum))
#過濾掉週日
if date.weekday() < 5:
dates.append(date.strftime('%Y%m%d'))
return data[0], dates
# 使用request套件爬取股價資訊
def spyderData(date, symbol):
# 爬取股價資訊
requestData = requests.get('https://www.twse.com.tw/exchangeReport/MI_INDEX?response=csv&date=' + date + '&type=ALL')
txt = [i for i in requestData.text.split('\n') if len(i.split('",')) == 17 and i[0] != '=']
df = pd.read_csv(StringIO("\n".join(txt)), header = 0)
df = df.drop(columns = ['Unnamed: 16'])
f_df = df[df["證券代號"] == symbol]
f_df.insert(0, "日期", date)
df_columns = f_df.columns
return list(f_df.iloc[0]), df_columns
經歷過包含今天的20天,感覺如何,
是不是覺得Python很神,
既會畫畫還能變身成為爬蟲抓取小資族的零用金,
當然,這個程式只是讓各位先了解股價爬蟲的敲門磚,
未來在其他場合我還可以繼續為各位服務咱們再細細道來Python更進階的用法。
今天就先到這兒,明天我們繼續看下去Python還能派出什麼天兵天將下來?