顯示具有 資料處理 標籤的文章。 顯示所有文章
顯示具有 資料處理 標籤的文章。 顯示所有文章

2016年9月10日 星期六

Python學習筆記_資料處理(如何存取OpenData)

之前同事賴姐問我mongodb,原因是他收到的資料是JSON格式,於是乎我推薦了她C#的JSON.NET,只是事情永遠都是那麼巧合,過沒幾天我發現之前用的UBIKE網址是舊的,而新的網址的內容使用R語言去解析相當的困難,時間又來不及。
資料內容長這樣

有沒有又快又彈性的方式呢?我想了一下,想到Python這個玩意,於是在網路上Google一下,發現這篇,喔耶,於是小弟拿了他的程式改了一下,其中最麻煩的地方是小弟的版本已經是Python3.4了,而且又是在Windows上執行,所以有遇到轉碼的問題,'cp950' codec can't encode character 'OOXX' in position.... 。小弟花費了一些時間處理轉碼問題並將資料轉入資料庫,果然是吉人自有天相呀!^^
小弟的流程如下,先使用urllib.request套件將資料下載本地端,在使用pypyodbc套件將資料傳入資料庫。
#getBike.py 
#!/usr/bin/env python
import urllib.request
import gzip
import json
import sys
import pypyodbc
#from pprint import pprint
url = "http://data.taipei/youbike"
urllib.request.urlretrieve(url, "YouBikeTP.gz")
f = gzip.open('YouBikeTP.gz', 'r')
#先轉碼,處理編碼問題(CP950)
jdata = f.read().decode('utf-8').encode(sys.stdin.encoding, 'replace').decode(sys.stdin.encoding)
f.close()
data = json.loads(jdata)
connection = pypyodbc.connect(r'Driver={SQL Server};Server=.;Database=OpenDataDB;Trusted_Connection=yes;')
cursor = connection.cursor()
for key,value in data["retVal"].items():
    sno = value["sno"]
    sna = value["sna"]
    tot = value["tot"]
    sbi = value["sbi"]
    sarea = value["sarea"]
    mday = value["mday"]
    lat = value["lat"]
    lng = value["lng"]
    ar = value["ar"]
    sareaen = value["sareaen"]
    snaen = value["snaen"]
    aren = value["aren"]
    bemp = value["bemp"]
    act = value["act"]
    cursor.execute("insert into tempTabUbike values (?,?,?,?,?,?,?,?,?,?,?,?,?,?)", (sno,sna,tot,sbi,sarea,mday,lat,lng,ar,sareaen,snaen,aren,bemp,act))
connection.commit()
connection.close()

有圖有真相

搞定收工!^^
PS:寫這篇希望有幫到賴姐!

2016年9月7日 星期三

R學習筆記_資料處理(簡易的網路爬蟲 )

會使用到網路爬蟲,完全是因為驗證專案功能而想到的腳本。
因為WEB上的資料是非結構化資料又看到有人在網路上玩網路爬蟲,小弟就Google一下,發現rvest這個套件,使用起來真是簡單易懂呀,
對我而言它可以讀取HTML Tag與CSS,而且搜尋DOM物件的方式跟JQuery一模一樣,實在是神兵利器呀!於是小弟就手癢做了以下的測試。

下圖是小弟的資料來源網頁


使用rvest擷取網頁新聞的報導日期與標題
library(rvest)
news_url <- "http://news.ltn.com.tw/search?keyword=ubike&conditions=and&SYear=2016&SMonth=9&SDay=1&EYear=2016&EMonth=9&EDay=7"
dsTitle <- html(news_url) %>% html_nodes("#newslistul li a") %>% html_text()
dsDate <- html(news_url) %>% html_nodes("#newslistul li span") %>% html_text()
my_news <- data.frame(date = dsDate,title = dsTitle)
View(my_news)


執行結果如下圖,搞定收工



感想:R的rvest真是好物一枚呀,同時也見證了R套件的強大,當然小弟做這個測試除了擷取網路上的資料之外,還會利用工具串聯資料,讓資料會說話,阿~只能說資料好好玩喔!

