data analysis & visualization

library(RMariaDB)

con <- dbConnect(
  drv = RMariaDB::MariaDB(), 
  username = 'ducj',
  password = 'whckdwp1!@', 
  host = NULL, 
  port = 3306,
  db = 'db'
)

dbListTables(con)

key='IQr2d9Wp84iZd8LWOvB2m3yW969idNg/uQh52nZVitgb6zpiM4h9QvOFD0xe3hko'
library(xml2);library(rvest);library(RCurl);library(XML);library(dplyr);library(rjson)

ASOS_read=function(dateCd='HR',startDt,startHh,endDt,endHh,stnlds,schListCnt,pageIndex,key){
  if(dateCd=="HR"){
  url=paste0('https://data.kma.go.kr/apiData/getData?type=json&dataCd=ASOS&dateCd=',dateCd,'&startDt=',startDt,'&startHh=',startHh,
             '&endDt=',endDt,'&endHh=',endHh,'&stnIds=',stnlds,'&schListCnt=',schListCnt,'&pageIndex=',pageIndex,'&apiKey=',key)}
  if(dateCd=='DAY'){
    url=paste0('https://data.kma.go.kr/apiData/getData?type=json&dataCd=ASOS&dateCd=',dateCd,'&startDt=',startDt,
               '&endDt=',endDt,'&stnIds=',stnlds,'&schListCnt=',schListCnt,'&pageIndex=',pageIndex,'&apiKey=',key)
  }
  bind_rows(fromJSON(paste0(suppressWarnings(readLines(url,encoding='UTF-8')),collapse = ''))[[4]]$info)
}

library(readr)
Info=read_csv('/home/ducj2/lotto/stnInfo_20191127191218.csv',locale = locale(encoding='cp949'))
colnames(Info)[c(1,2,3,4,6,7,8)]=c('STN_ID','startDate','endDate','stationName','lat','lon','alt')

# dbWriteTable(con, 'ASOSInfo',Info,overwrite=T)
dbListTables(con)
i=102

startDate=as.Date('2018-01-01')
endDate=as.Date('2018-12-31')
ls=list()
for(i in as.character(unique(Info$STN_ID))){
  message(i)
try(silent = T,{
temp=ASOS_read(dateCd='DAY',startDt=format(startDate,'%Y%m%d'),startHh = '',
endDt  =format(endDate,'%Y%m%d'),endHh='',
stnlds=i,schListCnt = 999,pageIndex = 1,key=key)
})
if(nrow(temp)>0)
if(nrow(Info)>1){
  temp_Info=Info[Info$STN_ID==i,]
  
  old=temp_Info[!is.na(temp_Info$endDate),'endDate']
  new=temp_Info[is.na(temp_Info$endDate),'startDate']

  temp2=rbind(left_join(temp[as.Date(temp$TM)<as.Date(old$endDate),],temp_Info[!is.na(temp_Info$endDate),c(1:4,6:8)],by='STN_ID'),
  left_join(temp[as.Date(temp$TM)>as.Date(new$startDate),],temp_Info[is.na(temp_Info$endDate),c(1:4,6:8)],by='STN_ID'))

}else temp2=left_join(temp,Info[Info$STN_ID==i,c(1:4,6:8)],by='STN_ID')
ls[[i]]=temp2
}

# dbWriteTable(con, 'ASOS_Dt',unique(bind_rows(ls)[,-grep('ISCS',colnames(bind_rows(ls)))]), overwrite = TRUE)
query='select * from ASOS_Dt'
colnames(dbGetQuery(con,query))

dbWriteTable(con, 'ASOS_Dt',unique(bind_rows(dbGetQuery(con,query),bind_rows(ls)[,-grep('ISCS',colnames(bind_rows(ls)))])), overwrite = TRUE)

dbWriteTable(con, paste0('ASOS_Dt_',format(Sys.Date(),'%Y%m%d')),left_join(bind_rows(ls),Info2[,c(1:4,6:8)],by='STN_ID'), overwrite = TRUE)

dbListTables(con)



주소를 위경도로 변환

