close

螢幕面前的你,一定迫不及待想要看看數據視覺化的效果,
沒錯,很多觀點在以視覺化呈現後將會讓人更容易理解與溝通,
我們緊接著看下去。
(一) 本次程式執行流程說明
本次程式共3個檔案,stock_main.py為主程式,data_m.py為自行建立的自訂函式以及stockInfo.txt文字設定檔。
執行的步驟說明如下:
圖片

  1. 主程式呼叫自訂函式data_m.py中的getConfig()取得stockInfo.txt設定檔內容。
  2. 接著data_m.py內部呼叫getTimeData()取得起、迄爬取日期。
  3. 主程式接著呼叫spyderData()爬取股價資訊。
  4. 緊接著stock_main.py主程式開始產生數據視覺化的第一步-準備資料。
  5. 數據視覺化的第二步-新建plot物件作為畫布。數據視覺化的第三步-進行繪圖。
  6. 繪完圖及以統計圖表方式呈現出來。

(二) 本次實作

相關檔案內容與程式碼如下:

檔名: stockInfo.txt
9914,20220926,20221003
# stock_main.py主程式: 
import data_m as m
from time import sleep
import pandas as pd

all = []

stock_symbol, dates = m.getConfig()


for date in dates:
    sleep(5)
    
    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)
# 自訂函式data_m.py:


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


def getConfig():
    data = getData()
    dates = []
    
    startDate = datetime.datetime.strptime(data[1], '%Y%m%d')
    endDate = datetime.datetime.strptime(data[2], '%Y%m%d')
    
    # 算出起始到結束共幾天
    days = (endDate - startDate).days + 1
    for dayNum in range(days):
        # 從起始日開始依次
        date = (startDate + datetime.timedelta(days=dayNum))
        
        #過濾掉週日
        if date.weekday() < 6:
            dates.append(date.strftime('%Y%m%d'))
            
        return data[0], dates
    
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

你會發現只有顯示股價資料列,
因為第三步驟還沒有處理,無法開始繪圖。

因此我們就需要在主程式中加入以下程式碼:

    #第一步
    day = all_df["日期"].astype(str)
    price = all_df["收盤價"].astype(float)
#第二步
plt.figure(figsize=(20, 10), dpi=100)
#第三步
plt.plot(day, price,  's-', color= 'r', label=" 收盤價")

plt.title("Chart")

plt.show()

或許看完了心中會有疑惑,怎麼還沒有看到圖表呢?
當然,這兩天就是要讓大家多看一下程式碼與觀念,
就跟蹲馬步一樣,
明天我們再繼續。

arrow
arrow

    生活實踐家Adam 發表在 痞客邦 留言(5) 人氣()