2016年9月2日 星期五

R學習筆記_資料處理(如何將資料讀取與寫入資料庫_以SQL SERVER為例)

應用案例:承接上一個學習筆記,我們讀取U-Bike的Open Data到R,然而實務上在進行資料視覺化(就是報表或儀表板)我們會累積一定時間的資料量,此種情境建議將資料存入到資料庫。所以我就模擬了一個情境,將從網路上讀取U-Bike資料後,再將資料匯入到SQL SERVER。
首先將從台北市政府的OpenData讀取到R
#安裝packages:jsonlite與curl
install.packages("jsonlite", repos="http://cran.r-project.org")
install.packages('curl')
#匯入library:jsonlite
library(jsonlite)
#讀取UBike並轉回DataFream格式
dataUBike <- fromJSON("http://data.taipei/opendata/datalist/apiAccess?scope=resourceAquire&rid=ddb80380-f1b3-4f8e-8016-7ed9cba571d5")
在資料庫建立TABLE
USE [OpenDataDB]
GO
DROP TABLE [dbo].[tabUbike]
GO
CREATE TABLE [dbo].[tabUbike](
 [sno] [int] NULL,
 [sna] [varchar](30) NULL,
 [tot] [int] NULL,
 [sbi] [int] NULL,
 [sarea] [varchar](10) NULL,
 [mday] [varchar](20) NULL,
 [lat] [decimal](13, 10) NULL,
 [lng] [decimal](13, 10) NULL,
 [ar] [varchar](100) NULL,
 [sareaen] [varchar](20) NULL,
 [snaen] [varchar](100) NULL,
 [aren] [varchar](100) NULL,
 [bemp] [int] NULL,
 [act] [bit] NULL
) ON [PRIMARY]
GO
將讀取的資料寫入SQL SERVER
#將讀取的資料寫入SQL SERVER
library(RODBC)
conn <- odbcDriverConnect('driver={SQL Server};server=.;database=OpenDataDB;trusted_connection=true')
df <- dataUBike$result$results[c("sno","sna","tot","sbi","sarea","mday","lat","lng","ar","sareaen","snaen","aren","bemp","act")]
sqlSave(conn, df, tablename = "tabUbike", rownames=FALSE, append=TRUE)
close(conn);
查詢資料庫驗證資料庫寫入成功
另外也可以透過R從資料庫讀取資料。
#將讀取的資料寫入SQL SERVER
conn <- odbcDriverConnect('driver={SQL Server};server=.;database=OpenDataDB;trusted_connection=true')
data <- sqlQuery(conn, "SELECT * FROM tabUbike");
close(conn);

2016年8月26日 星期五

R學習筆記_資料處理(如何存取OpenData)

最近公司的案子剛好需要進行POC,於是小弟想了想認為使用U-Bike這個案例比較貼近大眾的生活,大家比較有共鳴。 小弟是這樣想的,我想要使用視覺化工具POWER BI(PS:小弟其實蠻喜歡與習慣使用T牌的BI工具)將U-Bike的資料進行視覺化。 要將資料視覺化第一步就是要把資料塞到視覺化工具,但U-Bike可是OpenData耶~那怎麼半呢? 實不相瞞小弟很想寫.NET Code,但想想居然下定要學R了,只好硬著頭皮Google方法,結果居然讓我找到了,而且方法還很簡單。 首先就是下載jsonlite這個套件,然後使用fromJSON將OpenData轉成data frame,接著這些資料你用怎麼使用就怎麼使用,小弟我是把它寫入到CSV檔。
#安裝packages:jsonlite與curl
install.packages("jsonlite", repos="http://cran.r-project.org")
install.packages('curl')
#匯入library:jsonlite
library(jsonlite)
#下載UBike的JSON檔案
dataUBike <- fromJSON("http://data.taipei/opendata/datalist/apiAccess?scope=resourceAquire&rid=ddb80380-f1b3-4f8e-8016-7ed9cba571d5")
#檢視資料欄位與內容
names(dataUBike$result$results)
head(dataUBike$result$results,10)
#將資料匯出成CSV
write.csv(dataUBike$result$results, file = "dataUBike.csv")
程式碼內容~有圖有真相
執行結果
使用POWER BI呈現 參考網址

