본문 바로가기
Notes

크롤링 일지 - KRX의 PER/PBR/배당수익률과 종목 업종분류시 중복...

by 올드뉴스 2023. 7. 23.

KRX에서 개별종목의 티커 정보를 구성하기 위해서 아래 2가지 정보를 취합해 크롤링을 했다.

 

업종분류 현황

 - http://data.krx.co.kr/contents/MDC/MDI/mdiLoader/index.cmd?menuId=MDC0201020506 

PER/PBR/배당수익률

 - http://data.krx.co.kr/contents/MDC/MDI/mdiLoader/index.cmd?menuId=MDC0201020502

 

DB에 저장 우선해서 PK 를 고려하지 않고 저장을 한 후에 인덱스를 주기위해서 테이블을 altering 하려는데 "2023-06-26" 일자에 중복된 데이터가 보였다.

 

-- 2601 건
SELECT COUNT(*) FROM tickers_kr WHERE 기준일 LIKE '2023-06-26%';

-- 2600건
SELECT COUNT(DISTINCT 종목코드) FROM tickers_kr WHERE 기준일 LIKE '2023-06-26%';

 

종목코드가 중복된 자료를 찾아 보았다.

SELECT 종목코드, COUNT(종목코드)  FROM tickers_kr 
	WHERE 기준일 LIKE '2023-06-26%'
	GROUP BY 종목코드
		HAVING COUNT(종목코드) > 1;

 

해당일에 "락"이 걸린 종목이 있다. 종목명에 "락"을 붙여 락업 등의 표현을 하는데 DataFrame 으로 2개의 정보를 결합시 새 row 를 만들고 있고 있었다... 

 

아직 완전히 데이터를 구축하는 단계는 아니라서 데이터가 그리 많지 않지만 전체 데이터에 대해서도 중복 처리를 해야 한다.


전체 데이터 중복 조사

SELECT MIN(기준일), MAX(기준일) FROM tickers_kr; -- 어느 범위 인지 

/* 일자별로 중복된게 문제이므로 기준일을 중심으로 group */
-- 중복이 나타난다. 개수를 세어보자.
SELECT 기준일, 종목코드, COUNT(*)  FROM tickers_kr 
	GROUP BY 기준일,종목코드
		HAVING COUNT(*) > 1;
		
-- 그룹한 전체 개수는
-- 개수 합이 42개 -> 21개 종목이 중복...
select SUM(K.CNT)
FROM 
	( SELECT 기준일, 종목코드, COUNT(*) CNT  FROM tickers_kr 
	GROUP BY 기준일,종목코드
		HAVING COUNT(*) > 1) AS K;

21개 종목에서 2개씩 중복되어 있다. 해당 중복한 종목 데이터 목록를 출력해 보자.

SELECT T.기준일, T.종목코드, T.종목명
FROM tickers_kr T, 
	( SELECT 기준일, 종목코드, COUNT(*)  FROM tickers_kr 
		GROUP BY 기준일,종목코드
		HAVING COUNT(*) > 1) as K
WHERE T.`기준일` = K.기준일 
	AND T.`종목코드` = K.종목코드	
ORDER BY 기준일, 종목코드;

 

검색한 종목의 패턴을 보니 "[락]" 또는 "(락)" 이 종목명에 포함되어 있다. 이 개수를 세고 중복한 목록의 개수와 비교한 후에 지워야 겠다.

-- '[락]' OR E '(락)' 을 찾아 보자.
-- 21개
select COUNT(*) from tickers_kr
WHERE 종목명 LIKE '%[락]' OR  종목명 LIKE '%(락)';

-- 종목명에  '[락]' OR E '(락)' 을 포함한 row 를 지우자...
SELECT * from tickers_kr
WHERE 종목명 LIKE '%[락]' OR  종목명 LIKE '%(락)';

delete from tickers_kr
WHERE 종목명 LIKE '%[락]' OR  종목명 LIKE '%(락)';

 


오늘의 배운점.

 

1. DB table 은 확실히 constraints 를 선언하자.

2. 중복 점검을 꼭 하자.

 

 

728x90

댓글