공간정보 오픈 플랫폼에서 제공하는 위도, 경도를 주소로 변환하는 방법과 주소를 위도, 경도로 바꾸는 방법을 알아보고자 한다. 

 

공간정보오픈플랫폼

 


회원가입을 한 뒤 위와 같이 접속

 

좌표계 설정

 

요청 변수 설정

api key

key=''

#address
add=c('대구대','경주시 성건동') 

post=paste0('http://api.vworld.kr/req/address?service=address&request=getCoord&key=',key,
'&address=',add,'&type=road')

 

CRS 등 &CRS=EPSG:4326 처럼 추가로 입력하면 된다.

 

iconv는 인코딩을 변경하는 코드이며, URLencode는 URL에 맞게 변환하는 코드이다.

 

url=sapply((iconv(post, from = "cp949", to = "UTF-8")),URLencode) 
library(XML) 
library(rjson) 
url_query=sapply(url,function(x){readLines(x,encoding='UTF-8')}) 

data.frame(dplyr::rbind_list(lapply(
sapply(url_query,function(x){paste0(x,collapse = '')}),
function(x)data.frame(fromJSON(x)))))[,20:21] 

URL이 여러개 입력될 것을 고려하여 sapply를 사용하였다. 

readLines는 URL을 불러오는 코드이며, fromJSON을 통해 api를 리스트형식으로 받아올 수 있다.

 

위경도를 주소로 변환

lonlat을 '128.3,38.3'처럼 만들어 post에 입력

입력된 URL을 앞에서와 같이 json형식으로 받아옴.

lonlat=data.frame(dplyr::rbind_list(lapply(sapply(url_query,
function(x){paste0(x,collapse = '')}),
function(x)data.frame(fromJSON(x)))))[,20:21] 

lonlat=paste0(lonlat[,1],',',lonlat[,2]) 
post=paste0('http://api.vworld.kr/req/address?service=address&request=getAddress&key=',key,
'&point=',lonlat,'&type=road') 

url=sapply(iconv(post, from = "cp949", to = "UTF-8"),URLencode) 
library(XML) 
library(rjson) 
url_query=sapply(url,function(x){readLines(x,encoding='UTF-8')}) 
# url_query <- readLines(url,encoding='UTF-8') 

data.frame(dplyr::rbind_list(lapply(sapply(url_query,function(x){paste0(x,collapse = '')}),
function(x)data.frame(fromJSON(x))))) 



불러오는 중입니다...

 

 

공간정보 오픈플랫폼 오픈API

Geocoder API 2.0 레퍼런스 Geocoder API 2.0 레퍼런스입니다. API 버전 : Geocoder API 2.0 레퍼런스 Geocoder API 1.0 레퍼런스 소개 좌표를 주소로 변환하는 서비스를 제공합니다. 요청URL을 전송하면 지오코딩 서비스를 사용하실 수 있으며 일일 지오코딩 요청건수는 최대 30,000건 입니다. 단, API 요청은 실시간으로 사용하셔야 하며 별도의 저장장치나 데이터베이스에 저장할 수 없습니다. 좌표를 주소정보

www.vworld.kr

 

 

'R' 카테고리의 다른 글

[ggplot2] 시각화 정리  (0) 2019.12.08
[R][SQL] RMariaDB 외부 접속 설정하기  (0) 2019.11.29
[ggmap] pie chart 그리기 예제  (0) 2019.11.26
ddply와 setDT 비교  (0) 2019.11.11
[공공데이터 포털] 버스 정류소 API 가져오기  (0) 2019.11.02

library(ggplot2)
library(scatterpie)
library(maps)
set.seed(123)
long <- rnorm(50, sd=100)
lat <- rnorm(50, sd=50)
d <- data.frame(long=long, lat=lat)
d <- with(d, d[abs(long) < 150 & abs(lat) < 70,])
n <- nrow(d)
d$region <- factor(1:n)
d$A <- abs(rnorm(n, sd=1))
d$B <- abs(rnorm(n, sd=2))
d$C <- abs(rnorm(n, sd=3))
d$D <- abs(rnorm(n, sd=4))
d$radius <- 6 * abs(rnorm(n))
head(d)
world <- map_data('world')