2016年5月1日 星期日

R學習筆記_資料處理(存取DataFrame)

新增欄位(Add Column)
prodinfor #檢視新增前的DataFrame
prodinfor$count <- c(2,7,3,10,33) #新增count 欄位
prodinfor #檢視新增後的DataFrame
新增資料(Insert Record)
Months <- c("August")
ProductRevenue <- c(700)
count <- c(50)
Prodinfor2 <- data.frame(Months, ProductRevenue, count) 
prodinforAll <- rbind(prodinfor, Prodinfor2)
prodinforAll
修改資料(Update Record)
prodinfor$ProductRevenue[1] <- 50
prodinfor
DataFrame合併(類似SQL的Join)
Months <- c("Mar","Apr","May","Jun","Jul","August")
IntMonths <- c("3","4","5","6","7","8")
dfMonth <- data.frame(Months, IntMonths)
prodinforMerge <- merge(prodinfor, dfMonth, by = "Months")
prodinforMerge
刪除Column(Drop Column)
prodinforMerge$IntMonths = NULL
prodinforMerge
刪除Record(Delete Record)
prodinforMerge <- prodinforMerge[-1, , ]
prodinforMerge

2016年4月30日 星期六

R學習筆記_資料處理(讀取DATAFRAME)

問題一:如何讀取DATAFRAME ANS:
prodinfor
問題二:如何讀取DATAFRAME欄位資料 ANS:
prodinfor[-1] #讀取除了第一個欄位之外的資料
prodinfor[,2] #讀取第二個欄位
prodinfor[,"ProdRev"] #讀取欄位ProdRev之內容
prodinfor$ProdRev #讀取欄位ProdRev之內容
問題三:如何讀取第N筆資料 ANS:
prodinfor[1,] #讀取第一筆資料
prodinfor[5,] #讀取第五筆資料
prodinfor[2:5,] #讀取第二到五筆資料
prodinfor[c(1,3,5),] #讀取第一、三、五筆資料
prodinfor[2:5, "ProdRev"] #讀取欄位ProdRev的第二到五筆資料
問題四:如何使用條件進行Filter ANS:
pro <- subset(prodinfor,prodinfor$ProductRevenue > 80 ) #讀取ProductRevenue大於80之資料
pro #檢視資料內容
prodinfor[prodinfor$ProductRevenue < 50 ,] #讀取ProductRevenue小於50之資料

R學習筆記(維護DATAFRAME)

1. 建立DATAFRAME
ProductRevenue <- c(70,120,280,30,410) 
Months <- c("Mar","Apr","May","Jun","Jul")
prodinfor <- data.frame(Months,ProductRevenue)
prodinfor
2. 檢視columnName
colnames(prodinfor)
3. 檢視RowName
row.names(prodinfor)
4. 修改一個欄位
colnames(prodinfor)[1] <- "M"
colnames(prodinfor)
5. 修改兩個欄位
colnames(prodinfor) <- c("Month" , "ProdRev")
colnames(prodinfor)

2016年4月24日 星期日

R學習筆記_資料結構(DataFrame)

什麼是data frame?

由於VectorArray所儲存的資料類型都是一致的,如果要儲存不同資料類型的資料則使用data frame可以達成目的。可以把data Frame想成資料庫中的Table或是Excel,其欄位(Column)可以儲存不同變數類型的資料。

此外當R讀取檔案(CSVExcel)或資料庫等內容時,通常使用data frame存取這類的外部資料

如何建立data frame?

使用data.frame這個函數。

1. 以下為範例程式碼:
age <- c(19, 24, 20, 25, 20)
name <- c("Ryo", "William", "Amy", "Terry", "Lisa")
gender <- c("M", "M", "F", "M", "F")
country <- c("Taiwan", "America", "Japan", "Japan", "Taiwan")
people <- data.frame(age, name, gender, country)
View(people)

2. 執行結果如下: