網頁

2021年11月7日 星期日

python:輕鬆取得股價資訊

獲取股票資料庫的方式,大概有下列幾種:

1.向Bloomberg、CMoney等機構購買數據資料
2.網路爬蟲
3.yfinance API (Yahoo股價資料庫)  (最簡單)

本篇就講解如何用 yfinance 來取得美股的資料
首先,用 pip 安裝 yfinance 套件

pip install yfinance

接著我用蘋果(美股代號:AAPL)做範例,
import yfinance as yf
aapl = yf.Ticker("AAPL")
price_data = aapl.history(period="max")
print price_data

輸出結果: 




資料是從 1980~現在,所以資料相當多,通常我只要取得前一天的價格來做參考,
以將 period="max" 改為 "1d"

import yfinance as yf
aapl = yf.Ticker("AAPL")
price_data = aapl.history(period="1d")
print price_data

輸出結果: 


資料欄位分別是開盤價,當日最高價,當日最低價,收盤價,交易量等資訊,
如果只想要取得收盤價格可以 print price_data.Close

import yfinance as yf
aapl = yf.Ticker("AAPL")
price_data = aapl.history(period="1d")
print price_data.Close

輸出結果:



到這邊是不是很簡單呢?!

那如果要同時關注多個公司股價呢? 例如,我想同時取得蘋果(AAPL),微軟(MSFT),特斯拉(TSLA), 亞馬遜(AMZN)的前一天收盤價格該怎麼做?

首先將這些美股代碼放進一個 list,然後用迴圈去遍歷這些美股代號取得報價

import yfinance as yf

stock_lst = ['AAPL', 'MSFT', 'TSLA', 'AMZN']
for name in stock_lst:
    hist = yf.Ticker(name)
    price = hist.history(period='1d')
    print name, price.Close

輸出結果:








 
 
 
 
 
 
由上可以看到 price 是 dataframe 的格式所以輸出會有其他的相關資訊,像是資料型態是float64,所以我們要格式化一下數據,將收盤價取小數點2位再輸出

import yfinance as yf

stock_lst = ['AAPL', 'MSFT', 'TSLA', 'AMZN']
for name in stock_lst:
    hist = yf.Ticker(name)
    price = hist.history(period='1d')
    print '%4s:'%name, '%7.2f'%price.Close
print

輸出結果:


 

 

是不是很簡單呢!

另外一種方式是用 download 一次取得多筆股價,資料以panda dataframe 儲存

import yfinance as yf

df = yf.download('AAPL MSFT TSLA AMAZ', period='1d')
print df.Close 
 

輸出結果: 



 

 輸出至 csv 的檔案,可以藉由 Excel 開啟,範例中我將 df 資料存到 price.csv 檔案中

import yfinance as yf
import pandas as pd

df = yf.download('AAPL MSFT TSLA AMZN', period='1d')
print df.Close
df.Close.to_csv('price.csv')



 

 

也可以自訂期間

df = yf.download('AAPL MSFT TSLA AMZN', start='2021-10-20', end='2021-11-06')

 

 

另外可以參考R的做法:

R語言:簡易爬蟲(股價資訊) 


 





2021年6月11日 星期五

R:使用ARIMA對股價做預測分析

時間序列分析是根據系統觀測得到的時間序列數據,通過曲線擬合和參數估計來建立數學模型的理論和方法。時間序列分析常用在企業經營管理、市場潛量預測、農作物病蟲災害預報、環境污染控制、生態平衡、天文學和海洋學等方面。

今天來針對台灣的護國神山股價的走勢作預測分析,雖然購買股票聽起來很有誘惑力,但我們更應該進行詳細的深入分析,避免以投機為基礎的股票購買。

1.載入相關套件
library(PerformanceAnalytics)
library(quantmod)
library(stringr)
library(forecast)

2.取得TSMC自 2020/1/1 開始的股價 (yahoo的台股股價名稱要用代號.TW)
getSymbols("2330.TW", src="yahoo", from="2020-01-01")
TSMC.TW <- get("2330.TW")

