data analysis & visualization

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))

영웅문 가입은 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를 받은 뒤 아래와 같이 코딩합니다. 

 

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'))

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

확인

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

확인