TShopping

 找回密碼
 註冊
搜索
查看: 303|回復: 0

[轉帖] Python 時間序列實做!

[複製鏈接]
發表於 2021-7-8 15:03:16 | 顯示全部樓層 |閱讀模式
 
Push to Facebook
這篇文章會教如何將爬下來的資料整理成 time series (時間序列)
每日爬蟲
首先,我們將之前一篇:超簡單台股每日爬蟲教學 所分享的程式碼變成以下的function,方便我們多次呼叫,才能爬每一天的股價。
每日股價爬蟲
  1. import requests
  2. from io import StringIO
  3. import pandas as pd
  4. import numpy as np

  5. def crawl_price(date):
  6.     r = requests.post('http://www.twse.com.tw/exchangeReport/MI_INDEX?response=csv&date=' + str(date).split(' ')[0].replace('-','') + '&type=ALL')
  7.     ret = pd.read_csv(StringIO("\n".join([i.translate({ord(c): None for c in ' '})
  8.                                         for i in r.text.split('\n')
  9.                                         if len(i.split('",')) == 17 and i[0] != '='])), header=0)
  10.     ret = ret.set_index('證券代號')
  11.     ret['成交金額'] = ret['成交金額'].str.replace(',','')
  12.     ret['成交股數'] = ret['成交股數'].str.replace(',','')
  13.     return ret
複製代碼

就跟之前是一樣的,只是被包成 function ,它的 input 是日期,output 是 dataframe,寫程式最重要的就是瞭解 input 跟 output 的型態,就會比較簡單了!

呼叫每日爬蟲,連續爬 n 天
接下來我們就來利用這個 function 幫我們爬最近9天的資料,並將數據存在 data 這個 variable 中:
一次爬 n_days 天的股價
  1. import datetime
  2. import time

  3. data = {}
  4. n_days = 9
  5. date = datetime.datetime.now()
  6. fail_count = 0
  7. allow_continuous_fail_count = 5
  8. while len(data) < n_days:

  9.     print('parsing', date)
  10.     # 使用 crawPrice 爬資料
  11.     try:
  12.         # 抓資料
  13.         data[date.date()] = crawl_price(date)
  14.         print('success!')
  15.         fail_count = 0
  16.     except:
  17.         # 假日爬不到
  18.         print('fail! check the date is holiday')
  19.         fail_count += 1
  20.         if fail_count == allow_continuous_fail_count:
  21.             raise
  22.             break
  23.    
  24.     # 減一天
  25.     date -= datetime.timedelta(days=1)
  26.     time.sleep(10)
複製代碼

想要增加天數,只要調整 n_days 這個參數就行了!
一切都順利的話,會顯示成以下這樣:

Python 時間序列

Python 時間序列

大部分的天數都是 success 代表成功讀取資料,但是每間隔5天就會顯示兩次 fail,代表那可能是假日,然而不能保證就是了,也可能是你的網路斷掉XD,或是 code 有bug,就要單獨做測試,至少在我的電腦裡,它抓的滿好的。

整理 data 轉成 收盤價 time series
接下來我們來看一下得到了什麼:
  1. print(data[datetime.date(2021,7,8)])
複製代碼

Python 時間序列

Python 時間序列

我們像上圖一樣,只拿取 “2019-06-05” 號的股價,會像上面這樣,變換不同的日期,可以得到不同的表。但這並不是我們想要的,我們想要有 time series,也就是看到某個欄位隨時間變動的圖表,於是我們做以下的轉換:
  1. close = pd.DataFrame({k:d['收盤價'] for k,d in data.items()}).transpose()
  2. close.index = pd.to_datetime(close.index)
  3. close
複製代碼

在上面的程式中,現在我們只拿所有股票的 收盤價,並建構 close 這個 dataframe,這個 dataframe,假如你還不知道什麼是 dataframe,或對 dataframe 還不熟,可以參考連結學習一下。
輸入後會看到以下成品:

Python 時間序列

Python 時間序列
現在整張表都只剩 收盤價 了,而且還是按照日期排列,超讚的!我也覺得很開心,竟然兩行就處理完,可見pandas真的很厲害!
時間序列還有非常多功用!接下來我們就來實做一百種指標吧!

參考文章
https://www.finlab.tw/python-%E6%99%82%E9%96%93%E5%BA%8F%E5%88%97%E5%AF%A6%E4%BD%9C%EF%BC%81/



 

臉書網友討論
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2021-11-29 11:37 , Processed in 0.189480 second(s), 25 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表