지도 그림 그리기 예제
tistoryCJlibrary(ggmap)
register_google(key=구글키)
k=geocode('지역명')
k=mutate_geocode(data.frame(address=c('지역명'),stringsAsFactors = F),address)
extract=as.vector(apply(data.frame(geocode('지역명')),2,mean))
extract[2]=extract[2]+.02
map=get_googlemap(center=extract,maptype='roadmap',zoom=10,col='bw')
temp6=spTransform(temp6,CRS('+init=epsg:4326'))
temp6=cbind(coordinates(temp6),temp6@data)
#지도그림 배경 + 지적도
ggmap(map) + geom_polygon(data=shp2, aes(x=long, y=lat, group=group,fill=변수),alpha=1, color='black')+theme(
legend.position = c(.95, .95),legend.justification = c("right", "top"),legend.box.just = "right",legend.margin = margin(6, 6, 6, 6))
#지도 그림 배경 + 지적도
p=ggmap(map,data=temp6) +geom_polygon(data=shp, aes(x=long, y=lat, group=group),alpha=0, fill='white',color='black')
#지적도 + 점
p+ geom_point(data=temp6,aes(x=lon,y=lat,colour=get(paste0('결제시간', i,'시의 편차')),size=get(paste0('결제시간',i,' 시의 평균'))))+theme(plot.title=element_text(face="bold", size=30, vjust=2),
legend.position = c(.95, .95),legend.justification = c("right", "top"),
legend.box.just = "right",legend.margin = margin(6, 6, 6, 6))+
#지도 타이틀
ggtitle(paste0('결제시간대별 이용건 수(',i,'시)'))+
#범례 타이틀
labs(colour=paste0('결제시간', i,'시의 편차')) +
labs( size=paste0('결제시간',i,' 시의 평균')) +
#범위 설정
scale_size_continuous(limits = c(min(floor(temp6[,paste0('결제시간',i,' 시의 평균')]),na.rm=T),max(ceiling(temp6[,paste0('결제시간',i,' 시의 평균')]),na.rm=T))
,breaks=seq(min(floor(temp6[,paste0('결제시간',i,' 시의 평균')]),na.rm=T),max(ceiling(temp6[,paste0('결제시간',i,' 시의 평균')]),na.rm=T),len=5))+
scale_colour_continuous(limits = c(min(floor(temp6[,paste0('결제시간',i,'시의 편차')]),na.rm=T),max(ceiling(temp6[,paste0('결제시간',i,'시의 편차')]),na.rm=T)), breaks =
seq(min(floor(temp6[,paste0('결제시간',i,'시의 편차')]),na.rm=T),max(ceiling(temp6[,paste0('결제시간',i,'시의 편차')]),na.rm=T),len=5))+
guides(colour = guide_colorbar(order=1), size = guide_legend(order=2))
'그 외' 카테고리의 다른 글
인터넷 속도 올리기 (0) | 2020.02.01 |
---|---|
[R] 재미삼아 푸는 문제 (0) | 2020.01.15 |
[주식] 키움 영웅문 통한 주식 자료다운로드 (0) | 2019.11.11 |
인공지능, 머신러닝 그리고 데이터마이닝의 차이점 (0) | 2019.07.01 |
알고리즘 (0) | 2019.04.08 |
[주식] 키움 영웅문 통한 주식 자료다운로드
영웅문 가입은 https://wikidocs.net/2872를 참고하여 진행하였다.
목차
1. python 과 키움 API를 활용한 자료 다운로드
2. R을 활용한 자동화
아래는 python 을 통해 주식 분봉 자료를 다운로드 받는 코드이다.
import sys
from PyQt5.QtWidgets import *
from PyQt5.QAxContainer import *
from PyQt5.QtCore import *
import time
import os
import pandas as pd
class Kiwoom(QAxWidget):
def __init__(self):
super().__init__()
self._create_kiwoom_instance()
self._set_signal_slots()
def _create_kiwoom_instance(self):
self.setControl("KHOPENAPI.KHOpenAPICtrl.1")
def _set_signal_slots(self):
self.OnEventConnect.connect(self._event_connect)
self.OnReceiveTrData.connect(self._receive_tr_data)
def comm_connect(self):
self.dynamicCall("CommConnect()")
self.login_event_loop = QEventLoop()
self.login_event_loop.exec_()
def _event_connect(self, err_code):
if err_code == 0:
print("connected")
else:
print("disconnected")
self.login_event_loop.exit()
def get_code_list_by_market(self, market):
code_list = self.dynamicCall("GetCodeListByMarket(QString)", market)
code_list = code_list.split(';')
return code_list[:-1]
def get_master_code_name(self, code):
code_name = self.dynamicCall("GetMasterCodeName(QString)", code)
return code_name
def set_input_value(self, id, value):
self.dynamicCall("SetInputValue(QString, QString)", id, value)
def comm_rq_data(self, rqname, trcode, next, screen_no):
self.dynamicCall("CommRqData(QString, QString, int, QString", rqname, trcode, next, screen_no)
self.tr_event_loop = QEventLoop()
self.tr_event_loop.exec_()
def _comm_get_data(self, code, real_type, field_name, index, item_name):
ret = self.dynamicCall("CommGetData(QString, QString, QString, int, QString", code,
real_type, field_name, index, item_name)
return ret.strip()
def _get_repeat_cnt(self, trcode, rqname):
ret = self.dynamicCall("GetRepeatCnt(QString, QString)", trcode, rqname)
return ret
def _receive_tr_data(self, screen_no, rqname, trcode, record_name, next, unused1, unused2, unused3, unused4):
if next == '2':
self.remained_data = True
else:
self.remained_data = False
if rqname == "opt10081_req":
self._opt10081(rqname, trcode)
elif rqname =='opt10080_req':
self._opt10080(rqname, trcode)
try:
self.tr_event_loop.exit()
except AttributeError:
pass
def _opt10081(self, rqname, trcode):
data_cnt = self._get_repeat_cnt(trcode, rqname)
for i in range(data_cnt):
code= self._comm_get_data(trcode, "", rqname, i, "종목코드")
date = self._comm_get_data(trcode, "", rqname, i, "일자")
open = self._comm_get_data(trcode, "", rqname, i, "시가")
high = self._comm_get_data(trcode, "", rqname, i, "고가")
low = self._comm_get_data(trcode, "", rqname, i, "저가")
close = self._comm_get_data(trcode, "", rqname, i, "현재가")
volume = self._comm_get_data(trcode, "", rqname, i, "거래량")
self.ohlcv['code'].append(code)
self.ohlcv['date'].append(date)
self.ohlcv['open'].append(abs(int(open)))
self.ohlcv['high'].append(abs(int(high)))
self.ohlcv['low'].append(abs(int(low)))
self.ohlcv['close'].append(abs(int(close)))
self.ohlcv['volume'].append(abs(int(volume)))
def _opt10080(self, rqname, trcode):
data_cnt = self._get_repeat_cnt(trcode, rqname)
for i in range(data_cnt):
code= self._comm_get_data(trcode, "", rqname, i, "종목코드")
date = self._comm_get_data(trcode, "", rqname, i, "체결시간")
open = self._comm_get_data(trcode, "", rqname, i, "시가")
high = self._comm_get_data(trcode, "", rqname, i, "고가")
low = self._comm_get_data(trcode, "", rqname, i, "저가")
close = self._comm_get_data(trcode, "", rqname, i, "현재가")
volume = self._comm_get_data(trcode, "", rqname, i, "거래량")
self.ohlcv['code'].append(code)
self.ohlcv['date'].append(date)
self.ohlcv['open'].append(abs(int(open)))
self.ohlcv['high'].append(abs(int(high)))
self.ohlcv['low'].append(abs(int(low)))
self.ohlcv['close'].append(abs(int(close)))
self.ohlcv['volume'].append(abs(int(volume)))
#################
for switch in [0,1]:
if switch==0:
app = QApplication(sys.argv)
kiwoom = Kiwoom()
kiwoom.comm_connect()
code_list = kiwoom.get_code_list_by_market('10')
dic=[]
for x in code_list:
dic.append(kiwoom.get_master_code_name(x))
dic2=dict(zip(code_list,dic))
dic2
for x in code_list:
try:
if not(os.path.isdir('D:/주식/data/일봉/'+dic2[x])):
os.makedirs(os.path.join('D:/주식/data/일봉/'+dic2[x]))
except OSError as e:
if e.errno != errno.EEXIST:
print("Failed to create directory!!!!!")
raise
for x in code_list:
try:
if not(os.path.isdir('D:/주식/data/분봉/'+dic2[x])):
os.makedirs(os.path.join('D:/주식/data/분봉/'+dic2[x]))
except OSError as e:
if e.errno != errno.EEXIST:
print("Failed to create directory!!!!!")
raise
###########
if switch==1:
kiwoom.ohlcv = {'code':[],'date': [], 'open': [], 'high': [], 'low': [], 'close': [], 'volume': []}
a=0
t=0
aa=0
TR_REQ_TIME_INTERVAL = 0.35
for code in code_list:
if aa<1000:
t=t+1
filename=time.strftime('%Y%m%d', time.localtime(time.time()))+'.csv'
if (filename in os.listdir('D:/주식/data/분봉/'+dic2[code]))==False:
aa=aa+1
if aa==999:
break
time.sleep(1.5)
kiwoom.ohlcv = {'code':[],'date': [], 'open': [], 'high': [], 'low': [], 'close': [], 'volume': []}
kiwoom.set_input_value("종목코드", code)
kiwoom.set_input_value("기준일자", time.strftime('%Y%m%d', time.localtime(time.time())))
kiwoom.set_input_value("수정주가구분", 1)
kiwoom.comm_rq_data("opt10080_req", "opt10080", 0, "0101")
sys.stdout.write(str(dic2[code])+str(aa)+'\n')
sys.stdout.flush()
if aa<1000:
while kiwoom.remained_data == True:
aa=aa+1
if aa==999:
break
sys.stdout.write(str(dic2[code])+str(aa)+'\n')
sys.stdout.flush()
time.sleep(TR_REQ_TIME_INTERVAL)
kiwoom.set_input_value("종목코드", code)
kiwoom.set_input_value("기준일자", time.strftime('%Y%m%d', time.localtime(time.time())))
kiwoom.set_input_value("수정주가구분", 1)
kiwoom.comm_rq_data("opt10080_req", "opt10080", 2, "0101")
df = pd.DataFrame(kiwoom.ohlcv, columns=['date','code','open', 'high', 'low',
'close', 'volume'])
if len(df)!=0:
if a%5==0:
a=a+1
time.sleep(3)
df.to_csv('D:/주식/data/분봉/'+dic2[code]+'/'+filename,mode='w',index=False)
위의 파이썬 분봉자료의 경우 횟수 재한이 있어 자동화 하려면 추가 코드가 필요하다.
따라서 R에서 반복문을 활용하여 다운로드 받게 설정하였다.
library(rstudioapi)
myTerm <- rstudioapi::terminalCreate()
rstudioapi::terminalSend(myTerm, 'conda activate py36_32\n')
system('conda activate py36_32')
getwd()
while(T){
rstudioapi::terminalSend(myTerm, 'python C:/Users/cj/Desktop/code/miniteCode.py\n')
rstudioapi::terminalSend(myTerm, 'python C:/Users/cj/Desktop/code/miniteCode1.py\n')
rstudioapi::terminalSend(myTerm, 'python C:/Users/cj/Desktop/code/miniteCode_today.py\n')
}
'그 외' 카테고리의 다른 글
[R] 재미삼아 푸는 문제 (0) | 2020.01.15 |
---|---|
지도 그림 그리기 예제 (0) | 2019.11.11 |
인공지능, 머신러닝 그리고 데이터마이닝의 차이점 (0) | 2019.07.01 |
알고리즘 (0) | 2019.04.08 |
git 개념정리 (0) | 2019.03.19 |
[공공데이터 포털] 버스 정류소 API 가져오기
버스 정류소 API를 받으시려면 공공데이터 포털에서 버스 정류소를 검색!
먼저 버스 정류소 API를 받습니다.
API를 받은 뒤 아래와 같이 코딩합니다.
url='http://openapi.tago.go.kr/openapi/service/BusSttnInfoInqireService/getSttnNoList?serviceKey='
library(xml2);library(rvest);library(RCurl);library(XML)
# 도시 코드를 조회합니다.
url='http://openapi.tago.go.kr/openapi/service/BusSttnInfoInqireService/getCtyCodeList?serviceKey='
(raw.data <- xmlTreeParse(paste0(url,api), useInternalNodes = TRUE, encoding = "utf-8"))
#조회한 도시코드를 활용
url='http://openapi.tago.go.kr/openapi/service/BusSttnInfoInqireService/getSttnNoList?serviceKey='
raw.data <- xmlTreeParse(paste0(url,api,'&cityCode=도시코드&numOfRows=1'), useInternalNodes = TRUE, encoding = "utf-8")
rootNode <- xmlRoot(raw.data)
n=as.character(xmlSApply(rootNode[[2]][['totalCount']],xmlValue))
(raw.data <- xmlTreeParse(paste0(url,api,'&cityCode=37060&numOfRows=',n), useInternalNodes = TRUE, encoding = "utf-8"))
rootNode <- xmlRoot(raw.data)
items <- rootNode[[2]][['items']]
data=NULL
for(i in 1:xmlSize(rootNode[[2]][['items']])){
items_temp=xmlSApply(items[[i]],xmlValue)
lat=as.numeric(items_temp[[1]])
lon=as.numeric(items_temp[[2]])
id=items_temp[[3]]
nm=items_temp[[4]]
no=as.numeric(items_temp[[5]])
data=rbind(data,data.frame(lat,lon,id,nm,no))
}
data
#버스 노선정보 또한 같은방법으로
url='http://openapi.tago.go.kr/openapi/service/BusRouteInfoInqireService/getRouteNoList?serviceKey='
(raw.data <- xmlTreeParse(paste0(url,api,'&cityCode=37060&numOfRows=1'), useInternalNodes = TRUE, encoding = "utf-8"))
rootNode <- xmlRoot(raw.data)
(raw.data <- xmlTreeParse(paste0(url,api,'&cityCode=37060&numOfRows=',xmlSApply(rootNode[[2]][['totalCount']],xmlValue)), useInternalNodes = TRUE, encoding = "utf-8"))
rootNode <- xmlRoot(raw.data)
items <- rootNode[[2]][['items']]
xmlSize(rootNode[[2]][['items']])
data2=NULL
for(i in 1:xmlSize(rootNode[[2]][['items']])){
items_temp=xmlSApply(items[[i]],xmlValue)
df=data.frame(t(items_temp),stringsAsFactors = F)
df$endvehicletime=as.numeric(df$endvehicletime)
df$startvehicletime=as.numeric(df$startvehicletime)
data2=rbind(data2,df)
}
data2
#버스 경유지
url='http://openapi.tago.go.kr/openapi/service/BusRouteInfoInqireService/getRouteAcctoThrghSttnList?serviceKey='
data_list=list()
for(id in unique(data2$routeid)){
(raw.data <- xmlTreeParse(paste0(url,api,'&numOfRows=1&cityCode=37060&routeId=',id), useInternalNodes = TRUE, encoding = "utf-8"))
rootNode <- xmlRoot(raw.data)
n=xmlSApply(rootNode[[2]][['totalCount']],xmlValue)
(raw.data <- xmlTreeParse(paste0(url,api,'&numOfRows=',n,'&cityCode=37060&routeId=',id), useInternalNodes = TRUE, encoding = "utf-8"))
rootNode <- xmlRoot(raw.data)
items <- rootNode[[2]][['items']]
data3=NULL
for(i in 1:xmlSize(rootNode[[2]][['items']])){
items_temp=xmlSApply(items[[i]],xmlValue)
df=data.frame(t(items_temp),stringsAsFactors = F)
df$gpslati=as.numeric(df$gpslati)
df$gpslong=as.numeric(df$gpslong)
data3=rbind(data3,df)
}
data_list[[id]]=data3
}
library(data.table)
data3=rbindlist(data_list)
data3
'R' 카테고리의 다른 글
[ggmap] pie chart 그리기 예제 (0) | 2019.11.26 |
---|---|
ddply와 setDT 비교 (0) | 2019.11.11 |
숫자가 너무커서 제대로 안불러와질 때 (0) | 2019.09.16 |
apply 와 sapply의 차이 (0) | 2019.07.15 |
문자열 다루기와 텍스트 마이닝 (0) | 2019.07.07 |
숫자가 너무커서 제대로 안불러와질 때
read.csv('cjcjcjcj.csv',sep='|',header=T,colClasses = c('integer','character','numeric','numeric'))
'R' 카테고리의 다른 글
ddply와 setDT 비교 (0) | 2019.11.11 |
---|---|
[공공데이터 포털] 버스 정류소 API 가져오기 (0) | 2019.11.02 |
apply 와 sapply의 차이 (0) | 2019.07.15 |
문자열 다루기와 텍스트 마이닝 (0) | 2019.07.07 |
자신에게 맞게 R 최적화를 해보자. (0) | 2019.06.21 |
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.