p <- ggplot(world, aes(long, lat)) +
  geom_map(map=world, aes(map_id=region), fill=NA, color="black") +
  coord_quickmap()

p + geom_scatterpie(aes(x=long, y=lat, group=region, r=radius),
                    data=d, cols=LETTERS[1:4], color=NA, alpha=.8) +
geom_scatterpie_legend(d$radius, x=-160, y=-55)

먼저 python에서 

tf.GPUOptions(per_process_gpu_memory_fraction=0.333)

sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))

을 활용하면 메모리를 제한 할 수 있다.

 

config = tf.ConfigProto()

config.gpu_options.allow_growth = True 

session = tf.Session(config=config, ...)

을 활용하면 탄력적으로 메모리를 활용한다.

 

이제 R에서

gpu_options <- tf$GPUOptions(per_process_gpu_memory_fraction = 0.333)

config <- tf$ConfigProto(gpu_options = gpu_options)

 

config=tf$ConfigProto()
tf$Session(config=config)
gpu_options <- tf$GPUOptions(allow_growth = TRUE)
config <- tf$ConfigProto(gpu_options = gpu_options)
k_set_session(tf$Session(config = config))

 

을 활용하면 탄력적으로 메모리를 활용한다.

'딥러닝' 카테고리의 다른 글

