프로그래밍 언어/Python

종목별 시가총액 데이터 수집하기 - 데이터 정제하기

· 코딩마이데이

웹 환경에서 수집한 데이터는 정제가 필요합니다. 이런 작업에는 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