Chapter 2 Build Database
2.1 SQL
對於專題接下來會用到的資料,因為繁雜眾多,我們決定透過SQL來整合成一個資料庫,因此我們學了RSQLite
以及DBI
這兩個新package。學習過程中我們快速了解到SQL的核心是──CRUD。
以下為SQL插入資料的範例指令
<- "INSERT INTO reits_stock (time, stock_price, outstanding_share, market_value, stock_id, name) VALUES ('2005-10-05', 6.198, 1393000, 8633814, '01002T', '國泰一號');"
insert_statement dbExecute(con, statement = insert_statement)
若想將幾千筆以上的excel資料整合到db檔案,上述一筆一筆手動插入絕對行不通。因此我們運用string format
的技巧,利用For loop快速插入。
首先定義一個運算子。
`%--%` <- function(x, y)
{do.call(sprintf, c(list(x), y))
}
接下來轉化原本的插入指令成
<- function(a1,a2,a3,a4,a5,a6)
insert_data
{<- "INSERT INTO sat (time, stock_price, outstanding_share, market_value, stock_id, name) VALUES (%s, %s, %s, %s, %s, %s);" %--% c(a1,a2,a3,a4,a5,a6)
insert_statement dbExecute(con, statement = insert_statement)
}
就可以很快把excel資料匯進我們的資料庫。
而我們專題設定了6個表格。
<- dbConnect(RSQLite::SQLite(), dbname = db_path)
con dbListTables(con)
## [1] "all_index" "m_index" "re" "sp"
## [5] "tr_index" "wr"
2.2 網路爬蟲獲得國外REITs資料
Yahoo Finance有日本REITs股價資料,我們想起老師曾介紹的quantmod
套件,真的很快速又方便下載到我們想要的資料。
<- read_excel("C:/User/Downloads/Japan.xlsx")
data getSymbols(data$stock_id, src = "yahoo", from = "2016-06-28", to = "2021-06-28")
數據爬下來後為xts檔,其好用之處在於,即使各檔第一列起始時間不同,merge()
會自動對齊時間,用在時間序列資料處理真的很方便。
<- xts()
datasetfor(i in data$stock_id)
{<- merge(dataset, Cl(get(i)))
dataset
}write.zoo(dataset, file = "Japan_Close.csv", index.name = "time",
row.names = FALSE, col.names = TRUE, sep = ",")
2.3 NA值處理
當我們在處理NA值發現,NA值過多的資料在轉換時出現布林值而非我們所設定的0。
2.3.1 guess_max的運用
查閱相關資料後發現原來guess_max預設值為1000,當超過前1000筆資料都是NA值,系統將自動判斷vector為logi型態,在處理缺失值data[is.na(data)] <- 0
將會得到False,導致無法進行後面運算。
因此我們學到,如果資料樣本數大且NA值可能很多(例如京城樂富一號2018.12.05起才有資料),應在讀取檔案時提高guess_max上限。
<- read_excel("C:/Users/Download/t-reits.xlsx", guess_max = 10000)
data
# NA
is.na(data)] <- 0 data[
2.4 Outlier處理
在處理outlier這一方面,我們利用ggplot
畫出箱型圖來找出outlier,再使用新函數layer_data()
,可以清楚看到數據的統計量,很實用!
%>% ggplot + geom_boxplot(aes(x = Nation,y = `Average Return`)) data
## Warning: Removed 102 rows containing non-finite values
## (stat_boxplot).
<- data %>% ggplot + geom_boxplot(aes(x = Nation,y = `Average Return`))
plot <- layer_data(plot) plot_data
## Warning: Removed 102 rows containing non-finite values
## (stat_boxplot).
<- layer_data(plot)['outliers'] outlier_data
## Warning: Removed 102 rows containing non-finite values
## (stat_boxplot).
outlier_data
## outliers
## 1 0.4828, 0.9388, 2.2629, 0.9112, 0.8813