將第四欄位(收盤價)存在變數TSMC_close_price
TSMC_close_price <- TSMC.TW[, 4]

3.對TSMC收盤價做 auto arima,存於變數 fit.a
fit.a <- auto.arima(TSMC_close_price, seasonal=F)
可以先看一下時間序列分析圖
tsdisplay(residuals(fit.a), lag.max=40, main="(3,1,4 Model Residuals)")

最上圖是時間序列的趨勢圖,判斷趨勢是否平穩,
下圖左ACF是畫自相關圖,右邊PACF是畫偏相關圖,用來判斷拖尾和截尾。

4.對 fit.a 做10天的預測(forecast),結果存於 fc1
fc1 <- forecast(fit.a, h=7)


畫出預測趨勢圖
plot(fc1)

fc1的預測低值/高值 可以輸入fc1$lowerfc1$upper 查看:

 

ACF和PACF概念:
ACF(自相關系數)描述的是現在股價與過去某時期之間的所有價格是否相關。PACF(偏自相關系數)描述的是現在的價格單純地和過去某一個價格的相關關系。兩者均為取值範圍 -1~1,絕對值越靠近1,說明相關關系越明顯;絕對值越靠近0,說明兩者之間線性相關很弱。藍色虛線表示的是誤差範圍,當值沒有超過藍色虛線的時候,基本可以認為他們不相關。如:

par(mfrow = c(1, 2))
acf(TSMC.TW$`2330.TW.Close`, main="Series tsmc")
pacf(TSMC.TW$`2330.TW.Close`, main="Series tsmc")
auto.arima(TSMC_close_price, seasonal = F)

對於 MA 模型,我們將使用 ACF 圖來識別 (q) 階,並且 PACF 將呈指數衰減。
如果我們查看 PACF 圖,我們可以注意到它僅在第一次滯後時有一個顯著的尖峰,
這意味著所有高階自相關都可以通過第一次滯後自相關有效地解釋。

如果要尋找最優模型:

先列出 AUTO ARIMA模型:
auto.arima(TSMC_close_price, trace=T)

雖然購買股票聽起來很有誘惑力,但我們更應該進行詳細的深入分析,避免以投機為基礎的股票購買。

原文網址:https://kknews.cc/invest/apy6rlv.html
雖然購買股票聽起來很有誘惑力,但我們更應該進行詳細的深入分析,避免以投機為基礎的股票購買。

原文網址:https://kknews.cc/invest/apy6rlv.html
雖然購買股票聽起來很有誘惑力,但我們更應該進行詳細的深入分析,避免以投機為基礎的股票購買。

原文網址:https://kknews.cc/invest/apy6rlv.html
雖然購買股票聽起來很有誘惑力,但我們更應該進行詳細的深入分析,避免以投機為基礎的股票購買。

原文網址:https://kknews.cc/invest/apy6rlv.html

data_d1=diff(TSMC_close_price, 1) #進行一階差分
tsdisplay(data_d1)                #進行一階差分得到acf和pacf
data_d2=diff(TSMC_close_price, 2) #進行二階差分
tsdisplay(data_d2)                #得到acf和pacf

由上圖可以看出二階差分的PACF有明顯 spike,由於我們使用 AUTO ARIMA 函數為我們提供了更好的數據集方法,因此我們就可以不用再花時間去找模型參數。 

我們可以利用這個方式來檢驗過去的資料,例如在2021年5月份台股經歷一次大跌,TSMC股價也是無法倖免,在5/13最低價$547,我們可以觀測TSMC 2020/1/1到2021/5/2股價,然後預測2021/5/3~2021/6/11 的股價(30天),驗證是否落在真實的股價區間。