전이학습(Transfer Learning)  (0) 2021.05.25
기울기 소실 문제와 ResNet  (0) 2021.05.25
순환신경망(1/3)  (0) 2021.04.11
tensorboard 외부접속  (0) 2020.11.27
CNN channel 1개와 3개의 성능비교(cats and dogs)  (0) 2019.06.18

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
import pandas as pd 
import datetime
import time
import os
times=20
while True:
    if(str(datetime.datetime.now())[11:13]=='10'):
        
        times=20
        print(times)
        if(not(str(datetime.datetime.now())[0:10].replace('-','')+'.csv' in os.listdir('G:/내 드라이브'))):
            times=50
            print(times)
            driver=webdriver.Chrome('c:/selenium/chromedriver')
            results=[]
            querylist=['홈페이지','플랫폼','포털','시스템','구축','빅데이터','산학협력','산학포털','LINC','업무지원','평생교육','솔루션']
            querylist2=['중앙신체검사소','한국감정원','한국교육학술정보원','한국산업단지공단','한국사학진흥재단','한국산업기술평가관리원','한국가스공사','신용보증기금','중앙119구조본부','한국정보화진흥원','중앙교육연수원','한국장학재단','대구경북첨단의료산업진흥재단','의료기술시험훈련원','한국뇌연구원','한의기술응용센터','한국도로공사','한국건설관리공사','교통안전공단','국립농산물품질관리원','농림축산검역본부','국립종자원','한국전력기술','대한법률구조공단','우정사업조달사무소','기상통신소','조달품질원','한국법무보호복지공단','에너지경제연구원','근로복지공단','노동부고객상담센터','한국산업인력공단','한국산업안전보건공단','국립재난안전연구원','한국동서발전','한국석유공사','한국에너지공단','한국토지주택공사','주택관리공단','한국시설안전공단','중소기업진흥공단','한국산업기술시험원','한국세라믹기술원','한국남동발전','한국승강기안전관리원','국방기술품질원','중앙관세분석소','한국저작권위원회','대구광역시','대구광역시교육청','대구광역시교육연구정보원','경상북도교육청','경상북도교육연구원','경상북도교육정보센터','국립대구과학관']
            n=len(querylist)*len(querylist2)
            t=0
            try:
                for query in querylist:
                    for query2 in querylist2:
                        t=t+1
                        driver.get('http://www.g2b.go.kr:8101/ep/tbid/tbidFwd.do')
                        
                        # 업무 종류 체크
            #            task_dict = {'용역': 'taskClCds5', '민간': 'taskClCds20', '기타': 'taskClCds4'}
            #            for task in task_dict.values():
            #                checkbox = driver.find_element_by_id(task)
            #                checkbox.click()
            
                        instNm=driver.find_element_by_id('instNm')
                        instNm.clear()
                        instNm.send_keys(query2)
                        instNm.send_keys(Keys.RETURN)
                        # 입찰정보 검색 페이지로 이동
                        
                        # 검색어
                        # id값이 bidNm인 태그 가져오기
                        bidNm = driver.find_element_by_id('bidNm')
                        # 내용을 삭제 (버릇처럼 사용할 것!)
                        bidNm.clear()
                        # 검색어 입력후 엔터
                        bidNm.send_keys(query)
                        bidNm.send_keys(Keys.RETURN)
                        # 검색 조건 체크
                        option_dict = {'검색기간 1달': 'setMonth1_1', '입찰마감건 제외': 'exceptEnd'}
                        for option in option_dict.values():
                            checkbox = driver.find_element_by_id(option)
                            checkbox.click()
                        # 목록수 100건 선택 (드롭다운)
                        recordcountperpage = driver.find_element_by_name('recordCountPerPage')
                        selector = Select(recordcountperpage)
                        selector.select_by_value('100')
                        # 검색 버튼 클릭
                        search_button = driver.find_element_by_class_name('btn_mdl')
                        search_button.click()
                        # 검색 결과 확인
                        elem = driver.find_element_by_class_name('results')
                        div_list = elem.find_elements_by_tag_name('div')
                        # 검색 결과 모두 긁어서 리스트로 저장
                        #results.append(query)
                        #if len(div_list)!=0:
                        #    results.append(query)
                        for div in div_list:
                            results.append(div.text)
                            a_tags = div.find_elements_by_tag_name('a')
                            if a_tags:
                                for a_tag in a_tags:
                                    link = a_tag.get_attribute('href')
                                    results.append(link)
                        # 검색결과 모음 리스트를 12개씩 분할하여 새로운 리스트로 저장 
                        #result = [results[i * 13:(i + 1) * 13] for i in range((len(results) + 13 - 1) // 13 )]
                        result = [results[i * 12:(i + 1) * 12] for i in range((len(results) + 12 - 1) // 12 )]
                        # 결과 출력
                        print(round(t/n*100,2))
                        #print(result)
            except Exception as e:
                # 위 코드에서 에러가 발생한 경우 출력
                print(e)
            finally:
                # 에러와 관계없이 실행되고, 크롬 드라이버를 종료
                driver.quit()
            
            
            my_df=pd.DataFrame(result)
            my_df.to_csv('G:/내 드라이브/test.csv',index=False,header=False,encoding='cp949')
            my_df.to_csv('G:/내 드라이브/'+str(datetime.datetime.now())[0:10].replace('-','')+'.csv',index=False,header=False,encoding='cp949')
    time.sleep(60*times)

'python > crawling' 카테고리의 다른 글

[Selenium] 기상자료 크롤링  (1) 2021.04.03
크롤링과 python  (0) 2021.04.03
python selenium 자주쓴거 정리  (0) 2020.03.23
나라장터 open api crawling  (0) 2020.03.01
selenium 사용해서 위경도 가져오기  (0) 2019.03.20

ddply와 setDT 비교

R2019. 11. 11. 01:59

속도로 보았을 때 ddply 보다 setDT의 속도가 월등히 빠르다. 이에 따라 예제 코드를 아래와 같이 제시한다. 

 

library(plyr)
data(iris)
temp=ddply(iris,.(Species),summarise,mean=mean(Sepal.Length))
temp=data.table::setDT(iris)[,.(mean=mean(Sepal.Length)),'Species']library(plyr)
data(iris)
temp=ddply(iris,.(Species),summarise,mean=mean(
Sepal.Length))
temp=data.table::setDT(iris)[,.(mean=mean(Sepal.Length)),'Species']

temp2=reshape2::melt(temp,id='Species')
library(ggplot2)
ggplot(temp2, aes(Species, value, fill=factor(Species)))+
  geom_bar(stat='identity', position = 'dodge')+coord_flip()