閱讀909 返回首頁    go 技術社區[雲棲]


批量抓取保存處理國家數據庫數據的一點小心得

國家數據庫提供了海量的電子統計數據,免去了逐年查詢錄入整理數據的的麻煩,同時我們還能找到提供國家數據庫接口的R包,是我們能夠直接在R中查詢處理數據,很是方便。最近在使用過程中發現了分地域年度指標獲取過程中存在一些小問題,於是結合最近所學寫了兩個函數,實現了批量讀取保存處理國家數據庫數據,記下過程以留後用。

準備工具

首先需要介紹的是rstatscn包,這個包提供了國家數據庫的R接口,具體的函數介紹這裏不在重複,請參照作者文檔。rstatscn提供很方便的數據查詢函數,大大簡化了數據獲得的方法。我們可以通過下麵命令安裝rstatscn包。

install.packages("rstatscn")

問題

但是在進行分省年度數據查詢時,是下麵這樣的結果。有時一個產業分類下一個地區會有多個指標的數據,而這樣隻是顯示出一個。為了獲取全部的數據,我們隻能把數據抓取下來自己處理。

> library(rstatscn)
> statscnQueryData("A010101",dbcode='fsnd',rowcode='reg')
                 2014年 2013年 2012年 2011年 2010年 2009年 2008年 2007年 2006年
北京市                0      0      0      0      0      0      0      0      0
天津市                0      0      0      0      0      0      0      0      0
河北省               11     11     11     11     11     11     11     11     11
山西省               11     11     11     11     11     11     11     11     11
內蒙古自治區         12     12     12     12     12     12     12     12     12
遼寧省               14     14     14     14     14     14     14     14     14
吉林省                9      9      9      9      9      9      9      9      9
黑龍江省             13     13     13     13     13     13     13     13     13
上海市                0      0      0      0      0      0      0      0      0
江蘇省               13     13     13     13     13     13     13     13     13
浙江省               11     11     11     11     11     11     11     11     11
安徽省               16     16     16     16     17     17     17     17     17
福建省                9      9      9      9      9      9      9      9      9
江西省               11     11     11     11     11     11     11     11     11
山東省               17     17     17     17     17     17     17     17     17
河南省               17     17     17     17     17     17     17     17     17
湖北省               13     13     13     13     13     13     13     13     13
湖南省               14     14     14     14     14     14     14     14     14
廣東省               21     21     21     21     21     21     21     21     21
廣西壯族自治區       14     14     14     14     14     14     14     14     14
海南省                3      3      3      2      2      2      2      2      2
重慶市                0      0      0      0      0      0      0      0      0
四川省               21     21     21     21     21     21     21     21     21
貴州省                9      9      9      9      9      9      9      9      9
雲南省               16     16     16     16     16     16     16     16     16
西藏自治區            7      7      7      7      7      7      7      7      7
陝西省               10     10     10     10     10     10     10     10     10
甘肅省               14     14     14     14     14     14     14     14     14
青海省                8      8      8      8      8      8      8      8      8
寧夏回族自治區        5      5      5      5      5      5      5      5      5
新疆維吾爾自治區     14     14     14     14     14     14     14     14     14

獲取數據

當我們需要抓取大量數據時每次要話費很長時間,因此一次抓取所有可能需要的數據保存在本地電腦是一個不錯的選擇。結合cousera 上R Programming課程所學,寫了一個函數,通過指定抓取的指標和地域,可以實現批量保存數據。

getdata <- function(codeindex, postcode) {
  for (i in codeindex) {
    # 如果不存在指定文件夾則創建
    if (!file.exists(i)) {dir.create(i)}
    # 更改到指定文件夾
    setwd(paste("./", i, sep = ""))
    for (j in postcode) {
      # 獲取數據
      tempdata <- statscnQueryData(i, dbcode = 'fsnd', moreWd = list(name = 'reg', value = j))
      # 刷新數據時間跨度為20年
      tempdata <- statscnQueryLastN(20)
      # 保存文件
      write.csv(tempdata, paste(j, ".csv", sep = ""))
    }
    # 退回上級文件夾
    setwd("../")
  }
}

處理數據

我們通過數據抓取獲得了N多的數據,接下來還要通過函數來實現數據的清理。這裏清理的目標是:合並一個產業分類下所有地區的數據。具體的實現形式如下。

cleandata <- function(codeindex, postcode) {
  for (i in codeindex) {
    # 進入一個產業分類文件夾
    setwd(paste("./", i, sep = ""))

    # 創建一個空數據框
    lsdata <- data.frame()

    for (j in postcode) {
      # 讀取產業分類下一個地域數據
      lsdata1 <- read.csv(paste(j, ".csv", sep = ""), header = FALSE)
      # 轉置
      lsdata2 <- t(lsdata1)
      # 提取變量名
      rnames <- c("year",lsdata2[1,][-1])
      # 轉化為數據框
      lsdata3 <- as.data.frame(lsdata2[-1,], row.names = 1)
      # 賦值變量名
      names(lsdata3) <- rnames
      # 添加地域名變量
      lsdata3 <- mutate(lsdata3, 地域 = j)
      # 合並數據框
      lsdata <- rbind(lsdata, lsdata3)
    }
    # 進入清洗後數據保存的文件夾
    setwd("../cleaned")
    # 保存文件
    write.csv(lsdata, paste("cleaned", i, ".csv", sep = ""))
    # 退回上一級菜單
    setwd("../")
  }
}

獲取並清理數據

最後,我們可以指定所需要的產業代碼和地域代碼實現批量保存清理。例如:

datacode <- c("A0301", "A0302", ...)
postcode <- c("110000", "120000",...)
getdata(datacode, postcode)
cleandata(datacode, postcode)

對接所有文件

我們還可以通過一小段代碼實現所有文件對接。

setwd("c:/cleaned/")

# 遍曆文件夾
files <- dir(getwd())

# 先提取第一個文件讀取保存
files1 <- files[1]
alldata <- read.csv(files1, header = TRUE)
alldata <- alldata[,-1]

# 讀取剩下的文件並合並到第一個文件
for (i in files[-1] ) {
  lsdata2 <- read.csv(i, header = TRUE)
  lsdata3 <- lsdata2[,-1]
  alldata <- merge(alldata, lsdata3)
}

# 保存文件
write.csv(lsdata1, "dataall.csv")
# 列出前6個對象
head(lsdata1)

後記

通過兩個函數大大簡化了數據的獲取流程,但是感覺數據清理函數雖然可以達到目的,應該還有更加簡化的寫法,並且應該還可以引入通道的手法,進一步增加效率。

最後更新:2017-06-06 21:38:34

  上一篇:go  全棧新兵成長記,附贈校招三大錦囊
  下一篇:go  Docker企業版安裝指南