將觀測區間股價轉成 ts 時間序列(time series)
tsmc.ts <- ts(TSMC_close_price)
時間序列長度就是觀測區間的天數(348天),存於test.end.ts
(test.end.ts <- length(TSMC_close_price))
將天數往前30天(第318天)
(test.start.ts <- end.ts - 30)
測試資料從318~348天
stock_test<- window(tsmc.ts, start=test.start.ts, end=test.end.ts)
訓練模型從第一天(筆)資料至317天
stock_train <- window(tsmc.ts, start=1, end=(test.start.ts - 1))
對 stock_train 做auto arima
(fit <- auto.arima(stock_train))
然後forecast 30天的資料
fc <- forecast(fit, h=30)
使用自動擬合模型並檢驗殘差
checkresiduals(fit)

繪圖
plot(fc)
將預測期間的股價用紅色線段繪出
lines(stock_test, col="red")

利用ARIMA(0,1,1) 模型預測30個值(藍線),與之前我們預留的30個觀測值(紅線)進行對比,如下圖:


自動擬合模型並檢驗殘差(如上圖)

我們可以看出在5月份股價雖然跌至547,仍然在我們做的預測模型區間內,我們可以看forecast的upper與lower值,最低預測在539:

我們發現雖然模型從統計學意義上來說是擬合的。預測表明TSMC股價應該呈現上漲趨勢,但是由於突發事件的影響,預測值與觀測值的趨勢並沒有很好地重合,但是區間是吻合的。

2021年6月9日 星期三

R:使用ARIMA對COVID-19做時間序列分析

ARIMA模型(Autoregressive Integrated Moving Average model),差分整合移動平均自迴歸模型,又稱整合移動平均自回歸模型,利用這個模型可以對時間序列資料做預測分析,像是股票價格,營業銷售預測,今天就來預測 COVID-19 的疫情。

 

首先,前面幾篇已經談到如何將約翰·霍普金斯大學的疫情統計抓資料下來,程式碼:

library(tidyverse)
library(ggplot2)
library(cowplot)
library(patchwork)
library(forecast)
path <- "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/"
confirm_file <- "time_series_covid19_confirmed_global.csv"
deaths_file <- "time_series_covid19_deaths_global.csv"
recovered_file <- "time_series_covid19_recovered_global.csv"

confirmed_df <- read_csv(paste0(path, confirm_file))
deaths_df <- read_csv(paste0(path, deaths_file))
recovered_df <- read_csv(paste0(path, recovered_file))

range <- 60
sd <- length(confirmed_df) - range; sd
ed <- length((confirmed_df)); ed
dates <- colnames(confirmed_df[, sd:ed]); dates
dates <- as.Date(dates,format = "%m/%d/%y"); dates

#date.list <- seq(from=as.Date(dates[1]),
#                 to=as.Date(dates[range+1]), by=1); date.list
getCountrydata <- function(Country,
                           dates = dates,
                           confirmed_df = confirmed_df,
                           deaths_df = deaths_df,
                           recovered_df = recovered_df,
                           sd = sd, ed = ed) {
  if (Country == "all") {
    cases <- confirmed_df %>%
      #select(-(1:400)) %>%
      select(sd:ed) %>%
      colSums()
    death <- deaths_df %>%
      #select(-(1:400)) %>%
      select(sd:ed) %>%
      colSums()
    recovered <- recovered_df %>%
      #select(-(1:400)) %>%
      select(sd:ed) %>%
      colSums()
  }
  else {
    Country <- enquo(Country)
    cases <- confirmed_df %>%
      filter(`Country/Region` == !! Country) %>%
      #select(-(1:400)) %>%
      select(sd:ed) %>%
      colSums()
    death <- deaths_df %>%
      filter(`Country/Region` == !! Country) %>%
      #select(-(1:400)) %>%
      select(sd:ed) %>%
      colSums()
    recovered <- recovered_df %>%
      filter(`Country/Region` == !! Country) %>%
      #select(-(1:400)) %>%
      select(sd:ed) %>%
      colSums()
  }
  res.df <- tibble(dates,
                   cases = cases,
                   death = death,
                   recovery = recovered,
                   mortality_rate = death/cases,
                   recovery_rate = recovery/cases)
  return(res.df)
}
world.df <- getCountrydata(Country = "all",
                           dates = dates,
                           confirmed_df = confirmed_df,
                           deaths_df = deaths_df,
                           recovered_df = recovered_df, sd, ed)
