종목별 시가총액 데이터 수집하기 - 데이터 정제하기
웹 환경에서 수집한 데이터는 정제가 필요합니다. 이런 작업에는 pandas 패키지를 사용하는 것이 적합합니다.
앞서 수집한 데이터는 header와 body가 키고, 각 키에 리스트 타입의 값이 짝지어진 딕셔너리 타입입니다. 딕셔너리를 pandas 패키지의 데이터프레임으로 변환하고 데이터프레임에서 불필요한 행과 열, 공백 문자를 삭제하겠습니다.
비주얼 스튜디오 코드에서 새로운 파일을 만들고, 파일 명을 'step_1_4.py'로 자정합니다. 다음 코드를 입력한 뒤 대화형 창에서 실행합니다. 앞서 수집한 데이터가 CSV 파일로 저장됩니다.
import json
from pathlib import Path
import pandas as pd
from step_1_1 import OUT_DIR # 이전에 작성한 모듈을 불러옵니다.
from step_1_3 import OUT_1_3
def clean_white_space(text: str) -> str: # 07
return " ".join(text.split()) # 공백 문자 정제 # 08
def table_to_data_frame(header: list, body: list) -> pd.DataFrame: # 10
df_raw = pd.DataFrame(body, columns=header) # DataFrame 객체 생성 # 11
df_raw = df_raw.dropna(how="any") # 하나의 열이라도 데이터가 없으면 행 삭제 # 12
df_raw = df_raw.iloc[:, :-1] # 마지막 열 삭제 # 13
for col in df_raw.columns: # 14
df_raw[col] = df_raw[col].apply(clean_white_space) # 열별로 공백 문자 정제 # 15
return df_raw
if __name__ == "__main__":
parsed = json.loads(OUT_1_3.read_text(encoding="utf-8")) # JSON 파일 불러오기 # 19
header, body = parsed["header"], parsed["body"]
df_raw = table_to_data_frame(header, body) # 21
df_raw.to_csv(OUT_DIR / f"{Path(__file__).stem}.csv", index=False)
07 공백 문자를 처리하는 함수 clean_white_space()를 정의합니다.
08 함수 split()를 사용하여 문자열을 공백을 기준으로 분리한 후, 함수 join()를 사용하여 재결합합니다.
10 주어진 시가총액 데이터를 정제한 후, pandas 패키지의 DataFrame 객체로 반환하는 함수 table_to_dataframe()을 정의합니다.
11 DataFrame 객체를 생성합니다. 이때 첫 번째 입력값으로 body를 전달하고, 매개변수 columns에 리스트 header를 전달하여 헤더를 설정합니다.
12 DataFrame 객체의 함수 dropna()를 실행하여 비어 있는 행을 제거합니다. 매개변수 how에 'any'를 전달하면 하나의 열이라도 빈 행을 삭제하고, 'all'을 전다라면 모든 열의 데이터가 없는 행을 삭제합니다.
13 슬라이싱을 활용하여 마지막 열을 삭재합니다.
14~15 DataFrame 객체의 columns 속성과 apply() 함수를 사용하여 열별로 공백 문자를 처리합니다.
19 함수 json 패키지의 loads()를 사용하여 OUT_1_3 경로의 JSON 파일을 불러옵니다. OUT_1_3 경로 객체의 read_text() 함수는 해당 경로의 파일을 문자열로 반환합니다.
21 함수 table_to_dataframe()를 사용하여 시가총액 데이터를 DataFrame 객체로 변환합니다.
코드를 실행하면 'output' 폴더에 'step_1_4.csv' 파일이 생성됩니다. 바주얼 스튜디오 코드에서 이 파일을 열면 디음과 같이 빈 셀 없이 잘 정제된 CSV 파일을 볼 수 있습니다.
| N,종목명,현재가,전일비,등락률,액면가,시가총액,상장주식수,외국인비율,거래량,PER,ROE 1,삼성전자,"197,200","상승 4,200",+2.18%,100,"11,673,526","5,919,638",51.00,"11,168,977",30.04,10.85 2,SK하이닉스,"996,000","상승 45,000",+4.73%,"5,000","7,098,516","712,702",54.60,"1,860,388",20.31,31.06 3,삼성전자우,"138,100","상승 2,000",+1.47%,100,"1,126,861","815,975",77.33,"1,893,310",21.04,N/A 4,현대차,"518,000","하락 5,000",-0.96%,"5,000","1,060,645","204,758",30.40,"687,854",13.02,12.43 5,LG에너지솔루션,"412,000","상승 16,000",+4.04%,500,"964,080","234,000",4.68,"366,902",-110.10,-4.93 |
'프로그래밍 언어 > Python' 카테고리의 다른 글
| 페이지 이동 자동화하기 - 전체 데이터 수집하기 (0) | 2026.03.05 |
|---|---|
| 페이지 이동 자동화하기 - 총 페이지 개수 확인하기 (1) | 2026.03.02 |
| 종목별 시가총액 데이터 수집하기 - 종목별 시가총액 데이터 수집하기(2) (0) | 2026.02.24 |
| 종목별 시가총액 데이터 수집하기 - 종목별 시가총액 데이터 수집하기(1) (1) | 2026.02.21 |
| 종목별 시가총액 데이터 수집하기 - 파이썬 패키지 준비하기 (0) | 2026.02.18 |