#Taiwan
taiwan.df <- getCountrydata(Country = "Taiwan*",
                            dates = dates,
                            confirmed_df = confirmed_df,
                            deaths_df = deaths_df,
                            recovered_df = recovered_df, sd, ed)
getdailycase <- function(comfirmed_df, new.df, country, sd, ed, dates) {
  sd <- sd - 1
  ed <- sd
  dates <- colnames(confirmed_df[, sd:ed])
  df <- getCountrydata(Country = country,
                       dates = dates,
                       confirmed_df = confirmed_df,
                       deaths_df = deaths_df,
                       recovered_df = recovered_df, sd, ed)
  first_data <- df$cases[[1]] ; first_data
  new.df['daily'] <- NA;
  for(i in 1:nrow(new.df)) {
    if(i == 1)
      new.df$daily[i] <- new.df$cases[i]- first_data
    else
      new.df$daily[i] <- new.df$cases[i]- new.df$cases[i - 1]
  }
  new.df
}
taiwan.df <- getdailycase(confirmed_df, taiwan.df, "Taiwan*", sd, ed, dates)

我們取最近60天的資料來做分析,資料名稱為 taiwan.df,輸入tail(taiwan.df)可以看到最後6筆(天)的資料:

接著要對這資料做一些處理,
1.載入zoo 套件包,以便將資料轉成可視的時間序列
library(zoo)
2.將taiwan.df的 death (死亡組數欄位)依日期做成zoo.ts 時間序列
zoo.ts <- zoo(as.numeric(taiwan.df$death), dates)
3.自動ARIMA模型分析
arc <- auto.arima(zoo.ts)
summary(arc)

    
4.對分析後的數據 arc 預測4天後的資料存於 fc1
fc1 <- forecast(arc, h=4)

5.畫圖:
plot(fc1, xlab="Date", ylab="Comfirmed Cases")

我們可以看到預測往後四天死亡總人數最高最低的預測數字。
 

因為這圖是對時間序列來繪圖,因此要對這圖表的時間軸轉成日期的格式。

先把圖的x軸座標隱藏
plot(fc1, xaxt="n", xlab="Date", ylab="Death")
用函數 time() 將資料zoo.ts的日期取出存於tt
tt <- time(zoo.ts)
將這日期依間隔10天做成一個向量
ds.lst <- seq(1, length(tt), by=10)
日期格式變數為 YYYY-MM 的格式
fmt <- "%Y-%m"
依時間格式將日期轉成字串標籤
labs <- format(tt[ds.lst], fmt)
畫出X軸的格線
axis(side=1, at = tt[ds.lst], labels=F)
將日期用text函數補上去,角度45度,字體縮小0.8
text(x=tt[ds.lst], y=par()$usr[3]-15, labels=labs,
     srt=45, adj=1, cex=0.8, xpd=TRUE)


下面是對每日確診數做7日的預測:

library(zoo)
zoo.ts <- zoo(as.numeric(taiwan.df$cases), dates)
arc <- auto.arima(zoo.ts)
summary(arc)
fc1 <- forecast(arc, h=7)
plot(fc1, xaxt="n", xlab="Date", ylab="Comfirmed Cases")
tt <- time(zoo.ts)
ds.lst <- seq(1, length(tt), by=10)
fmt <- "%Y-%m"
labs <- format(tt[ds.lst], fmt)
axis(side=1, at = tt[ds.lst], labels=F)
text(x=tt[ds.lst], y=par()$usr[3]-500, labels=labs,
     srt=45, adj=1, cex=0.8, xpd=TRUE)

輸出結果:


可以看未來7日的每日確診數區間
80%最低11783~12016,80%最高12005~14183
95%最低11724~11442,95%最高12064~14757 



您可以參考相關文章:

1.R:COVID-19 疫情統計

2.R:COVID-19 疫情統計(2.繪圖)


2021年5月24日 星期一

R:COVID-19 疫情統計(2.繪圖)

這篇我講解一下如將統計資料做量化的圖表比較分析這樣比較有助於理解

(每日確診數比較:台灣,新加坡,南韓,中國大陸)

上一篇有提到如何將全球COVID-19統計資料抓取下來並存在data farm,例如我取出了台灣,
新加坡,南韓,中國大陸的4個國家最近365天的資料,可以用 tail(data) 來看最近的6筆也就是近6天的統計資料。

台灣在5/22 每日確診數達高峰 723例

新加坡維持每日30~40例

南韓每日約500~600多例

中國大陸10~20幾例

有了這些data frame 就可以用圖表方式來呈現要表示的資料,如果我要比較這4個國家的死亡率(Mortality_Rate)程式如下:

ggplot(taiwan.df, aes(dates, mortality_rate)) +
      geom_line(aes(color="Taiwan")) +
      geom_line(data=singapore.df, aes(color="Singapore")) +
      geom_line(data=korea.df, aes(color="Korea")) +
      geom_line(data=china.df, aes(color="China")) +
      guides(colour = guide_legend("Country")) +
      ggtitle('Mortality Rate Taiwan vs Singapore vs Korea vs China') +
      xlab('') +
      ylab('')

輸出:(新加坡死亡率很低)

(死亡率比較圖)


如果要比較總確診數程式如下:(Y軸我除以1000以K為單位)

ggplot(taiwan.df, aes(dates, cases/10^3)) +
      geom_line(aes(color="Taiwan")) +
      geom_line(data=singapore.df, aes(color="Singapore")) +
      geom_line(data=korea.df, aes(color="Korea")) +
      geom_line(data=china.df, aes(color="China")) +
      guides(colour = guide_legend("Country")) +
      ggtitle('Total Case Taiwan vs Singapore vs Korea vs China') +
      xlab('') +
      ylab('(K)')

輸出:(可以看到韓國確診數非常陡峭)

(總確診數比較)

如果比較每日確診數程式如下:

#Daily Case
ggplot(taiwan.df, aes(dates, daily)) +
    geom_line(aes(color="Taiwan")) +
    geom_line(data=singapore.df, aes(color="Singapore")) +
    geom_line(data=korea.df, aes(color="Korea")) +
    geom_line(data=china.df, aes(color="China")) +
    guides(colour = guide_legend("Country")) +
    ggtitle('Daily Case Taiwan vs Singapore vs Korea va China') +
    xlab('') +
    ylab('')

輸出:

(台灣在五月有很明顯的上升趨勢,韓國在2021/1月高峰後有下降,4月後明顯有增加趨勢,新加坡在2020/8後控制得很不錯)

 

(每日確診數比較)

2021年5月23日 星期日

R:COVID-19 疫情統計

約翰·霍普金斯大學的Github 有分享了全球 COVID-19 疫情的統計資料,點選開啟連結

time_series_covid19_confirmed_global.csv
time_series_covid19_deaths_global.csv
time_series_covid19_recovered_global.csv
這3個檔案分別是全球確診數,死亡人數,復原人數統計

 

將這3個csv檔爬下來後用R的資料篩選,發現其中 5/22/2021台灣的確診數是723例,
並不是指揮中心公布的321例。

R的程式在此,有興趣的人可以參考: 

https://ideone.com/kw4Heg

如果不會寫程式其中網頁也有提供了查詢各個地區國家的疫情統計。

COVID-19 Dashboard


library(tidyverse)
library(ggplot2)
library(cowplot)
library(patchwork)
path <- "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/"
confirm_file <- "time_series_covid19_confirmed_global.csv"
deaths_file <- "time_series_covid19_deaths_global.csv"
recovered_file <- "time_series_covid19_recovered_global.csv"

confirmed_df <- read_csv(paste0(path, confirm_file))
deaths_df <- read_csv(paste0(path, deaths_file))
recovered_df <- read_csv(paste0(path, recovered_file))

sd <- length(confirmed_df) - 21  # start date
ed <- length((confirmed_df))     # end date
dates <- colnames(confirmed_df[, sd:ed])
dates <- as.Date(dates,format = "%m/%d/%y")
dates <- as.POSIXct(dates,tz = "GMT")
getCountrydata <- function(Country,
                           dates = dates,
                           confirmed_df = confirmed_df,
                           deaths_df = deaths_df,
                           recovered_df = recovered_df,
                           sd = sd, ed = ed) {
  if (Country == "all") {
    cases <- confirmed_df %>%
      #select(-(1:400)) %>%
      select(sd:ed) %>%
      colSums()
    death <- deaths_df %>%
      #select(-(1:400)) %>%
      select(sd:ed) %>%
      colSums()
    recovered <- recovered_df %>%
      #select(-(1:400)) %>%
      select(sd:ed) %>%
      colSums()
  }
  else {
    Country <- enquo(Country)
    cases <- confirmed_df %>%
      filter(`Country/Region` == !! Country) %>%
      #select(-(1:400)) %>%
      select(sd:ed) %>%
      colSums()
    death <- deaths_df %>%
      filter(`Country/Region` == !! Country) %>%
      #select(-(1:400)) %>%
      select(sd:ed) %>%
      colSums()
    recovered <- recovered_df %>%
      filter(`Country/Region` == !! Country) %>%
      #select(-(1:400)) %>%
      select(sd:ed) %>%
      colSums()
  }
  res.df <- tibble(dates,
                   cases = cases,
                   death = death,
                   recovery = recovered,
                   mortality_rate = death/cases,
                   recovery_rate = recovery/cases)
  return(res.df)
}
world.df <- getCountrydata(Country = "all",
                           dates = dates,
                           confirmed_df = confirmed_df,
                           deaths_df = deaths_df,
                           recovered_df = recovered_df, sd, ed)
#Taiwan
taiwan.df <- getCountrydata(Country = "Taiwan*",
                            dates = dates,
                            confirmed_df = confirmed_df,
                            deaths_df = deaths_df,
                            recovered_df = recovered_df, sd, ed)

tmp.cases.plot <- function(df.plot, Country) {
  df.plot %>%
    mutate(cases_k = cases) %>%
    ggplot( aes(x=dates, y=cases_k)) +
    geom_line(color="#69b3a2") +
    geom_point(color="#69b3a2", size=1) +
    scale_x_datetime(breaks = world.df$dates,
                     date_labels = '%m/%d')+
    ggtitle(paste0(Country," Evolution of COVID-19 cases")) +
    ylab("cases") +
    theme_cowplot() +
    theme(axis.text.x = element_text(size = 10,
                                     vjust = 0.5,
                                     hjust = 0.5,
                                     angle = 90))
}

tmp.deaths.plot <- function(df.plot, Country) {
  df.plot %>%
    ggplot( aes(x=dates, y=mortality_rate)) +
    geom_line(color="#69b3a2") +
    geom_point(color="#69b3a2", size=1) +
    scale_x_datetime(breaks = world.df$dates,
                     date_labels = '%m/%d')+
    ggtitle(paste0(Country," Evolution of COVID-19 death rates")) +
    ylab("Mortality rates(Death/Cases)") +
    theme_cowplot()+
    theme(axis.text.x = element_text(size = 10,
                                     vjust = 0.5,
                                     hjust = 0.5,
                                     angle = 90))
}
tmp.recover.plot <- function(df.plot, Country) {
  df.plot %>%
    ggplot( aes(x=dates, y=recovery_rate)) +
    geom_line(color="#69b3a2") +
    geom_point(color="#69b3a2", size=1) +
    scale_x_datetime(breaks = world.df$dates,
                     date_labels = '%m/%d') +
    scale_y_continuous(breaks=seq(0,1,0.2),limits = c(0,1)) +
    ggtitle(paste0(Country," Evolution of COVID-19 recovery rates")) +
    ylab("Recovery rates(Recovery/Cases)") +
    theme_cowplot()+
    theme(axis.text.x = element_text(size = 10,
                                     vjust = 0.5,
                                     hjust = 0.5,
                                     angle = 90))
}
#----------
sd <- length(confirmed_df) - 22; sd
ed <- sd; ed
dates <- colnames(confirmed_df[, sd:ed])
df <- getCountrydata(Country = "Taiwan*",
                     dates = dates,
                     confirmed_df = confirmed_df,
                     deaths_df = deaths_df,
                     recovered_df = recovered_df, sd, ed)
first_data <- df$cases[[1]] ; first_data
taiwan.df['daily'] <- NA; taiwan.df
for(i in 1:nrow(taiwan.df)) {
  if(i == 1)
    taiwan.df$daily[i] <- taiwan.df$cases[i]- first_data
  else
    taiwan.df$daily[i] <- taiwan.df$cases[i]- taiwan.df$cases[i - 1]
}; tail(taiwan.df, 10)

tmp.daily.plot <- function(df.plot, Country) {
  df.plot %>%
    mutate(daily = daily) %>%
    ggplot(aes(x = dates, y = daily)) +
    geom_line(color="#69b3a2") +
    geom_point(color="red", size=1) +
    scale_x_datetime(breaks = world.df$dates, date_labels = '%m/%d')+
    ggtitle(paste0(Country," Evolution of COVID-19 daily")) +
    ylab("daily") +
    theme_cowplot() +
    theme(axis.text.x = element_text(size = 10,
                                     vjust = 0.5,
                                     hjust = 0.5,
                                     angle = 90))
}
pic1 <- tmp.daily.plot(df.plot = taiwan.df, Country = "Taiwan"); pic1
pic2 <- tmp.cases.plot(df.plot = taiwan.df, Country = "Taiwan"); pic2
pic3 <- tmp.deaths.plot(df.plot = taiwan.df, Country = "Taiwan"); pic3
pic4 <- tmp.recover.plot(df.plot = taiwan.df, Country = "Taiwan"); pic4
pic1 + pic2 + pic3 + pic4 + plot_layout(ncol = 2)

輸出:



2021年5月19日 星期三

如何建立實聯制Google表單

 1.將COVID-19 防疫實聯制建立副本到自己的雲端硬碟

將Google試算表「COVID-19防疫實聯制措施」建立副本到你自己的雲端硬碟

2.點選【建立副本】

 3.此時畫面會出現: 上方會有副本字樣,雲端硬碟也會有此檔案


 4.請點選執行「創用CC授權(姓名標示)」這項功能,目的是在首次執行客製功能前會自動跳出要求你完成授權同意程序。


5.會虛線需要授權提示,按下【繼續】

6.選擇你的【帳號】:

7.點選【進階】

 8.點選【前往「COVID-19防疫實聯制措施」(不安全)】

9.點選【允許】上述條款

10. 此時再點選「創用CC授權(姓名標示)」這項功能,右下角會出現下圖的訊息就表示授權成功


 11.下拉選單【COVID-19防疫實聯制功能】,選擇【建立掃瞄表單網址QRcode】

右下角出現【已建立表單網址QRcode文件】表示QRcode已經建立


 12.到我的雲端硬碟查看會有一個COVID-19防疫實聯制措施(列印QRcode)檔案

13.點選開啟檔案就可看到QRcode


14.如果你是店家可以使用「COVID-19防疫實聯制措施之連鎖企業版

15.例如:分店號碼1234


產生的QRcode


 16.用QRcode APP掃描後填寫表單資料,在雲端硬碟的檔案即可看到掃描的資料。